19762338dSopenharmony_ci/*
29762338dSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49762338dSopenharmony_ci * you may not use this file except in compliance with the License.
59762338dSopenharmony_ci * You may obtain a copy of the License at
69762338dSopenharmony_ci *
79762338dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89762338dSopenharmony_ci *
99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129762338dSopenharmony_ci * See the License for the specific language governing permissions and
139762338dSopenharmony_ci * limitations under the License.
149762338dSopenharmony_ci */
159762338dSopenharmony_ci
169762338dSopenharmony_ci#include "hdi_test_layer.h"
179762338dSopenharmony_ci#include <unistd.h>
189762338dSopenharmony_ci#include "hdi_test_device.h"
199762338dSopenharmony_ci#include "v1_0/include/idisplay_buffer.h"
209762338dSopenharmony_ci#include "v1_0/display_buffer_type.h"
219762338dSopenharmony_ci#include "v1_1/display_composer_type.h"
229762338dSopenharmony_ci
239762338dSopenharmony_cinamespace OHOS {
249762338dSopenharmony_cinamespace HDI {
259762338dSopenharmony_cinamespace Display {
269762338dSopenharmony_cinamespace TEST {
279762338dSopenharmony_ciusing namespace OHOS::HDI::Display::Buffer::V1_0;
289762338dSopenharmony_ciusing namespace OHOS::HDI::Display::Composer::V1_1;
299762338dSopenharmony_ci
309762338dSopenharmony_ciHdiGrallocBuffer::HdiGrallocBuffer(uint32_t seqNo, uint32_t w, uint32_t h, Composer::V1_0::PixelFormat fmt)
319762338dSopenharmony_ci{
329762338dSopenharmony_ci    std::shared_ptr<IDisplayBuffer> gralloc = HdiTestDevice::GetInstance().GetGrallocInterface();
339762338dSopenharmony_ci    AllocInfo info = { 0 };
349762338dSopenharmony_ci    info.width = w;
359762338dSopenharmony_ci    info.height = h;
369762338dSopenharmony_ci    info.usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE;
379762338dSopenharmony_ci    info.format = fmt;
389762338dSopenharmony_ci
399762338dSopenharmony_ci    BufferHandle* buffer = nullptr;
409762338dSopenharmony_ci    int ret = gralloc->AllocMem(info, buffer);
419762338dSopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
429762338dSopenharmony_ci        DISPLAY_TEST_LOGE("can not alloc memory");
439762338dSopenharmony_ci    }
449762338dSopenharmony_ci    if (buffer != nullptr) {
459762338dSopenharmony_ci        void* vaddr = gralloc->Mmap(*buffer);
469762338dSopenharmony_ci        if (vaddr == nullptr) {
479762338dSopenharmony_ci            DISPLAY_TEST_LOGE("mmap failed");
489762338dSopenharmony_ci        }
499762338dSopenharmony_ci        buffer_ = buffer;
509762338dSopenharmony_ci        seqNo_ = seqNo;
519762338dSopenharmony_ci    }
529762338dSopenharmony_ci}
539762338dSopenharmony_ci
549762338dSopenharmony_ciHdiGrallocBuffer::~HdiGrallocBuffer()
559762338dSopenharmony_ci{
569762338dSopenharmony_ci    if (buffer_ != nullptr) {
579762338dSopenharmony_ci        std::shared_ptr<IDisplayBuffer> gralloc = HdiTestDevice::GetInstance().GetGrallocInterface();
589762338dSopenharmony_ci        if (buffer_->virAddr != nullptr) {
599762338dSopenharmony_ci            int ret = gralloc->Unmap(*buffer_);
609762338dSopenharmony_ci            if (ret != DISPLAY_SUCCESS) {
619762338dSopenharmony_ci                DISPLAY_TEST_LOGE("can not ummap buffer handle");
629762338dSopenharmony_ci            }
639762338dSopenharmony_ci        }
649762338dSopenharmony_ci        gralloc->FreeMem(*buffer_);
659762338dSopenharmony_ci        buffer_ = nullptr;
669762338dSopenharmony_ci    }
679762338dSopenharmony_ci    if (mReleaseFence != -1) {
689762338dSopenharmony_ci        close(mReleaseFence);
699762338dSopenharmony_ci    }
709762338dSopenharmony_ci}
719762338dSopenharmony_ci
729762338dSopenharmony_civoid HdiGrallocBuffer::SetReleaseFence(int fd)
739762338dSopenharmony_ci{
749762338dSopenharmony_ci    DISPLAY_TEST_LOGE("the fd is %{public}d", fd);
759762338dSopenharmony_ci    if (mReleaseFence != -1) {
769762338dSopenharmony_ci        close(mReleaseFence);
779762338dSopenharmony_ci        mReleaseFence = -1;
789762338dSopenharmony_ci    }
799762338dSopenharmony_ci}
809762338dSopenharmony_ci
819762338dSopenharmony_civoid HdiGrallocBuffer::SetAcquirceFence(int fd)
829762338dSopenharmony_ci{
839762338dSopenharmony_ci    DISPLAY_TEST_LOGE("the fd is %{public}d", fd);
849762338dSopenharmony_ci    mAcquireFence = fd;
859762338dSopenharmony_ci}
869762338dSopenharmony_ci
879762338dSopenharmony_ciint32_t HdiGrallocBuffer::SetGraphicBuffer(std::function<int32_t (const BufferHandle*, uint32_t)> realFunc)
889762338dSopenharmony_ci{
899762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN(buffer_ == nullptr, DISPLAY_FAILURE,
909762338dSopenharmony_ci        DISPLAY_TEST_LOGE("buffer handle is null"));
919762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN(seqNo_ == UINT32_MAX, DISPLAY_FAILURE,
929762338dSopenharmony_ci        DISPLAY_TEST_LOGE("seqNo is invalid"));
939762338dSopenharmony_ci
949762338dSopenharmony_ci    int32_t ret = DISPLAY_SUCCESS;
959762338dSopenharmony_ci    if (cacheValid_ == false) {
969762338dSopenharmony_ci        ret = realFunc(buffer_, seqNo_);
979762338dSopenharmony_ci        cacheValid_ = (ret == DISPLAY_SUCCESS) ? true : false;
989762338dSopenharmony_ci    } else {
999762338dSopenharmony_ci        ret = realFunc(nullptr, seqNo_);
1009762338dSopenharmony_ci    }
1019762338dSopenharmony_ci    return ret;
1029762338dSopenharmony_ci}
1039762338dSopenharmony_ci
1049762338dSopenharmony_ciHdiGrallocBuffer* HdiTestLayer::AcquireBackBuffer()
1059762338dSopenharmony_ci{
1069762338dSopenharmony_ci    if (!backBuffers_.empty()) {
1079762338dSopenharmony_ci        if (currentBuffer_ != nullptr) {
1089762338dSopenharmony_ci            frontBuffers_.emplace(std::move(currentBuffer_));
1099762338dSopenharmony_ci        }
1109762338dSopenharmony_ci        currentBuffer_ = std::move(backBuffers_.front());
1119762338dSopenharmony_ci        backBuffers_.pop();
1129762338dSopenharmony_ci    }
1139762338dSopenharmony_ci    return currentBuffer_.get();
1149762338dSopenharmony_ci}
1159762338dSopenharmony_ci
1169762338dSopenharmony_ciHdiGrallocBuffer* HdiTestLayer::GetFrontBuffer() const
1179762338dSopenharmony_ci{
1189762338dSopenharmony_ci    HdiGrallocBuffer* buffer = nullptr;
1199762338dSopenharmony_ci    if (!frontBuffers_.empty()) {
1209762338dSopenharmony_ci        buffer = frontBuffers_.front().get();
1219762338dSopenharmony_ci    }
1229762338dSopenharmony_ci    return buffer;
1239762338dSopenharmony_ci}
1249762338dSopenharmony_ci
1259762338dSopenharmony_ciHdiGrallocBuffer* HdiTestLayer::GetBackBuffer() const
1269762338dSopenharmony_ci{
1279762338dSopenharmony_ci    HdiGrallocBuffer* buffer = nullptr;
1289762338dSopenharmony_ci    if (!backBuffers_.empty()) {
1299762338dSopenharmony_ci        buffer = backBuffers_.front().get();
1309762338dSopenharmony_ci    }
1319762338dSopenharmony_ci    return buffer;
1329762338dSopenharmony_ci}
1339762338dSopenharmony_ci
1349762338dSopenharmony_ciHdiTestLayer::HdiTestLayer(LayerInfo& info, uint32_t id, uint32_t displayId)
1359762338dSopenharmony_ci    : id_(id), displayID_(displayId), layerBufferCount_(MAX_BUFFER_COUNT), layerInfo_(info)
1369762338dSopenharmony_ci{}
1379762338dSopenharmony_ci
1389762338dSopenharmony_cistatic uint32_t GenerateSeq()
1399762338dSopenharmony_ci{
1409762338dSopenharmony_ci    static uint32_t originSeq = 0;
1419762338dSopenharmony_ci    return originSeq++;
1429762338dSopenharmony_ci}
1439762338dSopenharmony_ci
1449762338dSopenharmony_ciint32_t HdiTestLayer::Init(uint32_t bufferCount)
1459762338dSopenharmony_ci{
1469762338dSopenharmony_ci    // init the font queue
1479762338dSopenharmony_ci    DISPLAY_TEST_LOGE();
1489762338dSopenharmony_ci    layerBufferCount_ = bufferCount;
1499762338dSopenharmony_ci    for (uint32_t i = 0; i < layerBufferCount_; i++) {
1509762338dSopenharmony_ci        std::unique_ptr<HdiGrallocBuffer> buffer =
1519762338dSopenharmony_ci            std::make_unique<HdiGrallocBuffer>(GenerateSeq(),
1529762338dSopenharmony_ci            layerInfo_.width, layerInfo_.height, layerInfo_.pixFormat);
1539762338dSopenharmony_ci        DISPLAY_TEST_CHK_RETURN((buffer->Get() == nullptr), DISPLAY_FAILURE,
1549762338dSopenharmony_ci            DISPLAY_TEST_LOGE("buffer handle is null"));
1559762338dSopenharmony_ci        frontBuffers_.emplace(std::move(buffer));
1569762338dSopenharmony_ci    }
1579762338dSopenharmony_ci    displayRect_.w = layerInfo_.width;
1589762338dSopenharmony_ci    displayRect_.h = layerInfo_.height;
1599762338dSopenharmony_ci    cropRect_ = displayRect_;
1609762338dSopenharmony_ci    return DISPLAY_SUCCESS;
1619762338dSopenharmony_ci}
1629762338dSopenharmony_ci
1639762338dSopenharmony_ci
1649762338dSopenharmony_ciint32_t HdiTestLayer::SwapFrontToBackQ()
1659762338dSopenharmony_ci{
1669762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((frontBuffers_.empty()), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("the font buffer is empty"));
1679762338dSopenharmony_ci    backBuffers_.emplace(std::move(frontBuffers_.front()));
1689762338dSopenharmony_ci    frontBuffers_.pop();
1699762338dSopenharmony_ci    return DISPLAY_SUCCESS;
1709762338dSopenharmony_ci}
1719762338dSopenharmony_ci
1729762338dSopenharmony_ciint32_t HdiTestLayer::SwapBackToFrontQ()
1739762338dSopenharmony_ci{
1749762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((backBuffers_.empty()), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("the font buffer is empty"));
1759762338dSopenharmony_ci    frontBuffers_.emplace(std::move(backBuffers_.front()));
1769762338dSopenharmony_ci    backBuffers_.pop();
1779762338dSopenharmony_ci    return DISPLAY_SUCCESS;
1789762338dSopenharmony_ci}
1799762338dSopenharmony_ci
1809762338dSopenharmony_civoid HdiTestLayer::SetLayerPosition(const IRect& rect)
1819762338dSopenharmony_ci{
1829762338dSopenharmony_ci    DISPLAY_TEST_LOGE("x : %{public}d y : %{public}d w : %{public}d h : %{public}d", rect.x, rect.y, rect.w, rect.h);
1839762338dSopenharmony_ci    displayRect_ = rect;
1849762338dSopenharmony_ci}
1859762338dSopenharmony_ci
1869762338dSopenharmony_civoid HdiTestLayer::SetLayerCrop(const IRect& rect)
1879762338dSopenharmony_ci{
1889762338dSopenharmony_ci    DISPLAY_TEST_LOGE("x : %{public}d y : %{public}d w : %{public}d h : %{public}d", rect.x, rect.y, rect.w, rect.h);
1899762338dSopenharmony_ci    cropRect_ = rect;
1909762338dSopenharmony_ci}
1919762338dSopenharmony_ci
1929762338dSopenharmony_ciint32_t HdiTestLayer::PreparePresent()
1939762338dSopenharmony_ci{
1949762338dSopenharmony_ci    int ret;
1959762338dSopenharmony_ci    DISPLAY_TEST_LOGE();
1969762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerRegion(displayID_, id_, displayRect_);
1979762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set display rect failed"));
1989762338dSopenharmony_ci
1999762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerCrop(displayID_, id_, cropRect_);
2009762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set display crop failed"));
2019762338dSopenharmony_ci
2029762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerZorder(displayID_, id_, zorder_);
2039762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set display zorder failed"));
2049762338dSopenharmony_ci
2059762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerCompositionType(displayID_, id_, compType_);
2069762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
2079762338dSopenharmony_ci        DISPLAY_TEST_LOGE("set display composition type failed"));
2089762338dSopenharmony_ci
2099762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerTransformMode(displayID_, id_, transform_);
2109762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set transform mode failed"));
2119762338dSopenharmony_ci
2129762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerAlpha(displayID_, id_, alpha_);
2139762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set alpha failed"));
2149762338dSopenharmony_ci
2159762338dSopenharmony_ci    HdiGrallocBuffer* buffer = AcquireBackBuffer();
2169762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((buffer == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("can not get back buffer"));
2179762338dSopenharmony_ci
2189762338dSopenharmony_ci    BufferHandle* handle = buffer->Get();
2199762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((handle == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("BufferHandle is null"));
2209762338dSopenharmony_ci
2219762338dSopenharmony_ci    IRect tmp {0, 0, handle->width, handle->height};
2229762338dSopenharmony_ci    std::vector<IRect> vRects;
2239762338dSopenharmony_ci    vRects.push_back(tmp);
2249762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerVisibleRegion(displayID_, id_, vRects);
2259762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
2269762338dSopenharmony_ci        DISPLAY_TEST_LOGE("SetLayerVisibleRegion failed"));
2279762338dSopenharmony_ci
2289762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerDirtyRegion(displayID_, id_, vRects);
2299762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
2309762338dSopenharmony_ci        DISPLAY_TEST_LOGE("SetLayerDirtyRegion failed"));
2319762338dSopenharmony_ci
2329762338dSopenharmony_ci    ret = buffer->SetGraphicBuffer([&](const BufferHandle* ptrBuffer, uint32_t seqNo) -> int32_t {
2339762338dSopenharmony_ci        std::vector<uint32_t> deletingList;
2349762338dSopenharmony_ci        int32_t result = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerBuffer(
2359762338dSopenharmony_ci            displayID_, id_, ptrBuffer, seqNo, -1, deletingList);
2369762338dSopenharmony_ci        DISPLAY_TEST_CHK_RETURN((result != DISPLAY_SUCCESS), DISPLAY_FAILURE,
2379762338dSopenharmony_ci            DISPLAY_TEST_LOGE("set buffer handle failed"));
2389762338dSopenharmony_ci        return DISPLAY_SUCCESS;
2399762338dSopenharmony_ci    });
2409762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), ret, DISPLAY_TEST_LOGE("set buffer handle failed"));
2419762338dSopenharmony_ci
2429762338dSopenharmony_ci    ret = HdiTestDevice::GetInstance().GetDeviceInterface()->SetLayerBlendType(displayID_, id_, blendType_);
2439762338dSopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("set blend type failed"));
2449762338dSopenharmony_ci    return DISPLAY_SUCCESS;
2459762338dSopenharmony_ci}
2469762338dSopenharmony_ci
2479762338dSopenharmony_civoid HdiTestLayer::SetZorder(uint32_t zorder)
2489762338dSopenharmony_ci{
2499762338dSopenharmony_ci    DISPLAY_TEST_LOGE("the zorder is %{public}u", zorder);
2509762338dSopenharmony_ci    zorder_ = zorder;
2519762338dSopenharmony_ci}
2529762338dSopenharmony_ci
2539762338dSopenharmony_civoid HdiTestLayer::SetCompType(Composer::V1_0::CompositionType type)
2549762338dSopenharmony_ci{
2559762338dSopenharmony_ci    DISPLAY_TEST_LOGE("layer id %{public}u ,the type is : %{public}d", id_, type);
2569762338dSopenharmony_ci    compType_ = type;
2579762338dSopenharmony_ci}
2589762338dSopenharmony_ci
2599762338dSopenharmony_civoid HdiTestLayer::SetTransform(TransformType transform)
2609762338dSopenharmony_ci{
2619762338dSopenharmony_ci    transform_ = transform;
2629762338dSopenharmony_ci}
2639762338dSopenharmony_ci
2649762338dSopenharmony_civoid HdiTestLayer::SetAlpha(LayerAlpha alpha)
2659762338dSopenharmony_ci{
2669762338dSopenharmony_ci    DISPLAY_TEST_LOGE();
2679762338dSopenharmony_ci    alpha_ = alpha;
2689762338dSopenharmony_ci}
2699762338dSopenharmony_ci
2709762338dSopenharmony_civoid HdiTestLayer::SetBlendType(BlendType type)
2719762338dSopenharmony_ci{
2729762338dSopenharmony_ci    DISPLAY_TEST_LOGE("type %{public}d", type);
2739762338dSopenharmony_ci    blendType_ = type;
2749762338dSopenharmony_ci}
2759762338dSopenharmony_ci
2769762338dSopenharmony_civoid HdiTestLayer::SetReleaseFence(int fd)
2779762338dSopenharmony_ci{
2789762338dSopenharmony_ci    DISPLAY_TEST_LOGE("layer id %{public}u , fd %{public}d", id_, fd);
2799762338dSopenharmony_ci    if (currentBuffer_ != nullptr) {
2809762338dSopenharmony_ci        currentBuffer_->SetReleaseFence(fd);
2819762338dSopenharmony_ci    }
2829762338dSopenharmony_ci}
2839762338dSopenharmony_ci
2849762338dSopenharmony_ciuint32_t HdiTestLayer::GetLayerBuffercount() const
2859762338dSopenharmony_ci{
2869762338dSopenharmony_ci    return layerBufferCount_;
2879762338dSopenharmony_ci}
2889762338dSopenharmony_ci
2899762338dSopenharmony_ciHdiTestLayer::~HdiTestLayer() {}
2909762338dSopenharmony_ci} // OHOS
2919762338dSopenharmony_ci} // HDI
2929762338dSopenharmony_ci} // Display
2939762338dSopenharmony_ci} // TEST
294