1 /*
2  * Copyright (c) 2021 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 <scoped_bytrace.h>
17 #include "hdi_screen.h"
18 #include <chrono>
19 #include "hdi_log.h"
20 #include "vsync_sampler.h"
21 #include <hdf_base.h>
22 #include <rs_trace.h>
23 #include <mutex>
24 
25 #define CHECK_DEVICE_NULL(sptrDevice)                                \
26     do {                                                             \
27         if ((sptrDevice) == nullptr) {                               \
28             HLOGE("[%{public}s]: HdiDevice is nullptr.", __func__);  \
29             return GRAPHIC_DISPLAY_NULL_PTR;                         \
30         }                                                            \
31     } while (0)
32 
33 namespace OHOS {
34 namespace Rosen {
35 
CreateHdiScreen(uint32_t screenId)36 std::unique_ptr<HdiScreen> HdiScreen::CreateHdiScreen(uint32_t screenId)
37 {
38     return std::make_unique<HdiScreen>(screenId);
39 }
40 
HdiScreen(uint32_t screenId)41 HdiScreen::HdiScreen(uint32_t screenId) : screenId_(screenId)
42 {
43     HLOGI("Create screen, screenId is %{public}d", screenId);
44 }
45 
~HdiScreen()46 HdiScreen::~HdiScreen()
47 {
48     HLOGI("Destroy screen, screenId is %{public}d", screenId_);
49 }
50 
OnVsync(uint32_t sequence, uint64_t ns, void *data)51 void HdiScreen::OnVsync(uint32_t sequence, uint64_t ns, void *data)
52 {
53     (void)data;
54     ScopedBytrace onVsyncTrace("HdiScreen::OnVsync_" + std::to_string((ns)));
55     if (ns == 0) {
56         HLOGW("Vsync ns is 0, drop this callback");
57         return;
58     }
59 
60     // trigger vsync
61     // if the sampler->GetHardwareVSyncStatus() is false, this OnVsync callback will be disable
62     // we need to add this process
63     auto sampler = CreateVSyncSampler();
64     if (sampler->GetHardwareVSyncStatus()) {
65         bool enable = sampler->AddSample(ns);
66         sampler->SetHardwareVSyncStatus(enable);
67     }
68 }
69 
Init()70 bool HdiScreen::Init()
71 {
72     if (device_ != nullptr) {
73         HLOGI("HdiScreen has been initialized");
74         return true;
75     }
76 
77     device_ = HdiDevice::GetInstance();
78     if (device_ == nullptr) {
79         HLOGE("[%{public}s]: HdiDevice is nullptr.", __func__);
80         return false;
81     }
82 
83     int32_t ret = device_->RegScreenVBlankCallback(screenId_, HdiScreen::OnVsync, this);
84     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
85         HLOGE("RegScreenVBlankCallback failed, ret is %{public}d", ret);
86         return false;
87     }
88 
89     HLOGI("Init hdiScreen succeed");
90     return true;
91 }
92 
SetHdiDevice(HdiDevice* device)93 bool HdiScreen::SetHdiDevice(HdiDevice* device)
94 {
95     if (device_ != nullptr) {
96         return true;
97     }
98 
99     if (device == nullptr) {
100         HLOGE("Input HdiDevice is null");
101         return false;
102     }
103 
104     device_ = device;
105     return true;
106 }
107 
GetScreenCapability(GraphicDisplayCapability &dcap) const108 int32_t HdiScreen::GetScreenCapability(GraphicDisplayCapability &dcap) const
109 {
110     CHECK_DEVICE_NULL(device_);
111     return device_->GetScreenCapability(screenId_, dcap);
112 }
113 
GetScreenSupportedModes(std::vector<GraphicDisplayModeInfo> &modes) const114 int32_t HdiScreen::GetScreenSupportedModes(std::vector<GraphicDisplayModeInfo> &modes) const
115 {
116     CHECK_DEVICE_NULL(device_);
117     return device_->GetScreenSupportedModes(screenId_, modes);
118 }
119 
GetScreenMode(uint32_t &modeId)120 int32_t HdiScreen::GetScreenMode(uint32_t &modeId)
121 {
122     std::unique_lock<std::mutex> locker(mutex_);
123     CHECK_DEVICE_NULL(device_);
124     if (modeId_ != UINT32_MAX) {
125         modeId = modeId_;
126         return HDF_SUCCESS;
127     }
128     int32_t ret = device_->GetScreenMode(screenId_, modeId);
129     if (ret == HDF_SUCCESS) {
130         modeId_ = modeId;
131     }
132     return ret;
133 }
134 
SetScreenMode(uint32_t modeId)135 int32_t HdiScreen::SetScreenMode(uint32_t modeId)
136 {
137     std::unique_lock<std::mutex> locker(mutex_);
138     CHECK_DEVICE_NULL(device_);
139     int32_t ret = device_->SetScreenMode(screenId_, modeId);
140     if (ret == HDF_SUCCESS) {
141         modeId_ = modeId;
142     } else {
143         modeId_ = UINT32_MAX;
144     }
145     return ret;
146 }
147 
SetScreenOverlayResolution(uint32_t width, uint32_t height) const148 int32_t HdiScreen::SetScreenOverlayResolution(uint32_t width, uint32_t height) const
149 {
150     CHECK_DEVICE_NULL(device_);
151     return device_->SetScreenOverlayResolution(screenId_, width, height);
152 }
153 
GetScreenPowerStatus(GraphicDispPowerStatus &status) const154 int32_t HdiScreen::GetScreenPowerStatus(GraphicDispPowerStatus &status) const
155 {
156     CHECK_DEVICE_NULL(device_);
157     return device_->GetScreenPowerStatus(screenId_, status);
158 }
159 
SetScreenPowerStatus(GraphicDispPowerStatus status) const160 int32_t HdiScreen::SetScreenPowerStatus(GraphicDispPowerStatus status) const
161 {
162     CHECK_DEVICE_NULL(device_);
163     return device_->SetScreenPowerStatus(screenId_, status);
164 }
165 
GetScreenBacklight(uint32_t &level) const166 int32_t HdiScreen::GetScreenBacklight(uint32_t &level) const
167 {
168     CHECK_DEVICE_NULL(device_);
169     return device_->GetScreenBacklight(screenId_, level);
170 }
171 
SetScreenBacklight(uint32_t level) const172 int32_t HdiScreen::SetScreenBacklight(uint32_t level) const
173 {
174     CHECK_DEVICE_NULL(device_);
175     return device_->SetScreenBacklight(screenId_, level);
176 }
177 
SetScreenVsyncEnabled(bool enabled) const178 int32_t HdiScreen::SetScreenVsyncEnabled(bool enabled) const
179 {
180     CHECK_DEVICE_NULL(device_);
181     int32_t ret = device_->SetScreenVsyncEnabled(screenId_, enabled);
182     if (ret != HDF_SUCCESS) {
183         HLOGE("SetScreenVsyncEnabled Failed, screenId:%{public}u, enabled:%{public}d, ret:%{public}d",
184             screenId_, enabled, ret);
185         RS_TRACE_NAME_FMT("SetScreenVsyncEnabled Failed, screenId:%u, enabled:%d, ret:%d", screenId_, enabled, ret);
186     }
187     return ret;
188 }
189 
GetScreenSupportedColorGamuts(std::vector<GraphicColorGamut> &gamuts) const190 int32_t HdiScreen::GetScreenSupportedColorGamuts(std::vector<GraphicColorGamut> &gamuts) const
191 {
192     CHECK_DEVICE_NULL(device_);
193     return device_->GetScreenSupportedColorGamuts(screenId_, gamuts);
194 }
195 
SetScreenColorGamut(GraphicColorGamut gamut) const196 int32_t HdiScreen::SetScreenColorGamut(GraphicColorGamut gamut) const
197 {
198     CHECK_DEVICE_NULL(device_);
199     return device_->SetScreenColorGamut(screenId_, gamut);
200 }
201 
GetScreenColorGamut(GraphicColorGamut &gamut) const202 int32_t HdiScreen::GetScreenColorGamut(GraphicColorGamut &gamut) const
203 {
204     CHECK_DEVICE_NULL(device_);
205     return device_->GetScreenColorGamut(screenId_, gamut);
206 }
207 
SetScreenGamutMap(GraphicGamutMap gamutMap) const208 int32_t HdiScreen::SetScreenGamutMap(GraphicGamutMap gamutMap) const
209 {
210     CHECK_DEVICE_NULL(device_);
211     return device_->SetScreenGamutMap(screenId_, gamutMap);
212 }
213 
GetScreenGamutMap(GraphicGamutMap &gamutMap) const214 int32_t HdiScreen::GetScreenGamutMap(GraphicGamutMap &gamutMap) const
215 {
216     CHECK_DEVICE_NULL(device_);
217     return device_->GetScreenGamutMap(screenId_, gamutMap);
218 }
219 
SetScreenColorTransform(const std::vector<float>& matrix) const220 int32_t HdiScreen::SetScreenColorTransform(const std::vector<float>& matrix) const
221 {
222     CHECK_DEVICE_NULL(device_);
223     return device_->SetScreenColorTransform(screenId_, matrix);
224 }
225 
GetHDRCapabilityInfos(GraphicHDRCapability &info) const226 int32_t HdiScreen::GetHDRCapabilityInfos(GraphicHDRCapability &info) const
227 {
228     CHECK_DEVICE_NULL(device_);
229     return device_->GetHDRCapabilityInfos(screenId_, info);
230 }
231 
GetSupportedMetaDataKey(std::vector<GraphicHDRMetadataKey> &keys) const232 int32_t HdiScreen::GetSupportedMetaDataKey(std::vector<GraphicHDRMetadataKey> &keys) const
233 {
234     CHECK_DEVICE_NULL(device_);
235     return device_->GetSupportedMetaDataKey(screenId_, keys);
236 }
237 
SetScreenConstraint(uint64_t frameId, uint64_t timestamp, uint32_t type)238 int32_t HdiScreen::SetScreenConstraint(uint64_t frameId, uint64_t timestamp, uint32_t type)
239 {
240     CHECK_DEVICE_NULL(device_);
241     return device_->SetScreenConstraint(screenId_, frameId, timestamp, type);
242 }
243 
244 } // namespace Rosen
245 } // namespace OHOS
246