• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <cstring>
24 #include <securec.h>
25 #include <mutex>
26 #include "v1_3/include/idisplay_composer_interface.h"
27 
28 #define CHECK_DEVICE_NULL(sptrDevice)                                \
29     do {                                                             \
30         if ((sptrDevice) == nullptr) {                               \
31             HLOGE("[%{public}s]: HdiDevice is nullptr.", __func__);  \
32             return GRAPHIC_DISPLAY_NULL_PTR;                         \
33         }                                                            \
34     } while (0)
35 
36 namespace OHOS {
37 namespace Rosen {
38 using namespace OHOS::HDI::Display::Composer::V1_0;
39 using namespace OHOS::HDI::Display::Composer::V1_1;
40 using namespace OHOS::HDI::Display::Composer::V1_2;
41 constexpr size_t MATRIX_SIZE = 9;
42 const std::string GENERIC_METADATA_KEY_DISPLAY_LINEAR_MATRIX = "DisplayLinearMatrix";
43 
CreateHdiScreen(uint32_t screenId)44 std::unique_ptr<HdiScreen> HdiScreen::CreateHdiScreen(uint32_t screenId)
45 {
46     return std::make_unique<HdiScreen>(screenId);
47 }
48 
HdiScreen(uint32_t screenId)49 HdiScreen::HdiScreen(uint32_t screenId) : screenId_(screenId)
50 {
51     HLOGI("Create screen, screenId is %{public}d", screenId);
52 }
53 
~HdiScreen()54 HdiScreen::~HdiScreen()
55 {
56     HLOGI("Destroy screen, screenId is %{public}d", screenId_);
57 }
58 
OnVsync(uint32_t sequence,uint64_t ns,void * data)59 void HdiScreen::OnVsync(uint32_t sequence, uint64_t ns, void *data)
60 {
61     (void)data;
62     ScopedBytrace onVsyncTrace("HdiScreen::OnVsync_" + std::to_string((ns)));
63     if (ns == 0) {
64         HLOGW("Vsync ns is 0, drop this callback");
65         return;
66     }
67 
68     auto sampler = CreateVSyncSampler();
69     if (sampler == nullptr) {
70         HLOGE("OnVsync failed, sampler is null");
71         return;
72     }
73     sampler->AddSample(ns);
74 }
75 
Init()76 bool HdiScreen::Init()
77 {
78     if (device_ != nullptr) {
79         HLOGI("HdiScreen has been initialized");
80         return true;
81     }
82 
83     device_ = HdiDevice::GetInstance();
84     if (device_ == nullptr) {
85         HLOGE("[%{public}s]: HdiDevice is nullptr.", __func__);
86         return false;
87     }
88 
89     int32_t ret = device_->RegScreenVBlankCallback(screenId_, HdiScreen::OnVsync, this);
90     if (ret != GRAPHIC_DISPLAY_SUCCESS) {
91         HLOGE("RegScreenVBlankCallback failed, ret is %{public}d", ret);
92         return false;
93     }
94 
95     HLOGI("Init hdiScreen succeed");
96     return true;
97 }
98 
SetHdiDevice(HdiDevice * device)99 bool HdiScreen::SetHdiDevice(HdiDevice* device)
100 {
101     if (device_ != nullptr) {
102         return true;
103     }
104 
105     if (device == nullptr) {
106         HLOGE("Input HdiDevice is null");
107         return false;
108     }
109 
110     device_ = device;
111     return true;
112 }
113 
GetScreenCapability(GraphicDisplayCapability & dcap) const114 int32_t HdiScreen::GetScreenCapability(GraphicDisplayCapability &dcap) const
115 {
116     CHECK_DEVICE_NULL(device_);
117     return device_->GetScreenCapability(screenId_, dcap);
118 }
119 
GetScreenSupportedModes(std::vector<GraphicDisplayModeInfo> & modes) const120 int32_t HdiScreen::GetScreenSupportedModes(std::vector<GraphicDisplayModeInfo> &modes) const
121 {
122     CHECK_DEVICE_NULL(device_);
123     return device_->GetScreenSupportedModes(screenId_, modes);
124 }
125 
GetScreenMode(uint32_t & modeId)126 int32_t HdiScreen::GetScreenMode(uint32_t &modeId)
127 {
128     std::unique_lock<std::mutex> locker(mutex_);
129     CHECK_DEVICE_NULL(device_);
130     if (modeId_ != UINT32_MAX) {
131         modeId = modeId_;
132         return HDF_SUCCESS;
133     }
134     int32_t ret = device_->GetScreenMode(screenId_, modeId);
135     if (ret == HDF_SUCCESS) {
136         modeId_ = modeId;
137     }
138     return ret;
139 }
140 
SetScreenMode(uint32_t modeId)141 int32_t HdiScreen::SetScreenMode(uint32_t modeId)
142 {
143     std::unique_lock<std::mutex> locker(mutex_);
144     CHECK_DEVICE_NULL(device_);
145     int32_t ret = device_->SetScreenMode(screenId_, modeId);
146     if (ret == HDF_SUCCESS) {
147         modeId_ = modeId;
148     } else {
149         modeId_ = UINT32_MAX;
150     }
151     return ret;
152 }
153 
SetScreenActiveRect(const GraphicIRect & activeRect)154 int32_t HdiScreen::SetScreenActiveRect(const GraphicIRect& activeRect)
155 {
156     std::unique_lock<std::mutex> locker(mutex_);
157     CHECK_DEVICE_NULL(device_);
158     return device_->SetScreenActiveRect(screenId_, activeRect);
159 }
160 
SetScreenOverlayResolution(uint32_t width,uint32_t height) const161 int32_t HdiScreen::SetScreenOverlayResolution(uint32_t width, uint32_t height) const
162 {
163     CHECK_DEVICE_NULL(device_);
164     return device_->SetScreenOverlayResolution(screenId_, width, height);
165 }
166 
GetScreenPowerStatus(GraphicDispPowerStatus & status) const167 int32_t HdiScreen::GetScreenPowerStatus(GraphicDispPowerStatus &status) const
168 {
169     CHECK_DEVICE_NULL(device_);
170     return device_->GetScreenPowerStatus(screenId_, status);
171 }
172 
SetScreenPowerStatus(GraphicDispPowerStatus status) const173 int32_t HdiScreen::SetScreenPowerStatus(GraphicDispPowerStatus status) const
174 {
175     CHECK_DEVICE_NULL(device_);
176     return device_->SetScreenPowerStatus(screenId_, status);
177 }
178 
GetScreenBacklight(uint32_t & level) const179 int32_t HdiScreen::GetScreenBacklight(uint32_t &level) const
180 {
181     CHECK_DEVICE_NULL(device_);
182     return device_->GetScreenBacklight(screenId_, level);
183 }
184 
SetScreenBacklight(uint32_t level) const185 int32_t HdiScreen::SetScreenBacklight(uint32_t level) const
186 {
187     CHECK_DEVICE_NULL(device_);
188     return device_->SetScreenBacklight(screenId_, level);
189 }
190 
SetScreenVsyncEnabled(bool enabled) const191 int32_t HdiScreen::SetScreenVsyncEnabled(bool enabled) const
192 {
193     CHECK_DEVICE_NULL(device_);
194     int32_t ret = device_->SetScreenVsyncEnabled(screenId_, enabled);
195     if (ret != HDF_SUCCESS) {
196         HLOGE("SetScreenVsyncEnabled Failed, screenId:%{public}u, enabled:%{public}d, ret:%{public}d",
197             screenId_, enabled, ret);
198         RS_TRACE_NAME_FMT("SetScreenVsyncEnabled Failed, screenId:%u, enabled:%d, ret:%d", screenId_, enabled, ret);
199     }
200     auto sampler = CreateVSyncSampler();
201     if (sampler != nullptr) {
202         return ret;
203     }
204     if (ret == HDF_SUCCESS) {
205         sampler->SetHardwareVSyncStatus(enabled);
206         sampler->RecordDisplayVSyncStatus(enabled);
207     } else {
208         sampler->RollbackHardwareVSyncStatus();
209     }
210     return ret;
211 }
212 
GetScreenSupportedColorGamuts(std::vector<GraphicColorGamut> & gamuts) const213 int32_t HdiScreen::GetScreenSupportedColorGamuts(std::vector<GraphicColorGamut> &gamuts) const
214 {
215     CHECK_DEVICE_NULL(device_);
216     return device_->GetScreenSupportedColorGamuts(screenId_, gamuts);
217 }
218 
SetScreenColorGamut(GraphicColorGamut gamut) const219 int32_t HdiScreen::SetScreenColorGamut(GraphicColorGamut gamut) const
220 {
221     CHECK_DEVICE_NULL(device_);
222     return device_->SetScreenColorGamut(screenId_, gamut);
223 }
224 
GetScreenColorGamut(GraphicColorGamut & gamut) const225 int32_t HdiScreen::GetScreenColorGamut(GraphicColorGamut &gamut) const
226 {
227     CHECK_DEVICE_NULL(device_);
228     return device_->GetScreenColorGamut(screenId_, gamut);
229 }
230 
SetScreenGamutMap(GraphicGamutMap gamutMap) const231 int32_t HdiScreen::SetScreenGamutMap(GraphicGamutMap gamutMap) const
232 {
233     CHECK_DEVICE_NULL(device_);
234     return device_->SetScreenGamutMap(screenId_, gamutMap);
235 }
236 
GetScreenGamutMap(GraphicGamutMap & gamutMap) const237 int32_t HdiScreen::GetScreenGamutMap(GraphicGamutMap &gamutMap) const
238 {
239     CHECK_DEVICE_NULL(device_);
240     return device_->GetScreenGamutMap(screenId_, gamutMap);
241 }
242 
SetScreenColorTransform(const std::vector<float> & matrix) const243 int32_t HdiScreen::SetScreenColorTransform(const std::vector<float>& matrix) const
244 {
245     CHECK_DEVICE_NULL(device_);
246     return device_->SetScreenColorTransform(screenId_, matrix);
247 }
248 
SetScreenLinearMatrix(const std::vector<float> & matrix) const249 int32_t HdiScreen::SetScreenLinearMatrix(const std::vector<float> &matrix) const
250 {
251     CHECK_DEVICE_NULL(device_);
252     if (matrix.size() != MATRIX_SIZE) {
253         HLOGE("[%{public}s]: ScreenLinearMatrix size is invalid.", __func__);
254         return -1;
255     }
256     std::vector<int8_t> valueBlob(MATRIX_SIZE * sizeof(float));
257     if (memcpy_s(valueBlob.data(), valueBlob.size(), matrix.data(),
258         MATRIX_SIZE * sizeof(float)) != EOK) {
259         return -1;
260     }
261     return device_->SetDisplayPerFrameParameterSmq(
262         screenId_, GENERIC_METADATA_KEY_DISPLAY_LINEAR_MATRIX, valueBlob);
263 }
264 
GetHDRCapabilityInfos(GraphicHDRCapability & info) const265 int32_t HdiScreen::GetHDRCapabilityInfos(GraphicHDRCapability &info) const
266 {
267     CHECK_DEVICE_NULL(device_);
268     return device_->GetHDRCapabilityInfos(screenId_, info);
269 }
270 
GetSupportedMetaDataKey(std::vector<GraphicHDRMetadataKey> & keys) const271 int32_t HdiScreen::GetSupportedMetaDataKey(std::vector<GraphicHDRMetadataKey> &keys) const
272 {
273     CHECK_DEVICE_NULL(device_);
274     return device_->GetSupportedMetaDataKey(screenId_, keys);
275 }
276 
SetScreenConstraint(uint64_t frameId,uint64_t timestamp,uint32_t type)277 int32_t HdiScreen::SetScreenConstraint(uint64_t frameId, uint64_t timestamp, uint32_t type)
278 {
279     CHECK_DEVICE_NULL(device_);
280     return device_->SetScreenConstraint(screenId_, frameId, timestamp, type);
281 }
282 
GetDisplayPropertyForHardCursor(uint32_t screenId)283 bool HdiScreen::GetDisplayPropertyForHardCursor(uint32_t screenId)
284 {
285     if (device_ == nullptr) {
286         HLOGE("[%{public}s]: HdiDevice is nullptr.", __func__);
287         return false;
288     }
289     uint64_t propertyValue = 0;
290     if (device_->GetDisplayProperty(screenId,
291         HDI::Display::Composer::V1_2::DISPLAY_CAPBILITY_HARDWARE_CURSOR, propertyValue)
292         != HDI::Display::Composer::V1_2::DISPLAY_SUCCESS) {
293         return false;
294     }
295     if (propertyValue) {
296         return true;
297     }
298     return false;
299 }
300 
GetDisplayIdentificationData(uint8_t & outPort,std::vector<uint8_t> & edidData) const301 int32_t HdiScreen::GetDisplayIdentificationData(uint8_t& outPort, std::vector<uint8_t>& edidData) const
302 {
303     CHECK_DEVICE_NULL(device_);
304     return device_->GetDisplayIdentificationData(screenId_, outPort, edidData);
305 }
306 } // namespace Rosen
307 } // namespace OHOS
308