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