1/* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "display_test_utils.h" 17 18namespace OHOS { 19namespace Rosen { 20namespace { 21constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayTestUtils"}; 22} 23 24DisplayTestUtils::~DisplayTestUtils() 25{ 26 if (csurface_ != nullptr) { 27 if (prevBuffer_ != nullptr) { 28 SurfaceError ret = csurface_->ReleaseBuffer(prevBuffer_, -1); 29 if (ret != SURFACE_ERROR_OK) { 30 WLOGFE("buffer release failed"); 31 return; 32 } 33 WLOGI("prevBuffer_ release success"); 34 } 35 csurface_->UnregisterConsumerListener(); 36 } 37 38 csurface_ = nullptr; 39 psurface_ = nullptr; 40 listener_ = nullptr; 41 prevBuffer_ = nullptr; 42 bufferHandle_ = nullptr; 43} 44 45bool DisplayTestUtils::SizeEqualToDisplay(const sptr<Display>& display, const Media::Size cur) 46{ 47 int32_t dWidth = display->GetWidth(); 48 int32_t dHeight = display->GetHeight(); 49 50 bool res = ((cur.width == dWidth) && (cur.height == dHeight)); 51 if (!res) { 52 WLOGFE("DisplaySize: %d %d, CurrentSize: %d %d", dWidth, dHeight, cur.width, cur.height); 53 } 54 return res; 55} 56 57bool DisplayTestUtils::SizeEqual(const Media::Size dst, const Media::Size cur) 58{ 59 bool res = ((cur.width == dst.width) && (cur.height == dst.height)); 60 if (!res) { 61 WLOGFE("Desired Size: %d %d, Current Size: %d %d", dst.width, dst.height, cur.width, cur.height); 62 } 63 return res; 64} 65 66bool DisplayTestUtils::CreateSurface() 67{ 68 csurface_ = IConsumerSurface::Create(); 69 if (csurface_ == nullptr) { 70 WLOGFE("csurface create failed"); 71 return false; 72 } 73 74 auto producer = csurface_->GetProducer(); 75 psurface_ = Surface::CreateSurfaceAsProducer(producer); 76 if (psurface_ == nullptr) { 77 WLOGFE("csurface create failed"); 78 return false; 79 } 80 81 listener_ = new BufferListener(*this); 82 SurfaceError ret = csurface_->RegisterConsumerListener(listener_); 83 if (ret != SURFACE_ERROR_OK) { 84 WLOGFE("listener register failed"); 85 return false; 86 } 87 return true; 88} 89 90void DisplayTestUtils::OnVsync() 91{ 92 std::lock_guard<std::mutex> lock(mutex_); 93 WLOGI("DisplayTestUtils::OnVsync"); 94 sptr<SurfaceBuffer> cbuffer = nullptr; 95 int32_t fence = -1; 96 int64_t timestamp = 0; 97 OHOS::Rect damage; 98 if (csurface_ == nullptr) { 99 WLOGFE("csurface_ is null"); 100 return; 101 } 102 auto sret = csurface_->AcquireBuffer(cbuffer, fence, timestamp, damage); 103 UniqueFd fenceFd(fence); 104 if (cbuffer == nullptr || sret != OHOS::SURFACE_ERROR_OK) { 105 WLOGFE("acquire buffer failed"); 106 return; 107 } 108 bufferHandle_ = cbuffer->GetBufferHandle(); 109 if (bufferHandle_ == nullptr) { 110 WLOGFE("get bufferHandle failed"); 111 return; 112 } 113 if (defaultWidth_ == static_cast<uint32_t>(bufferHandle_->width) && 114 defaultHeight_ == static_cast<uint32_t>(bufferHandle_->height)) { 115 successCount_++; 116 WLOGI("compareWH is successful in onVsync: %d", successCount_); 117 } else { 118 failCount_++; 119 } 120 if (cbuffer != prevBuffer_) { 121 if (prevBuffer_ != nullptr) { 122 SurfaceError ret = csurface_->ReleaseBuffer(prevBuffer_, -1); 123 if (ret != SURFACE_ERROR_OK) { 124 WLOGFE("buffer release failed"); 125 return; 126 } 127 } 128 prevBuffer_ = cbuffer; 129 } 130} 131 132void DisplayTestUtils::SetDefaultWH(const sptr<Display>& display) 133{ 134 defaultWidth_ = display->GetWidth(); 135 defaultHeight_ = display->GetHeight(); 136} 137} // namespace ROSEN 138} // namespace OHOS