1 /*
2 * Copyright (c) 2021-2023 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 "rs_screen_manager.h"
17
18 #include "hgm_core.h"
19 #include "pipeline/rs_display_render_node.h"
20 #include "pipeline/rs_main_thread.h"
21 #include "pipeline/rs_hardware_thread.h"
22 #include "platform/common/rs_log.h"
23 #include "vsync_sampler.h"
24 #include <parameter.h>
25 #include <parameters.h>
26 #include "param/sys_param.h"
27 #include "common/rs_optional_trace.h"
28 #include "rs_trace.h"
29
30 namespace OHOS {
31 namespace Rosen {
32 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
33 namespace {
34 constexpr float ANGLE_MIN_VAL = 0.0F;
35 constexpr float ANGLE_MAX_VAL = 180.0F;
36 constexpr int32_t SENSOR_SUCCESS = 0;
37 constexpr int32_t POSTURE_INTERVAL = 4000000;
38 constexpr uint16_t SENSOR_EVENT_FIRST_DATA = 0;
39 constexpr float HALF_FOLDED_MAX_THRESHOLD = 140.0F;
40 constexpr float OPEN_HALF_FOLDED_MIN_THRESHOLD = 25.0F;
41 constexpr uint32_t WAIT_FOR_ACTIVE_SCREEN_ID_TIMEOUT = 1000;
42 constexpr uint32_t MAX_VIRTUAL_SCREEN_NUM = 64;
43 constexpr uint32_t MAX_VIRTUAL_SCREEN_WIDTH = 65536;
44 constexpr uint32_t MAX_VIRTUAL_SCREEN_HEIGHT = 65536;
45 constexpr uint32_t MAX_VIRTUAL_SCREEN_REFRESH_RATE = 120;
SensorPostureDataCallback(SensorEvent * event)46 void SensorPostureDataCallback(SensorEvent *event)
47 {
48 OHOS::Rosen::CreateOrGetScreenManager()->HandlePostureData(event);
49 }
50 } // namespace
51 #endif
52 using namespace HiviewDFX;
53 namespace impl {
54 std::once_flag RSScreenManager::createFlag_;
55 sptr<OHOS::Rosen::RSScreenManager> RSScreenManager::instance_ = nullptr;
56
GetInstance()57 sptr<OHOS::Rosen::RSScreenManager> RSScreenManager::GetInstance() noexcept
58 {
59 std::call_once(createFlag_, []() {
60 instance_ = new RSScreenManager();
61 });
62
63 return instance_;
64 }
65
RSScreenManager()66 RSScreenManager::RSScreenManager()
67 {
68 }
69
~RSScreenManager()70 RSScreenManager::~RSScreenManager() noexcept
71 {
72 }
73
Init()74 bool RSScreenManager::Init() noexcept
75 {
76 composer_ = HdiBackend::GetInstance();
77 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
78 isFoldScreenFlag_ = system::GetParameter("const.window.foldscreen.type", "") != "";
79 #endif
80 if (composer_ == nullptr) {
81 RS_LOGE("RSScreenManager %{public}s: Failed to get composer.", __func__);
82 return false;
83 }
84
85 if (composer_->RegScreenHotplug(&RSScreenManager::OnHotPlug, this) != 0) {
86 RS_LOGE("RSScreenManager %{public}s: Failed to register OnHotPlug Func to composer.", __func__);
87 return false;
88 }
89
90 if (composer_->RegScreenRefresh(&RSScreenManager::OnRefresh, this) != 0) {
91 RS_LOGE("RSScreenManager %{public}s: Failed to register OnRefresh Func to composer.", __func__);
92 }
93
94 if (composer_->RegHwcDeadListener(&RSScreenManager::OnHwcDead, this) != 0) {
95 RS_LOGE("RSScreenManager %{public}s: Failed to register OnHwcDead Func to composer.", __func__);
96 return false;
97 }
98
99 if (composer_->RegScreenVBlankIdleCallback(&RSScreenManager::OnScreenVBlankIdle, this) != 0) {
100 RS_LOGW("RSScreenManager %{public}s: Not support register OnScreenVBlankIdle Func to composer.", __func__);
101 }
102
103 // call ProcessScreenHotPlugEvents() for primary screen immediately in main thread.
104 ProcessScreenHotPlugEvents();
105
106 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
107 if (isFoldScreenFlag_) {
108 RegisterSensorCallback();
109 }
110 #endif
111 RS_LOGI("RSScreenManager Init succeed");
112 return true;
113 }
114
115 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
RegisterSensorCallback()116 void RSScreenManager::RegisterSensorCallback()
117 {
118 user.callback = SensorPostureDataCallback;
119 int32_t subscribeRet;
120 int32_t setBatchRet;
121 int32_t activateRet;
122 int tryCnt = 0;
123 constexpr int tryLimit = 5; // 5 times failure limit
124 do {
125 subscribeRet = SubscribeSensor(SENSOR_TYPE_ID_POSTURE, &user);
126 RS_LOGI("RSScreenManager RegisterSensorCallback, subscribeRet: %{public}d", subscribeRet);
127 setBatchRet = SetBatch(SENSOR_TYPE_ID_POSTURE, &user, POSTURE_INTERVAL, POSTURE_INTERVAL);
128 RS_LOGI("RSScreenManager RegisterSensorCallback, setBatchRet: %{public}d", setBatchRet);
129 activateRet = ActivateSensor(SENSOR_TYPE_ID_POSTURE, &user);
130 RS_LOGI("RSScreenManager RegisterSensorCallback, activateRet: %{public}d", activateRet);
131 if (subscribeRet != SENSOR_SUCCESS || setBatchRet != SENSOR_SUCCESS || activateRet != SENSOR_SUCCESS) {
132 RS_LOGE("RSScreenManager RegisterSensorCallback failed.");
133 usleep(1000); // wait 1000 us for next try
134 tryCnt++;
135 }
136 } while (tryCnt <= tryLimit && (subscribeRet != SENSOR_SUCCESS || setBatchRet != SENSOR_SUCCESS ||
137 activateRet != SENSOR_SUCCESS));
138 if (tryCnt <= tryLimit) {
139 RS_LOGI("RSScreenManager RegisterSensorCallback success.");
140 }
141 }
142
UnRegisterSensorCallback()143 void RSScreenManager::UnRegisterSensorCallback()
144 {
145 int32_t deactivateRet = DeactivateSensor(SENSOR_TYPE_ID_POSTURE, &user);
146 int32_t unsubscribeRet = UnsubscribeSensor(SENSOR_TYPE_ID_POSTURE, &user);
147 if (deactivateRet == SENSOR_SUCCESS && unsubscribeRet == SENSOR_SUCCESS) {
148 RS_LOGI("RSScreenManager UnRegisterSensorCallback success.");
149 }
150 }
151
HandlePostureData(const SensorEvent * const event)152 void RSScreenManager::HandlePostureData(const SensorEvent * const event)
153 {
154 if (event == nullptr) {
155 RS_LOGI("SensorEvent is nullptr.");
156 return;
157 }
158 if (event[SENSOR_EVENT_FIRST_DATA].data == nullptr) {
159 RS_LOGI("SensorEvent[0].data is nullptr.");
160 return;
161 }
162 if (event[SENSOR_EVENT_FIRST_DATA].dataLen < sizeof(PostureData)) {
163 RS_LOGI("SensorEvent dataLen less than posture data size.");
164 return;
165 }
166 PostureData *postureData = reinterpret_cast<PostureData *>(event[SENSOR_EVENT_FIRST_DATA].data);
167 float angle = (*postureData).angle;
168 if (std::isless(angle, ANGLE_MIN_VAL) || std::isgreater(angle, ANGLE_MAX_VAL)) {
169 RS_LOGD("Invalid angle value, angle is %{public}f.", angle);
170 return;
171 }
172 RS_LOGD("angle vlaue in PostureData is: %{public}f.", angle);
173 HandleSensorData(angle);
174 }
175
HandleSensorData(float angle)176 void RSScreenManager::HandleSensorData(float angle)
177 {
178 std::unique_lock<std::mutex> lock(activeScreenIdAssignedMutex_);
179 FoldState foldState = TransferAngleToScreenState(angle);
180 if (foldState == FoldState::FOLDED) {
181 activeScreenId_ = externalScreenId_;
182 } else {
183 activeScreenId_ = innerScreenId_;
184 }
185 isPostureSensorDataHandled_ = true;
186 HgmCore::Instance().SetActiveScreenId(activeScreenId_);
187 activeScreenIdAssignedCV_.notify_one();
188 }
189
TransferAngleToScreenState(float angle)190 FoldState RSScreenManager::TransferAngleToScreenState(float angle)
191 {
192 if (std::isless(angle, ANGLE_MIN_VAL)) {
193 return FoldState::FOLDED;
194 }
195 if (std::isgreaterequal(angle, HALF_FOLDED_MAX_THRESHOLD)) {
196 return FoldState::EXPAND;
197 }
198 FoldState state;
199 if (std::islessequal(angle, OPEN_HALF_FOLDED_MIN_THRESHOLD)) {
200 state = FoldState::FOLDED;
201 } else {
202 state = FoldState::EXPAND;
203 }
204 return state;
205 }
206
GetActiveScreenId()207 ScreenId RSScreenManager::GetActiveScreenId()
208 {
209 std::unique_lock<std::mutex> lock(activeScreenIdAssignedMutex_);
210 if (!isFoldScreenFlag_) {
211 return INVALID_SCREEN_ID;
212 }
213 if (isPostureSensorDataHandled_) {
214 isFirstTimeToGetActiveScreenId_ = false;
215 UnRegisterSensorCallback();
216 RS_LOGI("RSScreenManager activeScreenId: %{public}" PRIu64 " ", activeScreenId_);
217 return activeScreenId_;
218 }
219 activeScreenIdAssignedCV_.wait_until(lock, std::chrono::system_clock::now() +
220 std::chrono::milliseconds(WAIT_FOR_ACTIVE_SCREEN_ID_TIMEOUT), [this]() {
221 return isPostureSensorDataHandled_;
222 });
223 if (isFirstTimeToGetActiveScreenId_) {
224 isFirstTimeToGetActiveScreenId_ = false;
225 UnRegisterSensorCallback();
226 }
227 RS_LOGI("RSScreenManager activeScreenId: %{public}" PRIu64 " ", activeScreenId_);
228 return activeScreenId_;
229 }
230 #else
GetActiveScreenId()231 ScreenId RSScreenManager::GetActiveScreenId()
232 {
233 return INVALID_SCREEN_ID;
234 }
235 #endif
236
IsAllScreensPowerOff() const237 bool RSScreenManager::IsAllScreensPowerOff() const
238 {
239 std::lock_guard<std::mutex> lock(mutex_);
240 if (screenPowerStatus_.empty()) {
241 return false;
242 }
243 for (const auto &[id, powerStatus] : screenPowerStatus_) {
244 auto iter = screens_.find(id);
245 if (iter != screens_.end() && iter->second->IsVirtual()) {
246 continue;
247 }
248 // we also need to consider the AOD mode(POWER_STATUS_SUSPEND)
249 if (powerStatus != ScreenPowerStatus::POWER_STATUS_OFF &&
250 powerStatus != ScreenPowerStatus::POWER_STATUS_SUSPEND) {
251 return false;
252 }
253 }
254 return true;
255 }
256
257 #ifdef USE_VIDEO_PROCESSING_ENGINE
GetScreenBrightnessNits(ScreenId id) const258 float RSScreenManager::GetScreenBrightnessNits(ScreenId id) const
259 {
260 constexpr float DEFAULT_SCREEN_LIGHT_NITS = 500.0;
261 constexpr float DEFAULT_SCREEN_LIGHT_MAX_NITS = 1200.0;
262 constexpr int32_t DEFAULT_SCREEN_LIGHT_MAX_LEVEL = 255;
263
264 float screenBrightnessNits = DEFAULT_SCREEN_LIGHT_NITS;
265
266 RSScreenType screenType;
267 if (GetScreenType(id, screenType) != SUCCESS) {
268 RS_LOGW("RSScreenManager::GetScreenBrightnessNits GetScreenType fail.");
269 return screenBrightnessNits;
270 }
271
272 if (screenType == VIRTUAL_TYPE_SCREEN) {
273 return screenBrightnessNits;
274 }
275
276 int32_t backLightLevel = GetScreenBacklight(id);
277 if (backLightLevel <= 0) {
278 return screenBrightnessNits;
279 }
280
281 return DEFAULT_SCREEN_LIGHT_MAX_NITS * backLightLevel / DEFAULT_SCREEN_LIGHT_MAX_LEVEL;
282 }
283 #endif
284
ForceRefreshOneFrameIfNoRNV()285 void RSScreenManager::ForceRefreshOneFrameIfNoRNV()
286 {
287 auto mainThread = RSMainThread::Instance();
288 if (mainThread != nullptr && !mainThread->IsRequestedNextVSync()) {
289 RS_TRACE_NAME("No RNV, ForceRefreshOneFrame");
290 mainThread->PostTask([mainThread]() {
291 mainThread->SetDirtyFlag();
292 });
293 mainThread->RequestNextVSync();
294 }
295 }
296
OnHotPlug(std::shared_ptr<HdiOutput> & output,bool connected,void * data)297 void RSScreenManager::OnHotPlug(std::shared_ptr<HdiOutput> &output, bool connected, void *data)
298 {
299 if (output == nullptr) {
300 RS_LOGE("RSScreenManager %{public}s: output is nullptr.", __func__);
301 return;
302 }
303
304 RSScreenManager *screenManager = nullptr;
305 if (data != nullptr) {
306 screenManager = static_cast<RSScreenManager *>(data);
307 } else {
308 screenManager = static_cast<RSScreenManager *>(RSScreenManager::GetInstance().GetRefPtr());
309 }
310
311 if (screenManager == nullptr) {
312 RS_LOGE("RSScreenManager %{public}s: Failed to find RSScreenManager instance.", __func__);
313 return;
314 }
315
316 screenManager->OnHotPlugEvent(output, connected);
317 }
318
OnHotPlugEvent(std::shared_ptr<HdiOutput> & output,bool connected)319 void RSScreenManager::OnHotPlugEvent(std::shared_ptr<HdiOutput> &output, bool connected)
320 {
321 {
322 std::lock_guard<std::mutex> lock(mutex_);
323 pendingHotPlugEvents_.emplace_back(ScreenHotPlugEvent{output, connected});
324 }
325
326 // This func would be called in main thread first time immediately after calling composer_->RegScreenHotplug,
327 // but at this time the RSMainThread object would not be ready to handle this, so we need to call
328 // ProcessScreenHotPlugEvents() after this func in RSScreenManager::Init().
329
330 // Normally, this func would be called in hdi's hw-ipc threads(but sometimes in main thread, maybe),
331 // so we should notify the RSMainThread to postTask to call ProcessScreenHotPlugEvents().
332 auto mainThread = RSMainThread::Instance();
333 if (mainThread == nullptr) {
334 return;
335 }
336 mainThread->RequestNextVSync();
337 }
338
OnRefresh(ScreenId id,void * data)339 void RSScreenManager::OnRefresh(ScreenId id, void *data)
340 {
341 RSScreenManager *screenManager = nullptr;
342 if (data != nullptr) {
343 screenManager = static_cast<RSScreenManager *>(data);
344 } else {
345 screenManager = static_cast<RSScreenManager *>(RSScreenManager::GetInstance().GetRefPtr());
346 }
347
348 if (screenManager == nullptr) {
349 RS_LOGE("RSScreenManager %{public}s: Failed to find RSScreenManager instance.", __func__);
350 return;
351 }
352 screenManager->OnRefreshEvent(id);
353 }
354
OnRefreshEvent(ScreenId id)355 void RSScreenManager::OnRefreshEvent(ScreenId id)
356 {
357 auto mainThread = RSMainThread::Instance();
358 if (mainThread == nullptr) {
359 return;
360 }
361 mainThread->PostTask([mainThread]() {
362 mainThread->SetForceUpdateUniRenderFlag(true);
363 mainThread->RequestNextVSync();
364 });
365 }
366
OnHwcDead(void * data)367 void RSScreenManager::OnHwcDead(void *data)
368 {
369 RS_LOGW("RSScreenManager %{public}s: The composer_host is already dead.", __func__);
370 RSScreenManager *screenManager = static_cast<RSScreenManager *>(RSScreenManager::GetInstance().GetRefPtr());
371 if (screenManager == nullptr) {
372 RS_LOGE("RSScreenManager %{public}s: Failed to find RSScreenManager instance.", __func__);
373 return;
374 }
375
376 // Automatically recover when composer host dies.
377 screenManager->CleanAndReinit();
378 }
379
OnHwcDeadEvent()380 void RSScreenManager::OnHwcDeadEvent()
381 {
382 std::lock_guard<std::mutex> lock(mutex_);
383 for (const auto &[id, screen] : screens_) {
384 if (screen) {
385 // In sceneboard, we should not notify the WMS to remove node from RSTree
386 if (screen->IsVirtual()) {
387 continue;
388 } else {
389 RSHardwareThread::Instance().ClearFrameBuffers(screen->GetOutput());
390 }
391 }
392 }
393 isHwcDead_ = true;
394 screens_.clear();
395 defaultScreenId_ = INVALID_SCREEN_ID;
396 }
397
OnScreenVBlankIdle(uint32_t devId,uint64_t ns,void * data)398 void RSScreenManager::OnScreenVBlankIdle(uint32_t devId, uint64_t ns, void *data)
399 {
400 RS_LOGE("RSScreenManager::OnScreenVBlankIdle devId:%{public}u, ns:%{public}" PRIu64 "", devId, ns);
401 RS_TRACE_NAME_FMT("OnScreenVBlankIdle devId:%u, ns:%" PRIu64 "", devId, ns);
402 CreateVSyncSampler()->StartSample(true);
403 RSScreenManager *screenManager = static_cast<RSScreenManager *>(RSScreenManager::GetInstance().GetRefPtr());
404 if (screenManager == nullptr) {
405 RS_LOGE("RSScreenManager %{public}s: Failed to find RSScreenManager instance.", __func__);
406 return;
407 }
408 screenManager->OnScreenVBlankIdleEvent(devId, ns);
409 }
410
OnScreenVBlankIdleEvent(uint32_t devId,uint64_t ns)411 void RSScreenManager::OnScreenVBlankIdleEvent(uint32_t devId, uint64_t ns)
412 {
413 std::lock_guard<std::mutex> lock(mutex_);
414 ScreenId screenId = ToScreenId(devId);
415 if (screens_.count(screenId) == 0) {
416 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, screenId);
417 return;
418 }
419 RSHardwareThread::Instance().PostTask([screenId, ns]() {
420 RSHardwareThread::Instance().OnScreenVBlankIdleCallback(screenId, ns);
421 });
422 }
423
CleanAndReinit()424 void RSScreenManager::CleanAndReinit()
425 {
426 RSScreenManager *screenManager = static_cast<RSScreenManager *>(RSScreenManager::GetInstance().GetRefPtr());
427 if (screenManager == nullptr) {
428 RS_LOGE("RSScreenManager %{public}s: Failed to find RSScreenManager instance.", __func__);
429 return;
430 }
431
432 auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
433 if (renderType != UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
434 auto mainThread = RSMainThread::Instance();
435 if (mainThread == nullptr) {
436 RS_LOGE("RSScreenManager %{public}s: Reinit failed, get RSMainThread failed.", __func__);
437 return;
438 }
439 mainThread->PostTask([screenManager, this]() {
440 screenManager->OnHwcDeadEvent();
441 if (!composer_) {
442 RS_LOGE("RSScreenManager %{public}s: Failed to get composer.", __func__);
443 return;
444 }
445 composer_->ResetDevice();
446 if (!screenManager->Init()) {
447 RS_LOGE("RSScreenManager %{public}s: Reinit failed, screenManager init failed in mainThread.",
448 __func__);
449 return;
450 }
451 });
452 } else {
453 RSHardwareThread::Instance().PostTask([screenManager, this]() {
454 RS_LOGW("RSScreenManager %{public}s: clean and reinit in hardware thread.", __func__);
455 screenManager->OnHwcDeadEvent();
456 if (!composer_) {
457 RS_LOGE("RSScreenManager %{public}s: Failed to get composer.", __func__);
458 return;
459 }
460 composer_->ResetDevice();
461 if (!screenManager->Init()) {
462 RS_LOGE("RSScreenManager %{public}s: Reinit failed, screenManager init failed in HardwareThread.",
463 __func__);
464 return;
465 }
466 });
467 }
468 }
469
TrySimpleProcessHotPlugEvents()470 bool RSScreenManager::TrySimpleProcessHotPlugEvents()
471 {
472 std::lock_guard<std::mutex> lock(mutex_);
473 if (!isHwcDead_ && pendingHotPlugEvents_.empty() && connectedIds_.empty()) {
474 mipiCheckInFirstHotPlugEvent_ = true;
475 return true;
476 }
477 return false;
478 }
479
ProcessScreenHotPlugEvents()480 void RSScreenManager::ProcessScreenHotPlugEvents()
481 {
482 std::lock_guard<std::mutex> lock(mutex_);
483 for (auto &event : pendingHotPlugEvents_) {
484 if (event.connected) {
485 ProcessScreenConnectedLocked(event.output);
486 AddScreenToHgm(event.output);
487 } else {
488 ProcessScreenDisConnectedLocked(event.output);
489 RemoveScreenFromHgm(event.output);
490 }
491 }
492 for (auto id : connectedIds_) {
493 for (auto &cb : screenChangeCallbacks_) {
494 if (!isHwcDead_) {
495 cb->OnScreenChanged(id, ScreenEvent::CONNECTED);
496 continue;
497 }
498 }
499 auto screenIt = screens_.find(id);
500 if (screenIt == screens_.end() || screenIt->second == nullptr) {
501 continue;
502 }
503 auto screenCorrectionIt = screenCorrection_.find(id);
504 auto screenBacklightIt = screenBacklight_.find(id);
505 auto screenPowerStatusIt = screenPowerStatus_.find(id);
506 if (screenCorrectionIt != screenCorrection_.end()) {
507 screenIt->second->SetScreenCorrection(screenCorrectionIt->second);
508 }
509 if (screenBacklightIt != screenBacklight_.end() && (screenPowerStatusIt == screenPowerStatus_.end() ||
510 screenPowerStatusIt->second == ScreenPowerStatus::POWER_STATUS_ON)) {
511 screenIt->second->SetScreenBacklight(screenBacklightIt->second);
512 auto mainThread = RSMainThread::Instance();
513 mainThread->PostTask([mainThread]() {
514 mainThread->SetDirtyFlag();
515 });
516 mainThread->ForceRefreshForUni();
517 }
518 }
519 isHwcDead_ = false;
520 mipiCheckInFirstHotPlugEvent_ = true;
521 pendingHotPlugEvents_.clear();
522 connectedIds_.clear();
523 }
524
AddScreenToHgm(std::shared_ptr<HdiOutput> & output)525 void RSScreenManager::AddScreenToHgm(std::shared_ptr<HdiOutput> &output)
526 {
527 if (output == nullptr) {
528 RS_LOGE("RSScreenManager %{public}s: output is nullptr.", __func__);
529 return;
530 }
531 RS_LOGI("RSScreenManager AddScreenToHgm");
532 auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
533 ScreenId thisId = ToScreenId(output->GetScreenId());
534 auto screensIt = screens_.find(thisId);
535 if (screensIt == screens_.end()) {
536 RS_LOGE("RSScreenManager invalid screen id, screen not found : %{public}" PRIu64 "", thisId);
537 return;
538 }
539
540 int32_t initModeId = 0;
541 if (screensIt->second == nullptr) {
542 RS_LOGW("AddScreenToHgm:screen %{public}" PRIu64 " not found", thisId);
543 return;
544 }
545 const auto &screen = screensIt->second;
546 auto initMode = screen->GetActiveMode();
547 if (!initMode) {
548 RS_LOGE("RSScreenManager failed to get initial mode");
549 } else {
550 initModeId = initMode->id;
551 }
552 const auto &capability = screen->GetCapability();
553 ScreenSize screenSize = {screen->Width(), screen->Height(), capability.phyWidth, capability.phyHeight};
554 RS_LOGD_IF(DEBUG_SCREEN, "RSScreenManager add screen: w * h: [%{public}u * %{public}u], capability w * h: "
555 "[%{public}u * %{public}u]", screen->Width(), screen->Height(), capability.phyWidth, capability.phyHeight);
556 if (hgmCore.AddScreen(thisId, initModeId, screenSize)) {
557 RS_LOGW("RSScreenManager failed to add screen : %{public}" PRIu64 "", thisId);
558 return;
559 }
560 hgmCore.SetActiveScreenId(thisId);
561
562 // for each supported mode, use the index as modeId to add the detailed mode to hgm
563 int32_t modeId = 0;
564 auto supportedModes = screen->GetSupportedModes();
565 for (auto mode = supportedModes.begin(); mode != supportedModes.end(); ++mode) {
566 if (hgmCore.AddScreenInfo(thisId, (*mode).width, (*mode).height,
567 (*mode).freshRate, modeId)) {
568 RS_LOGW("RSScreenManager failed to add a screen profile to the screen : %{public}" PRIu64 "", thisId);
569 }
570 modeId++;
571 }
572 }
573
RemoveScreenFromHgm(std::shared_ptr<HdiOutput> & output)574 void RSScreenManager::RemoveScreenFromHgm(std::shared_ptr<HdiOutput> &output)
575 {
576 if (output == nullptr) {
577 RS_LOGE("RSScreenManager %{public}s: output is nullptr.", __func__);
578 return;
579 }
580
581 RS_LOGI("RSScreenManager RemoveScreenFromHgm");
582 auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
583 ScreenId id = ToScreenId(output->GetScreenId());
584 RS_LOGD_IF(DEBUG_SCREEN, "RSScreenManager remove screen, id: %{public}" PRIu64 "", id);
585 if (hgmCore.RemoveScreen(id)) {
586 RS_LOGW("RSScreenManager failed to remove screen : %{public}" PRIu64 "", id);
587 }
588 }
589
ProcessScreenConnectedLocked(std::shared_ptr<HdiOutput> & output)590 void RSScreenManager::ProcessScreenConnectedLocked(std::shared_ptr<HdiOutput> &output)
591 {
592 if (output == nullptr) {
593 RS_LOGE("RSScreenManager %{public}s: output is nullptr.", __func__);
594 return;
595 }
596
597 bool isVirtual = false;
598 ScreenId id = ToScreenId(output->GetScreenId());
599 RS_LOGI("RSScreenManager %{public}s The screen for id %{public}" PRIu64 " connected.", __func__, id);
600
601 auto it = screens_.find(id);
602 if (it != screens_.end() && it->second != nullptr) {
603 RS_LOGW("RSScreenManager %{public}s The screen for id %{public}" PRIu64 " already existed.", __func__, id);
604
605 // [PLANNING]: should we erase it and create a new one?
606 for (auto &cb : screenChangeCallbacks_) {
607 cb->OnScreenChanged(id, ScreenEvent::DISCONNECTED);
608 }
609 screens_.erase(it);
610 RS_LOGI("The screen for id %{public}" PRIu64 " already existed, remove the orignal one.", id);
611 }
612
613 screens_[id] = std::make_unique<RSScreen>(id, isVirtual, output, nullptr);
614
615 auto vsyncSampler = CreateVSyncSampler();
616
617 if (RSSystemProperties::IsPcType() || RSSystemProperties::IsTabletType()) {
618 screens_[id]->SetDisplayPropertyForHardCursor();
619 }
620 auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
621 if (renderType != UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
622 RegSetScreenVsyncEnabledCallbackForMainThread(id);
623 } else {
624 RegSetScreenVsyncEnabledCallbackForHardwareThread(id);
625 }
626
627 if (screens_[id]->GetCapability().type == GraphicInterfaceType::GRAPHIC_DISP_INTF_MIPI) {
628 if (!mipiCheckInFirstHotPlugEvent_) {
629 defaultScreenId_ = id;
630 }
631 mipiCheckInFirstHotPlugEvent_ = true;
632 } else if (defaultScreenId_ == INVALID_SCREEN_ID) {
633 defaultScreenId_ = id;
634 }
635
636 RS_LOGI("RSScreenManager %{public}s: A new screen(id %{public}" PRIu64 ") connected.", __func__, id);
637 connectedIds_.emplace_back(id);
638 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
639 if (isFoldScreenFlag_ && id != 0) {
640 externalScreenId_ = id;
641 }
642 #endif
643 }
644
ProcessScreenDisConnectedLocked(std::shared_ptr<HdiOutput> & output)645 void RSScreenManager::ProcessScreenDisConnectedLocked(std::shared_ptr<HdiOutput> &output)
646 {
647 ScreenId id = ToScreenId(output->GetScreenId());
648 RS_LOGD_IF(DEBUG_SCREEN, "RSScreenManager process screen disconnected, id: %{public}" PRIu64 "", id);
649 auto screensIt = screens_.find(id);
650 if (screensIt == screens_.end()) {
651 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64, __func__, id);
652 } else {
653 for (auto &cb : screenChangeCallbacks_) {
654 cb->OnScreenChanged(id, ScreenEvent::DISCONNECTED);
655 }
656 screens_.erase(screensIt);
657 RS_LOGI("RSScreenManager %{public}s: Screen(id %{public}" PRIu64 ") disconnected.", __func__, id);
658 }
659 screenPowerStatus_.erase(id);
660 screenBacklight_.erase(id);
661 screenCorrection_.erase(id);
662 if (id == defaultScreenId_) {
663 HandleDefaultScreenDisConnectedLocked();
664 }
665
666 ScreenId vsyncEnabledScreenId = INVALID_SCREEN_ID;
667 auto it = screens_.end();
668 if (screens_.size() != 0) {
669 vsyncEnabledScreenId = (--it)->first;
670 }
671 auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
672 if (renderType != UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
673 RegSetScreenVsyncEnabledCallbackForMainThread(vsyncEnabledScreenId);
674 } else {
675 RegSetScreenVsyncEnabledCallbackForHardwareThread(vsyncEnabledScreenId);
676 }
677 }
678
RegSetScreenVsyncEnabledCallbackForMainThread(ScreenId vsyncEnabledScreenId)679 void RSScreenManager::RegSetScreenVsyncEnabledCallbackForMainThread(ScreenId vsyncEnabledScreenId)
680 {
681 auto vsyncSampler = CreateVSyncSampler();
682 if (vsyncSampler == nullptr) {
683 RS_LOGE("RegSetScreenVsyncEnabledCallbackForMainThread failed, vsyncSampler is null");
684 return;
685 }
686 vsyncSampler->RegSetScreenVsyncEnabledCallback([this, vsyncEnabledScreenId](bool enabled) {
687 auto mainThread = RSMainThread::Instance();
688 if (mainThread == nullptr) {
689 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, get RSMainThread failed", enabled);
690 return;
691 }
692 mainThread->PostTask([this, vsyncEnabledScreenId, enabled]() {
693 std::lock_guard<std::mutex> lock(mutex_);
694 auto screensIt = screens_.find(vsyncEnabledScreenId);
695 if (screensIt == screens_.end() || screensIt->second == nullptr) {
696 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, screen %{public}" PRIu64 " not found",
697 enabled, vsyncEnabledScreenId);
698 return;
699 }
700 screensIt->second->SetScreenVsyncEnabled(enabled);
701 });
702 });
703 }
704
RegSetScreenVsyncEnabledCallbackForHardwareThread(ScreenId vsyncEnabledScreenId)705 void RSScreenManager::RegSetScreenVsyncEnabledCallbackForHardwareThread(ScreenId vsyncEnabledScreenId)
706 {
707 auto vsyncSampler = CreateVSyncSampler();
708 if (vsyncSampler == nullptr) {
709 RS_LOGE("RegSetScreenVsyncEnabledCallbackForHardwareThread failed, vsyncSampler is null");
710 return;
711 }
712 vsyncSampler->RegSetScreenVsyncEnabledCallback([this, vsyncEnabledScreenId](bool enabled) {
713 RSHardwareThread::Instance().PostTask([this, vsyncEnabledScreenId, enabled]() {
714 std::lock_guard<std::mutex> lock(mutex_);
715 auto screensIt = screens_.find(vsyncEnabledScreenId);
716 if (screensIt == screens_.end() || screensIt->second == nullptr) {
717 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, screen %{public}" PRIu64 " not found",
718 enabled, vsyncEnabledScreenId);
719 return;
720 }
721 screensIt->second->SetScreenVsyncEnabled(enabled);
722 });
723 });
724 }
725
726 // If the previous primary screen disconnected, we traversal the left screens
727 // and find the first physical screen to be the default screen.
728 // If there was no physical screen left, we set the first screen as default, no matter what type it is.
729 // At last, if no screen left, we set Default Screen Id to INVALID_SCREEN_ID.
HandleDefaultScreenDisConnectedLocked()730 void RSScreenManager::HandleDefaultScreenDisConnectedLocked()
731 {
732 defaultScreenId_ = INVALID_SCREEN_ID;
733 for (const auto &[id, screen] : screens_) {
734 if (screen == nullptr) {
735 RS_LOGW("HandleDefaultScreenDisConnectedLocked:screen %{public}" PRIu64 " not found", id);
736 continue;
737 }
738 if (!screen->IsVirtual()) {
739 defaultScreenId_ = id;
740 break;
741 }
742 }
743
744 if (defaultScreenId_ == INVALID_SCREEN_ID) {
745 if (!screens_.empty()) {
746 defaultScreenId_ = screens_.cbegin()->first;
747 }
748 }
749 }
750
751 // if SetVirtualScreenSurface success, force a refresh of one frame, avoiding prolong black screen
ForceRefreshOneFrame() const752 void RSScreenManager::ForceRefreshOneFrame() const
753 {
754 auto mainThread = RSMainThread::Instance();
755 if (mainThread != nullptr) {
756 mainThread->PostTask([mainThread]() {
757 mainThread->SetDirtyFlag();
758 });
759 mainThread->ForceRefreshForUni();
760 }
761 }
762
SetDefaultScreenId(ScreenId id)763 void RSScreenManager::SetDefaultScreenId(ScreenId id)
764 {
765 std::lock_guard<std::mutex> lock(mutex_);
766 defaultScreenId_ = id;
767 }
768
SetScreenMirror(ScreenId id,ScreenId toMirror)769 void RSScreenManager::SetScreenMirror(ScreenId id, ScreenId toMirror)
770 {
771 std::lock_guard<std::mutex> lock(mutex_);
772
773 auto screensIt = screens_.find(id);
774 if (screensIt == screens_.end() || screensIt->second == nullptr) {
775 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
776 return;
777 }
778
779 screensIt->second->SetMirror(toMirror);
780 }
781
GenerateVirtualScreenIdLocked()782 ScreenId RSScreenManager::GenerateVirtualScreenIdLocked()
783 {
784 if (!freeVirtualScreenIds_.empty()) {
785 ScreenId id = freeVirtualScreenIds_.front();
786 freeVirtualScreenIds_.pop();
787 return id;
788 }
789
790 // The left 32 bits is for virtual screen id.
791 return (static_cast<ScreenId>(virtualScreenCount_++) << 32) | 0xffffffffu;
792 }
793
ReuseVirtualScreenIdLocked(ScreenId id)794 void RSScreenManager::ReuseVirtualScreenIdLocked(ScreenId id)
795 {
796 freeVirtualScreenIds_.push(id);
797 }
798
GetVirtualScreenResolutionLocked(ScreenId id,RSVirtualScreenResolution & virtualScreenResolution) const799 void RSScreenManager::GetVirtualScreenResolutionLocked(ScreenId id,
800 RSVirtualScreenResolution& virtualScreenResolution) const
801 {
802 auto screensIt = screens_.find(id);
803 if (screensIt == screens_.end() || screensIt->second == nullptr) {
804 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
805 return;
806 }
807 const auto& screen = screensIt->second;
808 virtualScreenResolution.SetVirtualScreenWidth(static_cast<uint32_t>(screen->Width()));
809 virtualScreenResolution.SetVirtualScreenHeight(static_cast<uint32_t>(screen->Height()));
810 }
811
GetScreenActiveModeLocked(ScreenId id,RSScreenModeInfo & screenModeInfo) const812 void RSScreenManager::GetScreenActiveModeLocked(ScreenId id, RSScreenModeInfo& screenModeInfo) const
813 {
814 auto screensIt = screens_.find(id);
815 if (screensIt == screens_.end() || screensIt->second == nullptr) {
816 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
817 return;
818 }
819 const auto& screen = screensIt->second;
820 auto modeInfo = screen->GetActiveMode();
821 if (!modeInfo) {
822 RS_LOGE("RSScreenManager %{public}s: Failed to get active mode for screen %{public}" PRIu64 ".", __func__, id);
823 return;
824 }
825
826 screenModeInfo.SetScreenWidth(modeInfo->width);
827 screenModeInfo.SetScreenHeight(modeInfo->height);
828 screenModeInfo.SetScreenRefreshRate(modeInfo->freshRate);
829 screenModeInfo.SetScreenModeId(screen->GetActiveModePosByModeId(modeInfo->id));
830 }
831
GetScreenSupportedModesLocked(ScreenId id) const832 std::vector<RSScreenModeInfo> RSScreenManager::GetScreenSupportedModesLocked(ScreenId id) const
833 {
834 std::vector<RSScreenModeInfo> screenSupportedModes;
835 auto screensIt = screens_.find(id);
836 if (screensIt == screens_.end() || screensIt->second == nullptr) {
837 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
838 return screenSupportedModes;
839 }
840
841 const auto& displaySupportedModes = screensIt->second->GetSupportedModes();
842 screenSupportedModes.resize(displaySupportedModes.size());
843 for (decltype(displaySupportedModes.size()) idx = 0; idx < displaySupportedModes.size(); ++idx) {
844 screenSupportedModes[idx].SetScreenWidth(displaySupportedModes[idx].width);
845 screenSupportedModes[idx].SetScreenHeight(displaySupportedModes[idx].height);
846 screenSupportedModes[idx].SetScreenRefreshRate(displaySupportedModes[idx].freshRate);
847 screenSupportedModes[idx].SetScreenModeId(displaySupportedModes[idx].id);
848 }
849 return screenSupportedModes;
850 }
851
GetScreenCapabilityLocked(ScreenId id) const852 RSScreenCapability RSScreenManager::GetScreenCapabilityLocked(ScreenId id) const
853 {
854 RSScreenCapability screenCapability;
855 auto screensIt = screens_.find(id);
856 if (screensIt == screens_.end() || screensIt->second == nullptr) {
857 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
858 return screenCapability;
859 }
860 const auto& screen = screensIt->second;
861 if (screen->IsVirtual()) {
862 RS_LOGW("RSScreenManager %{public}s: only name attribute is valid for virtual screen.", __func__);
863 screenCapability.SetName(screen->Name());
864 return screenCapability;
865 }
866
867 const auto& capability = screen->GetCapability();
868 std::vector<RSScreenProps> props;
869 uint32_t propCount = capability.propertyCount;
870 props.resize(propCount);
871 for (uint32_t propIndex = 0; propIndex < propCount; propIndex++) {
872 props[propIndex] = RSScreenProps(capability.props[propIndex].name, capability.props[propIndex].propId,
873 capability.props[propIndex].value);
874 }
875 screenCapability.SetName(capability.name);
876 screenCapability.SetType(static_cast<ScreenInterfaceType>(capability.type));
877 screenCapability.SetPhyWidth(capability.phyWidth);
878 screenCapability.SetPhyHeight(capability.phyHeight);
879 screenCapability.SetSupportLayers(capability.supportLayers);
880 screenCapability.SetVirtualDispCount(capability.virtualDispCount);
881 screenCapability.SetSupportWriteBack(capability.supportWriteBack);
882 screenCapability.SetProps(props);
883 return screenCapability;
884 }
885
GetScreenPowerStatusLocked(ScreenId id) const886 ScreenPowerStatus RSScreenManager::GetScreenPowerStatusLocked(ScreenId id) const
887 {
888 auto screensIt = screens_.find(id);
889 if (screensIt == screens_.end() || screensIt->second == nullptr) {
890 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
891 return INVALID_POWER_STATUS;
892 }
893
894 ScreenPowerStatus status = static_cast<ScreenPowerStatus>(screensIt->second->GetPowerStatus());
895 return status;
896 }
897
GetScreenCorrectionLocked(ScreenId id) const898 ScreenRotation RSScreenManager::GetScreenCorrectionLocked(ScreenId id) const
899 {
900 auto screensIt = screens_.find(id);
901 if (screensIt == screens_.end() || screensIt->second == nullptr) {
902 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
903 return ScreenRotation::INVALID_SCREEN_ROTATION;
904 }
905
906 ScreenRotation screenRotation = screensIt->second->GetScreenCorrection();
907 return screenRotation;
908 }
909
GetAllScreenIds() const910 std::vector<ScreenId> RSScreenManager::GetAllScreenIds() const
911 {
912 std::lock_guard<std::mutex> lock(mutex_);
913 std::vector<ScreenId> ids;
914 for (auto iter = screens_.begin(); iter != screens_.end(); ++iter) {
915 ids.emplace_back(iter->first);
916 }
917 return ids;
918 }
919
CreateVirtualScreen(const std::string & name,uint32_t width,uint32_t height,sptr<Surface> surface,ScreenId mirrorId,int32_t flags,std::vector<NodeId> whiteList)920 ScreenId RSScreenManager::CreateVirtualScreen(
921 const std::string &name,
922 uint32_t width,
923 uint32_t height,
924 sptr<Surface> surface,
925 ScreenId mirrorId,
926 int32_t flags,
927 std::vector<NodeId> whiteList)
928 {
929 std::lock_guard<std::mutex> lock(mutex_);
930
931 if (currentVirtualScreenNum_ >= MAX_VIRTUAL_SCREEN_NUM) {
932 RS_LOGW("RSScreenManager %{public}s: virtual screens num %{public}" PRIu32" has reached the maximum limit!",
933 __func__, currentVirtualScreenNum_);
934 return INVALID_SCREEN_ID;
935 }
936 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
937 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
938 " the maximum limit!", __func__, width, height);
939 return INVALID_SCREEN_ID;
940 }
941 if (surface != nullptr) {
942 uint64_t surfaceId = surface->GetUniqueId();
943 for (auto &[_, screen] : screens_) {
944 if (screen == nullptr || !screen->IsVirtual()) {
945 continue;
946 }
947 auto screenSurface = screen->GetProducerSurface();
948 if (screenSurface == nullptr) {
949 continue;
950 }
951 if (screenSurface->GetUniqueId() == surfaceId) {
952 RS_LOGW("RSScreenManager %{public}s: surface %{public}" PRIu64 " is used, create virtual"
953 " screen failed!", __func__, surfaceId);
954 return INVALID_SCREEN_ID;
955 }
956 }
957 } else {
958 RS_LOGD("RSScreenManager %{public}s: surface is nullptr.", __func__);
959 }
960
961 VirtualScreenConfigs configs;
962 ScreenId newId = GenerateVirtualScreenIdLocked();
963 configs.id = newId;
964 configs.mirrorId = mirrorId;
965 configs.name = name;
966 configs.width = width;
967 configs.height = height;
968 configs.surface = surface;
969 configs.flags = flags;
970 configs.whiteList = std::unordered_set<NodeId>(whiteList.begin(), whiteList.end());
971
972 screens_[newId] = std::make_unique<RSScreen>(configs);
973 ++currentVirtualScreenNum_;
974 RS_LOGD("RSScreenManager %{public}s: create virtual screen(id %{public}" PRIu64 ").", __func__, newId);
975 return newId;
976 }
977
GetCastScreenBlackList(std::unordered_set<uint64_t> & screenBlackList)978 void RSScreenManager::GetCastScreenBlackList(std::unordered_set<uint64_t>& screenBlackList)
979 {
980 std::lock_guard<std::mutex> lock(blackListMutex_);
981 screenBlackList = castScreenBlackLists_;
982 }
983
SetCastScreenBlackList(std::unordered_set<uint64_t> & screenBlackList)984 void RSScreenManager::SetCastScreenBlackList(std::unordered_set<uint64_t>& screenBlackList)
985 {
986 std::lock_guard<std::mutex> lock(blackListMutex_);
987 castScreenBlackLists_ = screenBlackList;
988 }
989
SetVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)990 int32_t RSScreenManager::SetVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
991 {
992 std::unordered_set<NodeId> screenBlackList(blackList.begin(), blackList.end());
993 if (id == INVALID_SCREEN_ID) {
994 RS_LOGD("RSScreenManager %{public}s: CastScreenBlackLists.", __func__);
995 SetCastScreenBlackList(screenBlackList);
996 return SUCCESS;
997 }
998 std::lock_guard<std::mutex> lock(mutex_);
999 auto virtualScreen = screens_.find(id);
1000 if (virtualScreen == screens_.end()) {
1001 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1002 return SCREEN_NOT_FOUND;
1003 } else {
1004 if (virtualScreen->second != nullptr) {
1005 virtualScreen->second->SetBlackList(screenBlackList);
1006 } else {
1007 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1008 return SCREEN_NOT_FOUND;
1009 }
1010 }
1011 ScreenId mainId = GetDefaultScreenId();
1012 if (mainId != id) {
1013 auto mainScreen = screens_.find(mainId);
1014 if (mainScreen == screens_.end()) {
1015 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1016 return SCREEN_NOT_FOUND;
1017 } else {
1018 if (mainScreen->second != nullptr) {
1019 mainScreen->second->SetBlackList(screenBlackList);
1020 } else {
1021 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, mainId);
1022 return SCREEN_NOT_FOUND;
1023 }
1024 }
1025 }
1026 return SUCCESS;
1027 }
1028
AddVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)1029 int32_t RSScreenManager::AddVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
1030 {
1031 std::lock_guard<std::mutex> lock(mutex_);
1032 if (id == INVALID_SCREEN_ID) {
1033 RS_LOGI("RSScreenManager %{public}s: Cast screen blacklists", __func__);
1034 for (auto& list : blackList) {
1035 castScreenBlackLists_.emplace(list);
1036 }
1037 return SUCCESS;
1038 }
1039 auto virtualScreen = screens_.find(id);
1040 if (virtualScreen == screens_.end() || virtualScreen->second == nullptr) {
1041 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1042 return SCREEN_NOT_FOUND;
1043 }
1044 RS_LOGI("RSScreenManager %{public}s: Record screen blacklists for id %{public}" PRIu64 ".", __func__, id);
1045 virtualScreen->second->AddBlackList(blackList);
1046
1047 ScreenId mainId = GetDefaultScreenId();
1048 if (mainId != id) {
1049 auto mainScreen = screens_.find(mainId);
1050 if (mainScreen == screens_.end() || mainScreen->second == nullptr) {
1051 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1052 return SCREEN_NOT_FOUND;
1053 }
1054 mainScreen->second->AddBlackList(blackList);
1055 }
1056 return SUCCESS;
1057 }
1058
RemoveVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)1059 int32_t RSScreenManager::RemoveVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
1060 {
1061 std::lock_guard<std::mutex> lock(mutex_);
1062 if (id == INVALID_SCREEN_ID) {
1063 RS_LOGI("RSScreenManager %{public}s: Cast screen blacklists", __func__);
1064 for (auto& list : blackList) {
1065 auto it = castScreenBlackLists_.find(list);
1066 if (it == castScreenBlackLists_.end()) {
1067 continue;
1068 }
1069 castScreenBlackLists_.erase(it);
1070 }
1071 return SUCCESS;
1072 }
1073 auto virtualScreen = screens_.find(id);
1074 if (virtualScreen == screens_.end() || virtualScreen->second == nullptr) {
1075 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1076 return SCREEN_NOT_FOUND;
1077 }
1078 RS_LOGI("RSScreenManager %{public}s: Record screen blacklists for id %{public}" PRIu64 ".", __func__, id);
1079 virtualScreen->second->RemoveBlackList(blackList);
1080
1081 ScreenId mainId = GetDefaultScreenId();
1082 if (mainId != id) {
1083 auto mainScreen = screens_.find(mainId);
1084 if (mainScreen == screens_.end() || mainScreen->second == nullptr) {
1085 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1086 return SCREEN_NOT_FOUND;
1087 }
1088 mainScreen->second->RemoveBlackList(blackList);
1089 }
1090 return SUCCESS;
1091 }
1092
SetVirtualScreenSecurityExemptionList(ScreenId id,const std::vector<uint64_t> & securityExemptionList)1093 int32_t RSScreenManager::SetVirtualScreenSecurityExemptionList(
1094 ScreenId id,
1095 const std::vector<uint64_t>& securityExemptionList)
1096 {
1097 if (id == INVALID_SCREEN_ID) {
1098 RS_LOGD("RSScreenManager %{public}s: INVALID_SCREEN_ID.", __func__);
1099 return INVALID_ARGUMENTS;
1100 }
1101 std::lock_guard<std::mutex> lock(mutex_);
1102 auto virtualScreen = screens_.find(id);
1103 if (virtualScreen == screens_.end()) {
1104 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1105 return SCREEN_NOT_FOUND;
1106 }
1107
1108 if (virtualScreen->second == nullptr) {
1109 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1110 return SCREEN_NOT_FOUND;
1111 }
1112 if (!(virtualScreen->second->IsVirtual())) {
1113 RS_LOGW("RSScreenManager %{public}s: not virtual screen for id %{public}" PRIu64 ".", __func__, id);
1114 return INVALID_ARGUMENTS;
1115 }
1116 virtualScreen->second->SetSecurityExemptionList(securityExemptionList);
1117 for (const auto& exemption : securityExemptionList) {
1118 RS_LOGD("RSScreenManager %{public}s: virtual screen(id %{public}" PRIu64 "), nodeId %{public}" PRIu64 ".",
1119 __func__, id, exemption);
1120 }
1121 return SUCCESS;
1122 }
1123
GetVirtualScreenSecurityExemptionList(ScreenId id) const1124 const std::vector<uint64_t> RSScreenManager::GetVirtualScreenSecurityExemptionList(ScreenId id) const
1125 {
1126 std::lock_guard<std::mutex> lock(mutex_);
1127 auto virtualScreen = screens_.find(id);
1128 if (virtualScreen == screens_.end()) {
1129 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1130 return {};
1131 }
1132
1133 if (virtualScreen->second == nullptr) {
1134 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1135 return {};
1136 }
1137 return virtualScreen->second->GetSecurityExemptionList();
1138 }
1139
SetCastScreenEnableSkipWindow(ScreenId id,bool enable)1140 int32_t RSScreenManager::SetCastScreenEnableSkipWindow(ScreenId id, bool enable)
1141 {
1142 std::lock_guard<std::mutex> lock(mutex_);
1143 auto virtualScreen = screens_.find(id);
1144 if (virtualScreen == screens_.end()) {
1145 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1146 return SCREEN_NOT_FOUND;
1147 } else {
1148 if (virtualScreen->second != nullptr) {
1149 virtualScreen->second->SetCastScreenEnableSkipWindow(enable);
1150 return SUCCESS;
1151 } else {
1152 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1153 return SCREEN_NOT_FOUND;
1154 }
1155 }
1156 }
1157
GetCastScreenEnableSkipWindow(ScreenId id)1158 bool RSScreenManager::GetCastScreenEnableSkipWindow(ScreenId id)
1159 {
1160 std::lock_guard<std::mutex> lock(mutex_);
1161 auto virtualScreen = screens_.find(id);
1162 if (virtualScreen == screens_.end()) {
1163 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1164 return false;
1165 } else {
1166 if (virtualScreen->second != nullptr) {
1167 return virtualScreen->second->GetCastScreenEnableSkipWindow();
1168 } else {
1169 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1170 return false;
1171 }
1172 }
1173 }
1174
GetVirtualScreenBlackList(ScreenId id)1175 std::unordered_set<NodeId> RSScreenManager::GetVirtualScreenBlackList(ScreenId id)
1176 {
1177 std::lock_guard<std::mutex> lock(mutex_);
1178 auto virtualScreen = screens_.find(id);
1179 if (virtualScreen == screens_.end()) {
1180 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1181 return {};
1182 } else {
1183 if (virtualScreen->second != nullptr) {
1184 return virtualScreen->second->GetBlackList();
1185 } else {
1186 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1187 return {};
1188 }
1189 }
1190 }
1191
SetVirtualScreenSurface(ScreenId id,sptr<Surface> surface)1192 int32_t RSScreenManager::SetVirtualScreenSurface(ScreenId id, sptr<Surface> surface)
1193 {
1194 std::lock_guard<std::mutex> lock(mutex_);
1195 auto screensIt = screens_.find(id);
1196 if (screensIt == screens_.end() || screensIt->second == nullptr || surface == nullptr) {
1197 return SCREEN_NOT_FOUND;
1198 }
1199 uint64_t surfaceId = surface->GetUniqueId();
1200 for (auto &[screenId, screen] : screens_) {
1201 if (screen == nullptr) {
1202 RS_LOGW("SetVirtualScreenSurface:screen %{public}" PRIu64 " not found", screenId);
1203 continue;
1204 }
1205 if (!screen->IsVirtual() || screenId == id) {
1206 continue;
1207 }
1208 auto screenSurface = screen->GetProducerSurface();
1209 if (screenSurface == nullptr) {
1210 continue;
1211 }
1212 if (screenSurface->GetUniqueId() == surface->GetUniqueId()) {
1213 RS_LOGE("RSScreenManager %{public}s: surface %{public}" PRIu64 " is used, set surface failed!",
1214 __func__, surfaceId);
1215 return SURFACE_NOT_UNIQUE;
1216 }
1217 }
1218 screensIt->second->SetProducerSurface(surface);
1219 RS_LOGD("RSScreenManager %{public}s: set virtual screen surface success!", __func__);
1220 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetVirtualScreenSurface, ForceRefreshOneFrame.");
1221 ForceRefreshOneFrame();
1222 return SUCCESS;
1223 }
1224
GetAndResetVirtualSurfaceUpdateFlag(ScreenId id) const1225 bool RSScreenManager::GetAndResetVirtualSurfaceUpdateFlag(ScreenId id) const
1226 {
1227 std::lock_guard<std::mutex> lock(mutex_);
1228 auto virtualScreen = screens_.find(id);
1229 if (virtualScreen == screens_.end()) {
1230 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1231 return false;
1232 }
1233 if (virtualScreen->second != nullptr) {
1234 return virtualScreen->second->GetAndResetVirtualSurfaceUpdateFlag();
1235 } else {
1236 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1237 return false;
1238 }
1239 }
1240
RemoveVirtualScreen(ScreenId id)1241 void RSScreenManager::RemoveVirtualScreen(ScreenId id)
1242 {
1243 std::lock_guard<std::mutex> lock(mutex_);
1244
1245 RemoveVirtualScreenLocked(id);
1246 }
1247
RemoveVirtualScreenLocked(ScreenId id)1248 void RSScreenManager::RemoveVirtualScreenLocked(ScreenId id)
1249 {
1250 auto screensIt = screens_.find(id);
1251 if (screensIt == screens_.end()) {
1252 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1253 return;
1254 }
1255
1256 screens_.erase(screensIt);
1257 --currentVirtualScreenNum_;
1258
1259 // Update other screens' mirrorId.
1260 for (auto &[id, screen] : screens_) {
1261 if (screen == nullptr) {
1262 RS_LOGW("RemoveVirtualScreenLocked:screen %{public}" PRIu64 " not found", id);
1263 continue;
1264 }
1265 if (screen->MirrorId() == id) {
1266 screen->SetMirror(INVALID_SCREEN_ID);
1267 }
1268 }
1269 RS_LOGD("RSScreenManager %{public}s: remove virtual screen(id %{public}" PRIu64 ").", __func__, id);
1270
1271 ReuseVirtualScreenIdLocked(id);
1272
1273 disableRenderControlScreens_.erase(id);
1274 }
1275
SetScreenActiveMode(ScreenId id,uint32_t modeId)1276 void RSScreenManager::SetScreenActiveMode(ScreenId id, uint32_t modeId)
1277 {
1278 std::lock_guard<std::mutex> lock(mutex_);
1279
1280 auto screensIt = screens_.find(id);
1281 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1282 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1283 return;
1284 }
1285 screensIt->second->SetActiveMode(modeId);
1286 }
1287
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)1288 int32_t RSScreenManager::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
1289 {
1290 std::lock_guard<std::mutex> lock(mutex_);
1291
1292 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
1293 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
1294 " the maximum limit!", __func__, width, height);
1295 return INVALID_ARGUMENTS;
1296 }
1297 auto screensIt = screens_.find(id);
1298 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1299 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1300 return SCREEN_NOT_FOUND;
1301 }
1302 screensIt->second->SetResolution(width, height);
1303 RS_LOGD("RSScreenManager %{public}s: set virtual screen resolution success", __func__);
1304 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetVirtualScreenResolution, ForceRefreshOneFrame.");
1305 ForceRefreshOneFrame();
1306 return SUCCESS;
1307 }
1308
SetRogScreenResolution(ScreenId id,uint32_t width,uint32_t height)1309 int32_t RSScreenManager::SetRogScreenResolution(ScreenId id, uint32_t width, uint32_t height)
1310 {
1311 std::lock_guard<std::mutex> lock(mutex_);
1312
1313 auto screensIt = screens_.find(id);
1314 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1315 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1316 return SCREEN_NOT_FOUND;
1317 }
1318 screensIt->second->SetRogResolution(width, height);
1319 return SUCCESS;
1320 }
1321
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)1322 void RSScreenManager::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
1323 {
1324 std::lock_guard<std::mutex> lock(mutex_);
1325
1326 auto screensIt = screens_.find(id);
1327 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1328 RS_LOGW("[UL_POWER]RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1329 return;
1330 }
1331 screensIt->second->SetPowerStatus(static_cast<uint32_t>(status));
1332
1333 /*
1334 * If app adds the first frame when power on the screen, delete the code
1335 */
1336 if (status == ScreenPowerStatus::POWER_STATUS_ON ||
1337 status == ScreenPowerStatus::POWER_STATUS_ON_ADVANCED) {
1338 auto mainThread = RSMainThread::Instance();
1339 if (mainThread == nullptr) {
1340 return;
1341 }
1342 mainThread->PostTask([mainThread]() {
1343 mainThread->SetDirtyFlag();
1344 mainThread->SetScreenPowerOnChanged(true);
1345 });
1346 if (screenPowerStatus_.count(id) == 0 ||
1347 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF ||
1348 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF_FAKE ||
1349 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF_ADVANCED) {
1350 mainThread->ForceRefreshForUni();
1351 } else {
1352 mainThread->RequestNextVSync();
1353 }
1354
1355 RS_LOGD("[UL_POWER]RSScreenManager %{public}s: PowerStatus %{public}d, request a frame", __func__, status);
1356 }
1357 screenPowerStatus_[id] = status;
1358 }
1359
SetVirtualMirrorScreenCanvasRotation(ScreenId id,bool canvasRotation)1360 bool RSScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId id, bool canvasRotation)
1361 {
1362 std::lock_guard<std::mutex> lock(mutex_);
1363
1364 auto screensIt = screens_.find(id);
1365 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1366 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1367 return false;
1368 }
1369
1370 RS_LOGD("RSScreenManager %{public}s: canvasRotation: %{public}d", __func__, canvasRotation);
1371
1372 return screensIt->second->SetVirtualMirrorScreenCanvasRotation(canvasRotation);
1373 }
1374
SetVirtualMirrorScreenScaleMode(ScreenId id,ScreenScaleMode scaleMode)1375 bool RSScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId id, ScreenScaleMode scaleMode)
1376 {
1377 std::lock_guard<std::mutex> lock(mutex_);
1378
1379 auto screensIt = screens_.find(id);
1380 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1381 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1382 return false;
1383 }
1384
1385 RS_LOGD("RSScreenManager %{public}s: scaleMode: %{public}d", __func__, scaleMode);
1386
1387 return screensIt->second->SetVirtualMirrorScreenScaleMode(scaleMode);
1388 }
1389
GetVirtualScreenResolution(ScreenId id,RSVirtualScreenResolution & virtualScreenResolution) const1390 void RSScreenManager::GetVirtualScreenResolution(ScreenId id, RSVirtualScreenResolution& virtualScreenResolution) const
1391 {
1392 std::lock_guard<std::mutex> lock(mutex_);
1393
1394 GetVirtualScreenResolutionLocked(id, virtualScreenResolution);
1395 }
1396
GetScreenActiveMode(ScreenId id,RSScreenModeInfo & screenModeInfo) const1397 void RSScreenManager::GetScreenActiveMode(ScreenId id, RSScreenModeInfo& screenModeInfo) const
1398 {
1399 std::lock_guard<std::mutex> lock(mutex_);
1400
1401 GetScreenActiveModeLocked(id, screenModeInfo);
1402 }
1403
GetScreenSupportedModes(ScreenId id) const1404 std::vector<RSScreenModeInfo> RSScreenManager::GetScreenSupportedModes(ScreenId id) const
1405 {
1406 std::lock_guard<std::mutex> lock(mutex_);
1407
1408 return GetScreenSupportedModesLocked(id);
1409 }
1410
GetScreenCapability(ScreenId id) const1411 RSScreenCapability RSScreenManager::GetScreenCapability(ScreenId id) const
1412 {
1413 std::lock_guard<std::mutex> lock(mutex_);
1414
1415 return GetScreenCapabilityLocked(id);
1416 }
1417
GetScreenPowerStatus(ScreenId id) const1418 ScreenPowerStatus RSScreenManager::GetScreenPowerStatus(ScreenId id) const
1419 {
1420 std::lock_guard<std::mutex> lock(mutex_);
1421
1422 return GetScreenPowerStatusLocked(id);
1423 }
1424
GetScreenCorrection(ScreenId id) const1425 ScreenRotation RSScreenManager::GetScreenCorrection(ScreenId id) const
1426 {
1427 std::lock_guard<std::mutex> lock(mutex_);
1428
1429 return GetScreenCorrectionLocked(id);
1430 }
1431
GetScreenData(ScreenId id) const1432 RSScreenData RSScreenManager::GetScreenData(ScreenId id) const
1433 {
1434 std::lock_guard<std::mutex> lock(mutex_);
1435 RSScreenData screenData;
1436 if (screens_.count(id) == 0) {
1437 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1438 return screenData;
1439 }
1440 RSScreenCapability capability = GetScreenCapabilityLocked(id);
1441 RSScreenModeInfo activeMode;
1442 GetScreenActiveModeLocked(id, activeMode);
1443 std::vector<RSScreenModeInfo> supportModes = GetScreenSupportedModesLocked(id);
1444 ScreenPowerStatus powerStatus = GetScreenPowerStatusLocked(id);
1445 screenData.SetCapability(capability);
1446 screenData.SetActivityModeInfo(activeMode);
1447 screenData.SetSupportModeInfo(supportModes);
1448 screenData.SetPowerStatus(powerStatus);
1449 return screenData;
1450 }
1451
ResizeVirtualScreen(ScreenId id,uint32_t width,uint32_t height)1452 int32_t RSScreenManager::ResizeVirtualScreen(ScreenId id, uint32_t width, uint32_t height)
1453 {
1454 std::lock_guard<std::mutex> lock(mutex_);
1455
1456 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
1457 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
1458 " the maximum limit!", __func__, width, height);
1459 return INVALID_ARGUMENTS;
1460 }
1461 auto screensIt = screens_.find(id);
1462 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1463 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1464 return SCREEN_NOT_FOUND;
1465 }
1466 screensIt->second->ResizeVirtualScreen(width, height);
1467 RS_LOGI("RSScreenManager %{public}s: resize virtual screen success, width:%{public}u, height:%{public}u",
1468 __func__, width, height);
1469
1470 return SUCCESS;
1471 }
1472
GetScreenBacklight(ScreenId id) const1473 int32_t RSScreenManager::GetScreenBacklight(ScreenId id) const
1474 {
1475 return GetScreenBacklightLocked(id);
1476 }
1477
GetScreenBacklightLocked(ScreenId id) const1478 int32_t RSScreenManager::GetScreenBacklightLocked(ScreenId id) const
1479 {
1480 std::shared_ptr<OHOS::Rosen::RSScreen> screen = nullptr;
1481 {
1482 std::lock_guard<std::mutex> lock(mutex_);
1483 auto screensIt = screens_.find(id);
1484 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1485 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1486 return INVALID_BACKLIGHT_VALUE;
1487 }
1488 screen = screensIt->second;
1489 }
1490 int32_t level = screen->GetScreenBacklight();
1491 return level;
1492 }
1493
SetScreenBacklight(ScreenId id,uint32_t level)1494 void RSScreenManager::SetScreenBacklight(ScreenId id, uint32_t level)
1495 {
1496 std::shared_ptr<OHOS::Rosen::RSScreen> screen = nullptr;
1497 {
1498 std::lock_guard<std::mutex> lock(mutex_);
1499 auto screensIt = screens_.find(id);
1500 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1501 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1502 return;
1503 }
1504 screenBacklight_[id] = level;
1505 screen = screensIt->second;
1506 }
1507 screen->SetScreenBacklight(level);
1508 }
1509
QueryDefaultScreenInfo() const1510 ScreenInfo RSScreenManager::QueryDefaultScreenInfo() const
1511 {
1512 std::lock_guard<std::mutex> lock(mutex_);
1513 return QueryScreenInfoLocked(defaultScreenId_);
1514 }
1515
QueryScreenInfo(ScreenId id) const1516 ScreenInfo RSScreenManager::QueryScreenInfo(ScreenId id) const
1517 {
1518 std::lock_guard<std::mutex> lock(mutex_);
1519 return QueryScreenInfoLocked(id);
1520 }
1521
QueryScreenInfoLocked(ScreenId id) const1522 ScreenInfo RSScreenManager::QueryScreenInfoLocked(ScreenId id) const
1523 {
1524 ScreenInfo info;
1525 auto screensIt = screens_.find(id);
1526 if (screensIt == screens_.end()) {
1527 RS_LOGD("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1528 return info;
1529 }
1530
1531 const auto &screen = screensIt->second;
1532 if (!screen) {
1533 RS_LOGE("RSScreenManager::QueryScreenInfo screen %{public}" PRIu64 " has no info.", id);
1534 return info;
1535 }
1536 info.id = id;
1537 info.width = screen->Width();
1538 info.height = screen->Height();
1539 info.phyWidth = screen->PhyWidth() ? screen->PhyWidth() : screen->Width();
1540 info.phyHeight = screen->PhyHeight() ? screen->PhyHeight() : screen->Height();
1541 auto ret = screen->GetScreenColorGamut(info.colorGamut);
1542 if (ret != StatusCode::SUCCESS) {
1543 info.colorGamut = COLOR_GAMUT_SRGB;
1544 }
1545
1546 if (!screen->IsEnable()) {
1547 info.state = ScreenState::DISABLED;
1548 } else if (!screen->IsVirtual()) {
1549 info.state = ScreenState::HDI_OUTPUT_ENABLE;
1550 } else {
1551 info.state = ScreenState::PRODUCER_SURFACE_ENABLE;
1552 }
1553 info.skipFrameInterval = screen->GetScreenSkipFrameInterval();
1554 info.expectedRefreshRate = screen->GetScreenExpectedRefreshRate();
1555 info.skipFrameStrategy = screen->GetScreenSkipFrameStrategy();
1556 info.isEqualVsyncPeriod = screen->GetEqualVsyncPeriod();
1557 screen->GetPixelFormat(info.pixelFormat);
1558 screen->GetScreenHDRFormat(info.hdrFormat);
1559 info.whiteList = screen->GetWhiteList();
1560 return info;
1561 }
1562
GetCanvasRotation(ScreenId id) const1563 bool RSScreenManager::GetCanvasRotation(ScreenId id) const
1564 {
1565 std::lock_guard<std::mutex> lock(mutex_);
1566
1567 auto screensIt = screens_.find(id);
1568 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1569 RS_LOGD("RSScreenManager::GetCanvasRotation: There is no screen for id %{public}" PRIu64 ".", id);
1570 return false;
1571 }
1572 return screensIt->second->GetCanvasRotation();
1573 }
1574
GetScaleMode(ScreenId id) const1575 ScreenScaleMode RSScreenManager::GetScaleMode(ScreenId id) const
1576 {
1577 std::lock_guard<std::mutex> lock(mutex_);
1578
1579 auto screensIt = screens_.find(id);
1580 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1581 RS_LOGD("RSScreenManager::GetScaleMode: There is no screen for id %{public}" PRIu64 ".", id);
1582 return ScreenScaleMode::INVALID_MODE;
1583 }
1584 auto scaleModeDFX = static_cast<ScreenScaleMode>(
1585 RSSystemProperties::GetVirtualScreenScaleModeDFX());
1586 // Support mode can be configured for maintenance and testing before
1587 // upper layer application adaptation
1588 const auto& scaleMode = (scaleModeDFX == ScreenScaleMode::INVALID_MODE) ?
1589 screensIt->second->GetScaleMode() : scaleModeDFX;
1590 return scaleMode;
1591 }
1592
GetProducerSurface(ScreenId id) const1593 sptr<Surface> RSScreenManager::GetProducerSurface(ScreenId id) const
1594 {
1595 std::lock_guard<std::mutex> lock(mutex_);
1596
1597 auto screensIt = screens_.find(id);
1598 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1599 RS_LOGD("RSScreenManager::GetProducerSurface: There is no screen for id %{public}" PRIu64 ".", id);
1600 return nullptr;
1601 }
1602 return screensIt->second->GetProducerSurface();
1603 }
1604
GetOutput(ScreenId id) const1605 std::shared_ptr<HdiOutput> RSScreenManager::GetOutput(ScreenId id) const
1606 {
1607 std::lock_guard<std::mutex> lock(mutex_);
1608
1609 auto screensIt = screens_.find(id);
1610 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1611 RS_LOGW("RSScreenManager::GetOutput: There is no screen for id %{public}" PRIu64 ".", id);
1612 return nullptr;
1613 }
1614 return screensIt->second->GetOutput();
1615 }
1616
AddScreenChangeCallback(const sptr<RSIScreenChangeCallback> & callback)1617 int32_t RSScreenManager::AddScreenChangeCallback(const sptr<RSIScreenChangeCallback> &callback)
1618 {
1619 if (callback == nullptr) {
1620 RS_LOGE("RSScreenManager %{public}s: callback is NULL.", __func__);
1621 return INVALID_ARGUMENTS;
1622 }
1623
1624 std::lock_guard<std::mutex> lock(mutex_);
1625 // when the callback first registered, maybe there were some physical screens already connected,
1626 // so notify to remote immediately.
1627 for (const auto &[id, screen] : screens_) {
1628 if (screen == nullptr) {
1629 RS_LOGW("AddScreenChangeCallback:screen %{public}" PRIu64 " not found", id);
1630 continue;
1631 }
1632 if (!screen->IsVirtual()) {
1633 callback->OnScreenChanged(id, ScreenEvent::CONNECTED);
1634 }
1635 }
1636 screenChangeCallbacks_.push_back(callback);
1637 RS_LOGD("RSScreenManager %{public}s: add a remote callback succeed.", __func__);
1638 return SUCCESS;
1639 }
1640
RemoveScreenChangeCallback(const sptr<RSIScreenChangeCallback> & callback)1641 void RSScreenManager::RemoveScreenChangeCallback(const sptr<RSIScreenChangeCallback> &callback)
1642 {
1643 std::lock_guard<std::mutex> lock(mutex_);
1644 for (auto it = screenChangeCallbacks_.begin(); it != screenChangeCallbacks_.end(); it++) {
1645 if (*it == callback) {
1646 screenChangeCallbacks_.erase(it);
1647 RS_LOGD("RSScreenManager %{public}s: remove a remote callback succeed.", __func__);
1648 break;
1649 }
1650 }
1651 }
1652
DisplayDump(std::string & dumpString)1653 void RSScreenManager::DisplayDump(std::string& dumpString)
1654 {
1655 std::lock_guard<std::mutex> lock(mutex_);
1656 int32_t index = 0;
1657 for (const auto &[id, screen] : screens_) {
1658 if (screen == nullptr) {
1659 continue;
1660 }
1661 screen->DisplayDump(index, dumpString);
1662 index++;
1663 }
1664 }
1665
SurfaceDump(std::string & dumpString)1666 void RSScreenManager::SurfaceDump(std::string& dumpString)
1667 {
1668 std::lock_guard<std::mutex> lock(mutex_);
1669 int32_t index = 0;
1670 for (const auto &[id, screen] : screens_) {
1671 if (screen == nullptr) {
1672 continue;
1673 }
1674 screen->SurfaceDump(index, dumpString);
1675 index++;
1676 }
1677 }
1678
FpsDump(std::string & dumpString,std::string & arg)1679 void RSScreenManager::FpsDump(std::string& dumpString, std::string& arg)
1680 {
1681 std::lock_guard<std::mutex> lock(mutex_);
1682 int32_t index = 0;
1683 dumpString += "\n-- The recently fps records info of screens:\n";
1684 for (const auto &[id, screen] : screens_) {
1685 if (screen == nullptr) {
1686 continue;
1687 }
1688 screen->FpsDump(index, dumpString, arg);
1689 index++;
1690 }
1691 }
1692
ClearFpsDump(std::string & dumpString,std::string & arg)1693 void RSScreenManager::ClearFpsDump(std::string& dumpString, std::string& arg)
1694 {
1695 std::lock_guard<std::mutex> lock(mutex_);
1696 int32_t index = 0;
1697 dumpString += "\n-- Clear fps records info of screens:\n";
1698 for (const auto &[id, screen] : screens_) {
1699 if (screen == nullptr) {
1700 RS_LOGW("ClearFpsDump:screen %{public}" PRIu64 " not found", id);
1701 continue;
1702 }
1703 screen->ClearFpsDump(index, dumpString, arg);
1704 index++;
1705 }
1706 }
1707
ClearFrameBufferIfNeed()1708 void RSScreenManager::ClearFrameBufferIfNeed()
1709 {
1710 RSHardwareThread::Instance().PostTask([this]() {
1711 std::lock_guard<std::mutex> lock(mutex_);
1712 for (const auto& [id, screen] : screens_) {
1713 if (!screen || !screen->GetOutput()) {
1714 continue;
1715 }
1716 if (screen->GetOutput()->GetBufferCacheSize() > 0) {
1717 RSHardwareThread::Instance().ClearFrameBuffers(screen->GetOutput());
1718 }
1719 }
1720 });
1721 }
1722
SetScreenConstraint(ScreenId id,uint64_t timestamp,ScreenConstraintType type)1723 int32_t RSScreenManager::SetScreenConstraint(ScreenId id, uint64_t timestamp, ScreenConstraintType type)
1724 {
1725 frameId_++;
1726 auto screensIt = screens_.find(id);
1727 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1728 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1729 return StatusCode::SCREEN_NOT_FOUND;
1730 }
1731 RS_TRACE_NAME_FMT("SetScreenConstraint frameId:%lu timestamp:%lu type:%d", frameId_, timestamp, type);
1732 return screensIt->second->SetScreenConstraint(frameId_, timestamp, type);
1733 }
1734
HitchsDump(std::string & dumpString,std::string & arg)1735 void RSScreenManager::HitchsDump(std::string& dumpString, std::string& arg)
1736 {
1737 std::lock_guard<std::mutex> lock(mutex_);
1738 int32_t index = 0;
1739 dumpString += "\n-- The recently window hitchs records info of screens:\n";
1740 for (const auto &[id, screen] : screens_) {
1741 if (screen == nullptr) {
1742 continue;
1743 }
1744 screen->HitchsDump(index, dumpString, arg);
1745 index++;
1746 }
1747 }
1748
GetScreenSupportedColorGamutsLocked(ScreenId id,std::vector<ScreenColorGamut> & mode) const1749 int32_t RSScreenManager::GetScreenSupportedColorGamutsLocked(ScreenId id, std::vector<ScreenColorGamut>& mode) const
1750 {
1751 auto screensIt = screens_.find(id);
1752 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1753 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1754 return StatusCode::SCREEN_NOT_FOUND;
1755 }
1756 return screensIt->second->GetScreenSupportedColorGamuts(mode);
1757 }
1758
GetScreenSupportedMetaDataKeysLocked(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys) const1759 int32_t RSScreenManager::GetScreenSupportedMetaDataKeysLocked(
1760 ScreenId id, std::vector<ScreenHDRMetadataKey>& keys) const
1761 {
1762 auto screensIt = screens_.find(id);
1763 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1764 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1765 return StatusCode::SCREEN_NOT_FOUND;
1766 }
1767 return screensIt->second->GetScreenSupportedMetaDataKeys(keys);
1768 }
1769
GetScreenColorGamutLocked(ScreenId id,ScreenColorGamut & mode) const1770 int32_t RSScreenManager::GetScreenColorGamutLocked(ScreenId id, ScreenColorGamut& mode) const
1771 {
1772 auto screensIt = screens_.find(id);
1773 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1774 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1775 return StatusCode::SCREEN_NOT_FOUND;
1776 }
1777 return screensIt->second->GetScreenColorGamut(mode);
1778 }
1779
SetScreenColorGamutLocked(ScreenId id,int32_t modeIdx)1780 int32_t RSScreenManager::SetScreenColorGamutLocked(ScreenId id, int32_t modeIdx)
1781 {
1782 auto screensIt = screens_.find(id);
1783 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1784 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1785 return StatusCode::SCREEN_NOT_FOUND;
1786 }
1787 return screensIt->second->SetScreenColorGamut(modeIdx);
1788 }
1789
SetScreenGamutMapLocked(ScreenId id,ScreenGamutMap mode)1790 int32_t RSScreenManager::SetScreenGamutMapLocked(ScreenId id, ScreenGamutMap mode)
1791 {
1792 auto screensIt = screens_.find(id);
1793 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1794 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1795 return StatusCode::SCREEN_NOT_FOUND;
1796 }
1797 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetScreenGamutMapLocked, ForceRefreshOneFrame.");
1798 ForceRefreshOneFrame();
1799 return screensIt->second->SetScreenGamutMap(mode);
1800 }
1801
SetScreenCorrectionLocked(ScreenId id,ScreenRotation screenRotation)1802 int32_t RSScreenManager::SetScreenCorrectionLocked(ScreenId id, ScreenRotation screenRotation)
1803 {
1804 auto screensIt = screens_.find(id);
1805 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1806 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1807 return StatusCode::SCREEN_NOT_FOUND;
1808 }
1809 screensIt->second->SetScreenCorrection(screenRotation);
1810 screenCorrection_[id] = screenRotation;
1811 return StatusCode::SUCCESS;
1812 }
1813
GetScreenGamutMapLocked(ScreenId id,ScreenGamutMap & mode) const1814 int32_t RSScreenManager::GetScreenGamutMapLocked(ScreenId id, ScreenGamutMap &mode) const
1815 {
1816 auto screensIt = screens_.find(id);
1817 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1818 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1819 return StatusCode::SCREEN_NOT_FOUND;
1820 }
1821 return screensIt->second->GetScreenGamutMap(mode);
1822 }
1823
GetScreenHDRCapabilityLocked(ScreenId id,RSScreenHDRCapability & screenHdrCapability) const1824 int32_t RSScreenManager::GetScreenHDRCapabilityLocked(ScreenId id, RSScreenHDRCapability& screenHdrCapability) const
1825 {
1826 auto screensIt = screens_.find(id);
1827 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1828 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1829 return StatusCode::SCREEN_NOT_FOUND;
1830 }
1831 GraphicHDRCapability hdrCapability = screensIt->second->GetHDRCapability();
1832 std::vector<ScreenHDRFormat> hdrFormats;
1833 uint32_t formatCount = hdrCapability.formatCount;
1834 hdrFormats.resize(formatCount);
1835 for (uint32_t index = 0; index < formatCount; index++) {
1836 hdrFormats[index] = static_cast<ScreenHDRFormat>(hdrCapability.formats[index]);
1837 }
1838 screenHdrCapability.SetMaxLum(hdrCapability.maxLum);
1839 screenHdrCapability.SetMaxAverageLum(hdrCapability.maxAverageLum);
1840 screenHdrCapability.SetMinLum(hdrCapability.minLum);
1841 screenHdrCapability.SetHdrFormats(hdrFormats);
1842 return StatusCode::SUCCESS;
1843 }
1844
GetScreenTypeLocked(ScreenId id,RSScreenType & type) const1845 int32_t RSScreenManager::GetScreenTypeLocked(ScreenId id, RSScreenType& type) const
1846 {
1847 auto screensIt = screens_.find(id);
1848 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1849 RS_LOGD("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1850 return StatusCode::SCREEN_NOT_FOUND;
1851 }
1852
1853 type = screensIt->second->GetScreenType();
1854 return StatusCode::SUCCESS;
1855 }
1856
SetScreenSkipFrameIntervalLocked(ScreenId id,uint32_t skipFrameInterval)1857 int32_t RSScreenManager::SetScreenSkipFrameIntervalLocked(ScreenId id, uint32_t skipFrameInterval)
1858 {
1859 auto screensIt = screens_.find(id);
1860 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1861 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1862 return StatusCode::SCREEN_NOT_FOUND;
1863 }
1864 RSScreenModeInfo screenModeInfo;
1865 // use the refresh rate of the physical screen as the maximum refresh rate
1866 GetScreenActiveModeLocked(defaultScreenId_, screenModeInfo);
1867 // guaranteed screen refresh rate at least 1
1868 if (skipFrameInterval == 0 || (skipFrameInterval > screenModeInfo.GetScreenRefreshRate())) {
1869 return INVALID_ARGUMENTS;
1870 }
1871 screensIt->second->SetScreenSkipFrameInterval(skipFrameInterval);
1872 screensIt->second->SetEqualVsyncPeriod(skipFrameInterval == 1);
1873 RS_LOGD("RSScreenManager %{public}s: screen(id %" PRIu64 "), skipFrameInterval(%d).",
1874 __func__, id, skipFrameInterval);
1875 return StatusCode::SUCCESS;
1876 }
1877
SetVirtualScreenRefreshRate(ScreenId id,uint32_t maxRefreshRate,uint32_t & actualRefreshRate)1878 int32_t RSScreenManager::SetVirtualScreenRefreshRate(ScreenId id, uint32_t maxRefreshRate, uint32_t& actualRefreshRate)
1879 {
1880 std::lock_guard<std::mutex> lock(mutex_);
1881 auto screensIt = screens_.find(id);
1882 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1883 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1884 return StatusCode::SCREEN_NOT_FOUND;
1885 }
1886 if (!screensIt->second->IsVirtual()) {
1887 RS_LOGW("RSScreenManager %{public}s: Not Support for screen:%{public}" PRIu64 ".", __func__, id);
1888 return StatusCode::SCREEN_NOT_FOUND;
1889 }
1890 if (maxRefreshRate == 0) {
1891 RS_LOGW("RSScreenManager %{public}s: Invalid maxRefreshRate:%{public}u.", __func__, maxRefreshRate);
1892 return StatusCode::INVALID_ARGUMENTS;
1893 }
1894 if (maxRefreshRate > MAX_VIRTUAL_SCREEN_REFRESH_RATE) {
1895 maxRefreshRate = MAX_VIRTUAL_SCREEN_REFRESH_RATE;
1896 }
1897 screensIt->second->SetScreenExpectedRefreshRate(maxRefreshRate);
1898 RS_LOGI("RSScreenManager %{public}s: screen(id %" PRIu64 "), maxRefreshRate(%d).",
1899 __func__, id, maxRefreshRate);
1900 actualRefreshRate = maxRefreshRate;
1901 return StatusCode::SUCCESS;
1902 }
1903
SetEqualVsyncPeriod(ScreenId id,bool isEqualVsyncPeriod)1904 void RSScreenManager::SetEqualVsyncPeriod(ScreenId id, bool isEqualVsyncPeriod)
1905 {
1906 std::lock_guard<std::mutex> lock(mutex_);
1907 auto screensIt = screens_.find(id);
1908 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1909 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1910 return;
1911 }
1912 screensIt->second->SetEqualVsyncPeriod(isEqualVsyncPeriod);
1913 return;
1914 }
1915
GetPixelFormatLocked(ScreenId id,GraphicPixelFormat & pixelFormat) const1916 int32_t RSScreenManager::GetPixelFormatLocked(ScreenId id, GraphicPixelFormat& pixelFormat) const
1917 {
1918 auto screensIt = screens_.find(id);
1919 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1920 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1921 return StatusCode::SCREEN_NOT_FOUND;
1922 }
1923 return screensIt->second->GetPixelFormat(pixelFormat);
1924 }
1925
SetPixelFormatLocked(ScreenId id,GraphicPixelFormat pixelFormat)1926 int32_t RSScreenManager::SetPixelFormatLocked(ScreenId id, GraphicPixelFormat pixelFormat)
1927 {
1928 auto screensIt = screens_.find(id);
1929 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1930 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1931 return StatusCode::SCREEN_NOT_FOUND;
1932 }
1933 return screensIt->second->SetPixelFormat(pixelFormat);
1934 }
1935
GetScreenSupportedHDRFormatsLocked(ScreenId id,std::vector<ScreenHDRFormat> & hdrFormats) const1936 int32_t RSScreenManager::GetScreenSupportedHDRFormatsLocked(ScreenId id, std::vector<ScreenHDRFormat>& hdrFormats) const
1937 {
1938 auto screensIt = screens_.find(id);
1939 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1940 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1941 return StatusCode::SCREEN_NOT_FOUND;
1942 }
1943 return screensIt->second->GetScreenSupportedHDRFormats(hdrFormats);
1944 }
1945
GetScreenHDRFormatLocked(ScreenId id,ScreenHDRFormat & hdrFormat) const1946 int32_t RSScreenManager::GetScreenHDRFormatLocked(ScreenId id, ScreenHDRFormat& hdrFormat) const
1947 {
1948 auto screensIt = screens_.find(id);
1949 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1950 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1951 return StatusCode::SCREEN_NOT_FOUND;
1952 }
1953 return screensIt->second->GetScreenHDRFormat(hdrFormat);
1954 }
1955
SetScreenHDRFormatLocked(ScreenId id,int32_t modeIdx)1956 int32_t RSScreenManager::SetScreenHDRFormatLocked(ScreenId id, int32_t modeIdx)
1957 {
1958 auto screensIt = screens_.find(id);
1959 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1960 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1961 return StatusCode::SCREEN_NOT_FOUND;
1962 }
1963 return screensIt->second->SetScreenHDRFormat(modeIdx);
1964 }
1965
GetScreenSupportedColorSpacesLocked(ScreenId id,std::vector<GraphicCM_ColorSpaceType> & colorSpaces) const1966 int32_t RSScreenManager::GetScreenSupportedColorSpacesLocked(
1967 ScreenId id, std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const
1968 {
1969 auto screensIt = screens_.find(id);
1970 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1971 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1972 return StatusCode::SCREEN_NOT_FOUND;
1973 }
1974 return screensIt->second->GetScreenSupportedColorSpaces(colorSpaces);
1975 }
1976
GetScreenColorSpaceLocked(ScreenId id,GraphicCM_ColorSpaceType & colorSpace) const1977 int32_t RSScreenManager::GetScreenColorSpaceLocked(ScreenId id, GraphicCM_ColorSpaceType& colorSpace) const
1978 {
1979 auto screensIt = screens_.find(id);
1980 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1981 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1982 return StatusCode::SCREEN_NOT_FOUND;
1983 }
1984 return screensIt->second->GetScreenColorSpace(colorSpace);
1985 }
1986
SetScreenColorSpaceLocked(ScreenId id,GraphicCM_ColorSpaceType colorSpace)1987 int32_t RSScreenManager::SetScreenColorSpaceLocked(ScreenId id, GraphicCM_ColorSpaceType colorSpace)
1988 {
1989 auto screensIt = screens_.find(id);
1990 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1991 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1992 return StatusCode::SCREEN_NOT_FOUND;
1993 }
1994 return screensIt->second->SetScreenColorSpace(colorSpace);
1995 }
1996
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode) const1997 int32_t RSScreenManager::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode) const
1998 {
1999 std::lock_guard<std::mutex> lock(mutex_);
2000 return GetScreenSupportedColorGamutsLocked(id, mode);
2001 }
2002
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys) const2003 int32_t RSScreenManager::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys) const
2004 {
2005 std::lock_guard<std::mutex> lock(mutex_);
2006 return GetScreenSupportedMetaDataKeysLocked(id, keys);
2007 }
2008
GetActualScreensNum() const2009 uint32_t RSScreenManager::GetActualScreensNum() const
2010 {
2011 std::lock_guard<std::mutex> lock(mutex_);
2012 uint32_t num = 0;
2013 for (const auto &[id, screen] : screens_) {
2014 if (!screen) {
2015 continue;
2016 }
2017 if (!screen->IsVirtual()) {
2018 num += 1;
2019 } else {
2020 if (screen->GetProducerSurface()) {
2021 num += 1;
2022 }
2023 }
2024 }
2025 return num;
2026 }
2027
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode) const2028 int32_t RSScreenManager::GetScreenColorGamut(ScreenId id, ScreenColorGamut &mode) const
2029 {
2030 std::lock_guard<std::mutex> lock(mutex_);
2031 return GetScreenColorGamutLocked(id, mode);
2032 }
2033
SetScreenColorGamut(ScreenId id,int32_t modeIdx)2034 int32_t RSScreenManager::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
2035 {
2036 std::lock_guard<std::mutex> lock(mutex_);
2037 return SetScreenColorGamutLocked(id, modeIdx);
2038 }
2039
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)2040 int32_t RSScreenManager::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
2041 {
2042 std::lock_guard<std::mutex> lock(mutex_);
2043 return SetScreenGamutMapLocked(id, mode);
2044 }
2045
SetScreenCorrection(ScreenId id,ScreenRotation screenRotation)2046 int32_t RSScreenManager::SetScreenCorrection(ScreenId id, ScreenRotation screenRotation)
2047 {
2048 std::lock_guard<std::mutex> lock(mutex_);
2049 return SetScreenCorrectionLocked(id, screenRotation);
2050 }
2051
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode) const2052 int32_t RSScreenManager::GetScreenGamutMap(ScreenId id, ScreenGamutMap &mode) const
2053 {
2054 std::lock_guard<std::mutex> lock(mutex_);
2055 return GetScreenGamutMapLocked(id, mode);
2056 }
2057
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability) const2058 int32_t RSScreenManager::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability) const
2059 {
2060 std::lock_guard<std::mutex> lock(mutex_);
2061 return GetScreenHDRCapabilityLocked(id, screenHdrCapability);
2062 }
2063
GetScreenType(ScreenId id,RSScreenType & type) const2064 int32_t RSScreenManager::GetScreenType(ScreenId id, RSScreenType& type) const
2065 {
2066 std::lock_guard<std::mutex> lock(mutex_);
2067 return GetScreenTypeLocked(id, type);
2068 }
2069
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)2070 int32_t RSScreenManager::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
2071 {
2072 std::lock_guard<std::mutex> lock(mutex_);
2073 return SetScreenSkipFrameIntervalLocked(id, skipFrameInterval);
2074 }
2075
GetPixelFormat(ScreenId id,GraphicPixelFormat & pixelFormat) const2076 int32_t RSScreenManager::GetPixelFormat(ScreenId id, GraphicPixelFormat& pixelFormat) const
2077 {
2078 std::lock_guard<std::mutex> lock(mutex_);
2079 return GetPixelFormatLocked(id, pixelFormat);
2080 }
2081
SetPixelFormat(ScreenId id,GraphicPixelFormat pixelFormat)2082 int32_t RSScreenManager::SetPixelFormat(ScreenId id, GraphicPixelFormat pixelFormat)
2083 {
2084 std::lock_guard<std::mutex> lock(mutex_);
2085 return SetPixelFormatLocked(id, pixelFormat);
2086 }
2087
GetScreenSupportedHDRFormats(ScreenId id,std::vector<ScreenHDRFormat> & hdrFormats) const2088 int32_t RSScreenManager::GetScreenSupportedHDRFormats(ScreenId id, std::vector<ScreenHDRFormat>& hdrFormats) const
2089 {
2090 std::lock_guard<std::mutex> lock(mutex_);
2091 return GetScreenSupportedHDRFormatsLocked(id, hdrFormats);
2092 }
2093
GetScreenHDRFormat(ScreenId id,ScreenHDRFormat & hdrFormat) const2094 int32_t RSScreenManager::GetScreenHDRFormat(ScreenId id, ScreenHDRFormat& hdrFormat) const
2095 {
2096 std::lock_guard<std::mutex> lock(mutex_);
2097 return GetScreenHDRFormatLocked(id, hdrFormat);
2098 }
2099
SetScreenHDRFormat(ScreenId id,int32_t modeIdx)2100 int32_t RSScreenManager::SetScreenHDRFormat(ScreenId id, int32_t modeIdx)
2101 {
2102 std::lock_guard<std::mutex> lock(mutex_);
2103 return SetScreenHDRFormatLocked(id, modeIdx);
2104 }
2105
GetScreenSupportedColorSpaces(ScreenId id,std::vector<GraphicCM_ColorSpaceType> & colorSpaces) const2106 int32_t RSScreenManager::GetScreenSupportedColorSpaces(
2107 ScreenId id, std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const
2108 {
2109 std::lock_guard<std::mutex> lock(mutex_);
2110 return GetScreenSupportedColorSpacesLocked(id, colorSpaces);
2111 }
2112
GetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType & colorSpace) const2113 int32_t RSScreenManager::GetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType& colorSpace) const
2114 {
2115 std::lock_guard<std::mutex> lock(mutex_);
2116 return GetScreenColorSpaceLocked(id, colorSpace);
2117 }
2118
SetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType colorSpace)2119 int32_t RSScreenManager::SetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType colorSpace)
2120 {
2121 std::lock_guard<std::mutex> lock(mutex_);
2122 return SetScreenColorSpaceLocked(id, colorSpace);
2123 }
2124
MarkPowerOffNeedProcessOneFrame()2125 void RSScreenManager::MarkPowerOffNeedProcessOneFrame()
2126 {
2127 powerOffNeedProcessOneFrame_ = true;
2128 }
2129
ResetPowerOffNeedProcessOneFrame()2130 void RSScreenManager::ResetPowerOffNeedProcessOneFrame()
2131 {
2132 powerOffNeedProcessOneFrame_ = false;
2133 }
2134
GetPowerOffNeedProcessOneFrame() const2135 bool RSScreenManager::GetPowerOffNeedProcessOneFrame() const
2136 {
2137 return powerOffNeedProcessOneFrame_;
2138 }
2139
IsScreenPowerOff(ScreenId id) const2140 bool RSScreenManager::IsScreenPowerOff(ScreenId id) const
2141 {
2142 std::lock_guard<std::mutex> lock(mutex_);
2143 if (screenPowerStatus_.count(id) == 0) {
2144 return false;
2145 }
2146 return screenPowerStatus_.at(id) == GraphicDispPowerStatus::GRAPHIC_POWER_STATUS_SUSPEND ||
2147 screenPowerStatus_.at(id) == GraphicDispPowerStatus::GRAPHIC_POWER_STATUS_OFF;
2148 }
2149
DisablePowerOffRenderControl(ScreenId id)2150 void RSScreenManager::DisablePowerOffRenderControl(ScreenId id)
2151 {
2152 std::lock_guard<std::mutex> lock(mutex_);
2153 RS_LOGD("RSScreenManager Add Screen_%{public}" PRIu64 " for disable power-off render control.", id);
2154 disableRenderControlScreens_.insert(id);
2155 }
2156
GetDisableRenderControlScreensCount() const2157 int RSScreenManager::GetDisableRenderControlScreensCount() const
2158 {
2159 std::lock_guard<std::mutex> lock(mutex_);
2160 return disableRenderControlScreens_.size();
2161 }
2162
GetDisplayPropertyForHardCursor(uint32_t screenId)2163 bool RSScreenManager::GetDisplayPropertyForHardCursor(uint32_t screenId)
2164 {
2165 std::lock_guard<std::mutex> lock(mutex_);
2166 auto screensIt = screens_.find(screenId);
2167 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2168 RS_LOGD("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu32 ".", __func__, screenId);
2169 return false;
2170 }
2171 return screensIt->second->GetDisplayPropertyForHardCursor();
2172 }
2173 } // namespace impl
2174
CreateOrGetScreenManager()2175 sptr<RSScreenManager> CreateOrGetScreenManager()
2176 {
2177 return impl::RSScreenManager::GetInstance();
2178 }
2179 } // namespace Rosen
2180 } // namespace OHOS
2181