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