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