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