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 auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
617 if (renderType != UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
618 RegSetScreenVsyncEnabledCallbackForMainThread(id);
619 } else {
620 RegSetScreenVsyncEnabledCallbackForHardwareThread(id);
621 }
622
623 if (screens_[id]->GetCapability().type == GraphicInterfaceType::GRAPHIC_DISP_INTF_MIPI) {
624 if (!mipiCheckInFirstHotPlugEvent_) {
625 defaultScreenId_ = id;
626 }
627 mipiCheckInFirstHotPlugEvent_ = true;
628 } else if (defaultScreenId_ == INVALID_SCREEN_ID) {
629 defaultScreenId_ = id;
630 }
631
632 RS_LOGI("RSScreenManager %{public}s: A new screen(id %{public}" PRIu64 ") connected.", __func__, id);
633 connectedIds_.emplace_back(id);
634 #ifdef RS_SUBSCRIBE_SENSOR_ENABLE
635 if (isFoldScreenFlag_ && id != 0) {
636 externalScreenId_ = id;
637 }
638 #endif
639 }
640
ProcessScreenDisConnectedLocked(std::shared_ptr<HdiOutput> & output)641 void RSScreenManager::ProcessScreenDisConnectedLocked(std::shared_ptr<HdiOutput> &output)
642 {
643 ScreenId id = ToScreenId(output->GetScreenId());
644 RS_LOGD_IF(DEBUG_SCREEN, "RSScreenManager process screen disconnected, id: %{public}" PRIu64 "", id);
645 auto screensIt = screens_.find(id);
646 if (screensIt == screens_.end()) {
647 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64, __func__, id);
648 } else {
649 for (auto &cb : screenChangeCallbacks_) {
650 cb->OnScreenChanged(id, ScreenEvent::DISCONNECTED);
651 }
652 screens_.erase(screensIt);
653 RS_LOGI("RSScreenManager %{public}s: Screen(id %{public}" PRIu64 ") disconnected.", __func__, id);
654 }
655 screenPowerStatus_.erase(id);
656 screenBacklight_.erase(id);
657 screenCorrection_.erase(id);
658 if (id == defaultScreenId_) {
659 HandleDefaultScreenDisConnectedLocked();
660 }
661
662 ScreenId vsyncEnabledScreenId = INVALID_SCREEN_ID;
663 auto it = screens_.end();
664 if (screens_.size() != 0) {
665 vsyncEnabledScreenId = (--it)->first;
666 }
667 auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
668 if (renderType != UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
669 RegSetScreenVsyncEnabledCallbackForMainThread(vsyncEnabledScreenId);
670 } else {
671 RegSetScreenVsyncEnabledCallbackForHardwareThread(vsyncEnabledScreenId);
672 }
673 }
674
RegSetScreenVsyncEnabledCallbackForMainThread(ScreenId vsyncEnabledScreenId)675 void RSScreenManager::RegSetScreenVsyncEnabledCallbackForMainThread(ScreenId vsyncEnabledScreenId)
676 {
677 auto vsyncSampler = CreateVSyncSampler();
678 if (vsyncSampler == nullptr) {
679 RS_LOGE("RegSetScreenVsyncEnabledCallbackForMainThread failed, vsyncSampler is null");
680 return;
681 }
682 vsyncSampler->RegSetScreenVsyncEnabledCallback([this, vsyncEnabledScreenId](bool enabled) {
683 auto mainThread = RSMainThread::Instance();
684 if (mainThread == nullptr) {
685 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, get RSMainThread failed", enabled);
686 return;
687 }
688 mainThread->PostTask([this, vsyncEnabledScreenId, enabled]() {
689 std::lock_guard<std::mutex> lock(mutex_);
690 auto screensIt = screens_.find(vsyncEnabledScreenId);
691 if (screensIt == screens_.end() || screensIt->second == nullptr) {
692 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, screen %{public}" PRIu64 " not found",
693 enabled, vsyncEnabledScreenId);
694 return;
695 }
696 screensIt->second->SetScreenVsyncEnabled(enabled);
697 });
698 });
699 }
700
RegSetScreenVsyncEnabledCallbackForHardwareThread(ScreenId vsyncEnabledScreenId)701 void RSScreenManager::RegSetScreenVsyncEnabledCallbackForHardwareThread(ScreenId vsyncEnabledScreenId)
702 {
703 auto vsyncSampler = CreateVSyncSampler();
704 if (vsyncSampler == nullptr) {
705 RS_LOGE("RegSetScreenVsyncEnabledCallbackForHardwareThread failed, vsyncSampler is null");
706 return;
707 }
708 vsyncSampler->RegSetScreenVsyncEnabledCallback([this, vsyncEnabledScreenId](bool enabled) {
709 RSHardwareThread::Instance().PostTask([this, vsyncEnabledScreenId, enabled]() {
710 std::lock_guard<std::mutex> lock(mutex_);
711 auto screensIt = screens_.find(vsyncEnabledScreenId);
712 if (screensIt == screens_.end() || screensIt->second == nullptr) {
713 RS_LOGE("SetScreenVsyncEnabled:%{public}d failed, screen %{public}" PRIu64 " not found",
714 enabled, vsyncEnabledScreenId);
715 return;
716 }
717 screensIt->second->SetScreenVsyncEnabled(enabled);
718 });
719 });
720 }
721
722 // If the previous primary screen disconnected, we traversal the left screens
723 // and find the first physical screen to be the default screen.
724 // If there was no physical screen left, we set the first screen as default, no matter what type it is.
725 // At last, if no screen left, we set Default Screen Id to INVALID_SCREEN_ID.
HandleDefaultScreenDisConnectedLocked()726 void RSScreenManager::HandleDefaultScreenDisConnectedLocked()
727 {
728 defaultScreenId_ = INVALID_SCREEN_ID;
729 for (const auto &[id, screen] : screens_) {
730 if (screen == nullptr) {
731 RS_LOGW("HandleDefaultScreenDisConnectedLocked:screen %{public}" PRIu64 " not found", id);
732 continue;
733 }
734 if (!screen->IsVirtual()) {
735 defaultScreenId_ = id;
736 break;
737 }
738 }
739
740 if (defaultScreenId_ == INVALID_SCREEN_ID) {
741 if (!screens_.empty()) {
742 defaultScreenId_ = screens_.cbegin()->first;
743 }
744 }
745 }
746
747 // if SetVirtualScreenSurface success, force a refresh of one frame, avoiding prolong black screen
ForceRefreshOneFrame() const748 void RSScreenManager::ForceRefreshOneFrame() const
749 {
750 auto mainThread = RSMainThread::Instance();
751 if (mainThread != nullptr) {
752 mainThread->PostTask([mainThread]() {
753 mainThread->SetDirtyFlag();
754 });
755 mainThread->ForceRefreshForUni();
756 }
757 }
758
SetDefaultScreenId(ScreenId id)759 void RSScreenManager::SetDefaultScreenId(ScreenId id)
760 {
761 std::lock_guard<std::mutex> lock(mutex_);
762 defaultScreenId_ = id;
763 }
764
SetScreenMirror(ScreenId id,ScreenId toMirror)765 void RSScreenManager::SetScreenMirror(ScreenId id, ScreenId toMirror)
766 {
767 std::lock_guard<std::mutex> lock(mutex_);
768
769 auto screensIt = screens_.find(id);
770 if (screensIt == screens_.end() || screensIt->second == nullptr) {
771 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
772 return;
773 }
774
775 screensIt->second->SetMirror(toMirror);
776 }
777
GenerateVirtualScreenIdLocked()778 ScreenId RSScreenManager::GenerateVirtualScreenIdLocked()
779 {
780 if (!freeVirtualScreenIds_.empty()) {
781 ScreenId id = freeVirtualScreenIds_.front();
782 freeVirtualScreenIds_.pop();
783 return id;
784 }
785
786 // The left 32 bits is for virtual screen id.
787 return (static_cast<ScreenId>(virtualScreenCount_++) << 32) | 0xffffffffu;
788 }
789
ReuseVirtualScreenIdLocked(ScreenId id)790 void RSScreenManager::ReuseVirtualScreenIdLocked(ScreenId id)
791 {
792 freeVirtualScreenIds_.push(id);
793 }
794
GetVirtualScreenResolutionLocked(ScreenId id,RSVirtualScreenResolution & virtualScreenResolution) const795 void RSScreenManager::GetVirtualScreenResolutionLocked(ScreenId id,
796 RSVirtualScreenResolution& virtualScreenResolution) const
797 {
798 auto screensIt = screens_.find(id);
799 if (screensIt == screens_.end() || screensIt->second == nullptr) {
800 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
801 return;
802 }
803 const auto& screen = screensIt->second;
804 virtualScreenResolution.SetVirtualScreenWidth(static_cast<uint32_t>(screen->Width()));
805 virtualScreenResolution.SetVirtualScreenHeight(static_cast<uint32_t>(screen->Height()));
806 }
807
GetScreenActiveModeLocked(ScreenId id,RSScreenModeInfo & screenModeInfo) const808 void RSScreenManager::GetScreenActiveModeLocked(ScreenId id, RSScreenModeInfo& screenModeInfo) const
809 {
810 auto screensIt = screens_.find(id);
811 if (screensIt == screens_.end() || screensIt->second == nullptr) {
812 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
813 return;
814 }
815 const auto& screen = screensIt->second;
816 auto modeInfo = screen->GetActiveMode();
817 if (!modeInfo) {
818 RS_LOGE("RSScreenManager %{public}s: Failed to get active mode for screen %{public}" PRIu64 ".", __func__, id);
819 return;
820 }
821
822 screenModeInfo.SetScreenWidth(modeInfo->width);
823 screenModeInfo.SetScreenHeight(modeInfo->height);
824 screenModeInfo.SetScreenRefreshRate(modeInfo->freshRate);
825 screenModeInfo.SetScreenModeId(screen->GetActiveModePosByModeId(modeInfo->id));
826 }
827
GetScreenSupportedModesLocked(ScreenId id) const828 std::vector<RSScreenModeInfo> RSScreenManager::GetScreenSupportedModesLocked(ScreenId id) const
829 {
830 std::vector<RSScreenModeInfo> screenSupportedModes;
831 auto screensIt = screens_.find(id);
832 if (screensIt == screens_.end() || screensIt->second == nullptr) {
833 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
834 return screenSupportedModes;
835 }
836
837 const auto& displaySupportedModes = screensIt->second->GetSupportedModes();
838 screenSupportedModes.resize(displaySupportedModes.size());
839 for (decltype(displaySupportedModes.size()) idx = 0; idx < displaySupportedModes.size(); ++idx) {
840 screenSupportedModes[idx].SetScreenWidth(displaySupportedModes[idx].width);
841 screenSupportedModes[idx].SetScreenHeight(displaySupportedModes[idx].height);
842 screenSupportedModes[idx].SetScreenRefreshRate(displaySupportedModes[idx].freshRate);
843 screenSupportedModes[idx].SetScreenModeId(displaySupportedModes[idx].id);
844 }
845 return screenSupportedModes;
846 }
847
GetScreenCapabilityLocked(ScreenId id) const848 RSScreenCapability RSScreenManager::GetScreenCapabilityLocked(ScreenId id) const
849 {
850 RSScreenCapability screenCapability;
851 auto screensIt = screens_.find(id);
852 if (screensIt == screens_.end() || screensIt->second == nullptr) {
853 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
854 return screenCapability;
855 }
856 const auto& screen = screensIt->second;
857 if (screen->IsVirtual()) {
858 RS_LOGW("RSScreenManager %{public}s: only name attribute is valid for virtual screen.", __func__);
859 screenCapability.SetName(screen->Name());
860 return screenCapability;
861 }
862
863 const auto& capability = screen->GetCapability();
864 std::vector<RSScreenProps> props;
865 uint32_t propCount = capability.propertyCount;
866 props.resize(propCount);
867 for (uint32_t propIndex = 0; propIndex < propCount; propIndex++) {
868 props[propIndex] = RSScreenProps(capability.props[propIndex].name, capability.props[propIndex].propId,
869 capability.props[propIndex].value);
870 }
871 screenCapability.SetName(capability.name);
872 screenCapability.SetType(static_cast<ScreenInterfaceType>(capability.type));
873 screenCapability.SetPhyWidth(capability.phyWidth);
874 screenCapability.SetPhyHeight(capability.phyHeight);
875 screenCapability.SetSupportLayers(capability.supportLayers);
876 screenCapability.SetVirtualDispCount(capability.virtualDispCount);
877 screenCapability.SetSupportWriteBack(capability.supportWriteBack);
878 screenCapability.SetProps(props);
879 return screenCapability;
880 }
881
GetScreenPowerStatusLocked(ScreenId id) const882 ScreenPowerStatus RSScreenManager::GetScreenPowerStatusLocked(ScreenId id) const
883 {
884 auto screensIt = screens_.find(id);
885 if (screensIt == screens_.end() || screensIt->second == nullptr) {
886 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
887 return INVALID_POWER_STATUS;
888 }
889
890 ScreenPowerStatus status = static_cast<ScreenPowerStatus>(screensIt->second->GetPowerStatus());
891 return status;
892 }
893
GetScreenCorrectionLocked(ScreenId id) const894 ScreenRotation RSScreenManager::GetScreenCorrectionLocked(ScreenId id) const
895 {
896 auto screensIt = screens_.find(id);
897 if (screensIt == screens_.end() || screensIt->second == nullptr) {
898 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
899 return ScreenRotation::INVALID_SCREEN_ROTATION;
900 }
901
902 ScreenRotation screenRotation = screensIt->second->GetScreenCorrection();
903 return screenRotation;
904 }
905
GetAllScreenIds() const906 std::vector<ScreenId> RSScreenManager::GetAllScreenIds() const
907 {
908 std::lock_guard<std::mutex> lock(mutex_);
909 std::vector<ScreenId> ids;
910 for (auto iter = screens_.begin(); iter != screens_.end(); ++iter) {
911 ids.emplace_back(iter->first);
912 }
913 return ids;
914 }
915
CreateVirtualScreen(const std::string & name,uint32_t width,uint32_t height,sptr<Surface> surface,ScreenId mirrorId,int32_t flags,std::vector<NodeId> whiteList)916 ScreenId RSScreenManager::CreateVirtualScreen(
917 const std::string &name,
918 uint32_t width,
919 uint32_t height,
920 sptr<Surface> surface,
921 ScreenId mirrorId,
922 int32_t flags,
923 std::vector<NodeId> whiteList)
924 {
925 std::lock_guard<std::mutex> lock(mutex_);
926
927 if (currentVirtualScreenNum_ >= MAX_VIRTUAL_SCREEN_NUM) {
928 RS_LOGW("RSScreenManager %{public}s: virtual screens num %{public}" PRIu32" has reached the maximum limit!",
929 __func__, currentVirtualScreenNum_);
930 return INVALID_SCREEN_ID;
931 }
932 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
933 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
934 " the maximum limit!", __func__, width, height);
935 return INVALID_SCREEN_ID;
936 }
937 if (surface != nullptr) {
938 uint64_t surfaceId = surface->GetUniqueId();
939 for (auto &[_, screen] : screens_) {
940 if (screen == nullptr || !screen->IsVirtual()) {
941 continue;
942 }
943 auto screenSurface = screen->GetProducerSurface();
944 if (screenSurface == nullptr) {
945 continue;
946 }
947 if (screenSurface->GetUniqueId() == surfaceId) {
948 RS_LOGW("RSScreenManager %{public}s: surface %{public}" PRIu64 " is used, create virtual"
949 " screen failed!", __func__, surfaceId);
950 return INVALID_SCREEN_ID;
951 }
952 }
953 } else {
954 RS_LOGD("RSScreenManager %{public}s: surface is nullptr.", __func__);
955 }
956
957 VirtualScreenConfigs configs;
958 ScreenId newId = GenerateVirtualScreenIdLocked();
959 configs.id = newId;
960 configs.mirrorId = mirrorId;
961 configs.name = name;
962 configs.width = width;
963 configs.height = height;
964 configs.surface = surface;
965 configs.flags = flags;
966 configs.whiteList = std::unordered_set<NodeId>(whiteList.begin(), whiteList.end());
967
968 screens_[newId] = std::make_unique<RSScreen>(configs);
969 ++currentVirtualScreenNum_;
970 RS_LOGD("RSScreenManager %{public}s: create virtual screen(id %{public}" PRIu64 ").", __func__, newId);
971 return newId;
972 }
973
GetCastScreenBlackList(std::unordered_set<uint64_t> & screenBlackList)974 void RSScreenManager::GetCastScreenBlackList(std::unordered_set<uint64_t>& screenBlackList)
975 {
976 std::lock_guard<std::mutex> lock(blackListMutex_);
977 screenBlackList = castScreenBlackLists_;
978 }
979
SetCastScreenBlackList(std::unordered_set<uint64_t> & screenBlackList)980 void RSScreenManager::SetCastScreenBlackList(std::unordered_set<uint64_t>& screenBlackList)
981 {
982 std::lock_guard<std::mutex> lock(blackListMutex_);
983 castScreenBlackLists_ = screenBlackList;
984 }
985
SetVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)986 int32_t RSScreenManager::SetVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
987 {
988 std::unordered_set<NodeId> screenBlackList(blackList.begin(), blackList.end());
989 if (id == INVALID_SCREEN_ID) {
990 RS_LOGD("RSScreenManager %{public}s: CastScreenBlackLists.", __func__);
991 SetCastScreenBlackList(screenBlackList);
992 return SUCCESS;
993 }
994 std::lock_guard<std::mutex> lock(mutex_);
995 auto virtualScreen = screens_.find(id);
996 if (virtualScreen == screens_.end()) {
997 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
998 return SCREEN_NOT_FOUND;
999 } else {
1000 if (virtualScreen->second != nullptr) {
1001 virtualScreen->second->SetBlackList(screenBlackList);
1002 } else {
1003 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1004 return SCREEN_NOT_FOUND;
1005 }
1006 }
1007 ScreenId mainId = GetDefaultScreenId();
1008 if (mainId != id) {
1009 auto mainScreen = screens_.find(mainId);
1010 if (mainScreen == screens_.end()) {
1011 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1012 return SCREEN_NOT_FOUND;
1013 } else {
1014 if (mainScreen->second != nullptr) {
1015 mainScreen->second->SetBlackList(screenBlackList);
1016 } else {
1017 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, mainId);
1018 return SCREEN_NOT_FOUND;
1019 }
1020 }
1021 }
1022 return SUCCESS;
1023 }
1024
AddVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)1025 int32_t RSScreenManager::AddVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
1026 {
1027 std::lock_guard<std::mutex> lock(mutex_);
1028 if (id == INVALID_SCREEN_ID) {
1029 RS_LOGI("RSScreenManager %{public}s: Cast screen blacklists", __func__);
1030 for (auto& list : blackList) {
1031 castScreenBlackLists_.emplace(list);
1032 }
1033 return SUCCESS;
1034 }
1035 auto virtualScreen = screens_.find(id);
1036 if (virtualScreen == screens_.end() || virtualScreen->second == nullptr) {
1037 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1038 return SCREEN_NOT_FOUND;
1039 }
1040 RS_LOGI("RSScreenManager %{public}s: Record screen blacklists for id %{public}" PRIu64 ".", __func__, id);
1041 virtualScreen->second->AddBlackList(blackList);
1042
1043 ScreenId mainId = GetDefaultScreenId();
1044 if (mainId != id) {
1045 auto mainScreen = screens_.find(mainId);
1046 if (mainScreen == screens_.end() || mainScreen->second == nullptr) {
1047 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1048 return SCREEN_NOT_FOUND;
1049 }
1050 mainScreen->second->AddBlackList(blackList);
1051 }
1052 return SUCCESS;
1053 }
1054
RemoveVirtualScreenBlackList(ScreenId id,const std::vector<uint64_t> & blackList)1055 int32_t RSScreenManager::RemoveVirtualScreenBlackList(ScreenId id, const std::vector<uint64_t>& blackList)
1056 {
1057 std::lock_guard<std::mutex> lock(mutex_);
1058 if (id == INVALID_SCREEN_ID) {
1059 RS_LOGI("RSScreenManager %{public}s: Cast screen blacklists", __func__);
1060 for (auto& list : blackList) {
1061 auto it = castScreenBlackLists_.find(list);
1062 if (it == castScreenBlackLists_.end()) {
1063 continue;
1064 }
1065 castScreenBlackLists_.erase(it);
1066 }
1067 return SUCCESS;
1068 }
1069 auto virtualScreen = screens_.find(id);
1070 if (virtualScreen == screens_.end() || virtualScreen->second == nullptr) {
1071 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1072 return SCREEN_NOT_FOUND;
1073 }
1074 RS_LOGI("RSScreenManager %{public}s: Record screen blacklists for id %{public}" PRIu64 ".", __func__, id);
1075 virtualScreen->second->RemoveBlackList(blackList);
1076
1077 ScreenId mainId = GetDefaultScreenId();
1078 if (mainId != id) {
1079 auto mainScreen = screens_.find(mainId);
1080 if (mainScreen == screens_.end() || mainScreen->second == nullptr) {
1081 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, mainId);
1082 return SCREEN_NOT_FOUND;
1083 }
1084 mainScreen->second->RemoveBlackList(blackList);
1085 }
1086 return SUCCESS;
1087 }
1088
SetVirtualScreenSecurityExemptionList(ScreenId id,const std::vector<uint64_t> & securityExemptionList)1089 int32_t RSScreenManager::SetVirtualScreenSecurityExemptionList(
1090 ScreenId id,
1091 const std::vector<uint64_t>& securityExemptionList)
1092 {
1093 if (id == INVALID_SCREEN_ID) {
1094 RS_LOGD("RSScreenManager %{public}s: INVALID_SCREEN_ID.", __func__);
1095 return INVALID_ARGUMENTS;
1096 }
1097 std::lock_guard<std::mutex> lock(mutex_);
1098 auto virtualScreen = screens_.find(id);
1099 if (virtualScreen == screens_.end()) {
1100 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1101 return SCREEN_NOT_FOUND;
1102 }
1103
1104 if (virtualScreen->second == nullptr) {
1105 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1106 return SCREEN_NOT_FOUND;
1107 }
1108 if (!(virtualScreen->second->IsVirtual())) {
1109 RS_LOGW("RSScreenManager %{public}s: not virtual screen for id %{public}" PRIu64 ".", __func__, id);
1110 return INVALID_ARGUMENTS;
1111 }
1112 virtualScreen->second->SetSecurityExemptionList(securityExemptionList);
1113 for (const auto& exemption : securityExemptionList) {
1114 RS_LOGD("RSScreenManager %{public}s: virtual screen(id %{public}" PRIu64 "), nodeId %{public}" PRIu64 ".",
1115 __func__, id, exemption);
1116 }
1117 return SUCCESS;
1118 }
1119
GetVirtualScreenSecurityExemptionList(ScreenId id) const1120 const std::vector<uint64_t> RSScreenManager::GetVirtualScreenSecurityExemptionList(ScreenId id) const
1121 {
1122 std::lock_guard<std::mutex> lock(mutex_);
1123 auto virtualScreen = screens_.find(id);
1124 if (virtualScreen == screens_.end()) {
1125 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1126 return {};
1127 }
1128
1129 if (virtualScreen->second == nullptr) {
1130 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1131 return {};
1132 }
1133 return virtualScreen->second->GetSecurityExemptionList();
1134 }
1135
SetCastScreenEnableSkipWindow(ScreenId id,bool enable)1136 int32_t RSScreenManager::SetCastScreenEnableSkipWindow(ScreenId id, bool enable)
1137 {
1138 std::lock_guard<std::mutex> lock(mutex_);
1139 auto virtualScreen = screens_.find(id);
1140 if (virtualScreen == screens_.end()) {
1141 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1142 return SCREEN_NOT_FOUND;
1143 } else {
1144 if (virtualScreen->second != nullptr) {
1145 virtualScreen->second->SetCastScreenEnableSkipWindow(enable);
1146 return SUCCESS;
1147 } else {
1148 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1149 return SCREEN_NOT_FOUND;
1150 }
1151 }
1152 }
1153
GetCastScreenEnableSkipWindow(ScreenId id)1154 bool RSScreenManager::GetCastScreenEnableSkipWindow(ScreenId id)
1155 {
1156 std::lock_guard<std::mutex> lock(mutex_);
1157 auto virtualScreen = screens_.find(id);
1158 if (virtualScreen == screens_.end()) {
1159 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1160 return false;
1161 } else {
1162 if (virtualScreen->second != nullptr) {
1163 return virtualScreen->second->GetCastScreenEnableSkipWindow();
1164 } else {
1165 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1166 return false;
1167 }
1168 }
1169 }
1170
GetVirtualScreenBlackList(ScreenId id)1171 std::unordered_set<NodeId> RSScreenManager::GetVirtualScreenBlackList(ScreenId id)
1172 {
1173 std::lock_guard<std::mutex> lock(mutex_);
1174 auto virtualScreen = screens_.find(id);
1175 if (virtualScreen == screens_.end()) {
1176 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1177 return {};
1178 } else {
1179 if (virtualScreen->second != nullptr) {
1180 return virtualScreen->second->GetBlackList();
1181 } else {
1182 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1183 return {};
1184 }
1185 }
1186 }
1187
GetAllBlackList() const1188 std::unordered_set<uint64_t> RSScreenManager::GetAllBlackList() const
1189 {
1190 std::lock_guard<std::mutex> lock(mutex_);
1191 std::unordered_set<uint64_t> allBlackList;
1192 for (const auto& screen : screens_) {
1193 if (screen.second == nullptr) {
1194 continue;
1195 }
1196 if (screen.second->GetCastScreenEnableSkipWindow()) {
1197 allBlackList.insert(castScreenBlackLists_.begin(), castScreenBlackLists_.end());
1198 } else {
1199 const auto& blackList = screen.second->GetBlackList();
1200 allBlackList.insert(blackList.begin(), blackList.end());
1201 }
1202 }
1203 return allBlackList;
1204 }
1205
GetAllWhiteList() const1206 std::unordered_set<uint64_t> RSScreenManager::GetAllWhiteList() const
1207 {
1208 std::lock_guard<std::mutex> lock(mutex_);
1209 std::unordered_set<uint64_t> allWhiteList;
1210 for (const auto& screen : screens_) {
1211 if (screen.second != nullptr) {
1212 const auto& whiteList = screen.second->GetWhiteList();
1213 allWhiteList.insert(whiteList.begin(), whiteList.end());
1214 }
1215 }
1216 return allWhiteList;
1217 }
1218
SetVirtualScreenSurface(ScreenId id,sptr<Surface> surface)1219 int32_t RSScreenManager::SetVirtualScreenSurface(ScreenId id, sptr<Surface> surface)
1220 {
1221 std::lock_guard<std::mutex> lock(mutex_);
1222 auto screensIt = screens_.find(id);
1223 if (screensIt == screens_.end() || screensIt->second == nullptr || surface == nullptr) {
1224 return SCREEN_NOT_FOUND;
1225 }
1226 uint64_t surfaceId = surface->GetUniqueId();
1227 for (auto &[screenId, screen] : screens_) {
1228 if (screen == nullptr) {
1229 RS_LOGW("SetVirtualScreenSurface:screen %{public}" PRIu64 " not found", screenId);
1230 continue;
1231 }
1232 if (!screen->IsVirtual() || screenId == id) {
1233 continue;
1234 }
1235 auto screenSurface = screen->GetProducerSurface();
1236 if (screenSurface == nullptr) {
1237 continue;
1238 }
1239 if (screenSurface->GetUniqueId() == surface->GetUniqueId()) {
1240 RS_LOGE("RSScreenManager %{public}s: surface %{public}" PRIu64 " is used, set surface failed!",
1241 __func__, surfaceId);
1242 return SURFACE_NOT_UNIQUE;
1243 }
1244 }
1245 screensIt->second->SetProducerSurface(surface);
1246 RS_LOGD("RSScreenManager %{public}s: set virtual screen surface success!", __func__);
1247 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetVirtualScreenSurface, ForceRefreshOneFrame.");
1248 ForceRefreshOneFrame();
1249 return SUCCESS;
1250 }
1251
GetAndResetVirtualSurfaceUpdateFlag(ScreenId id) const1252 bool RSScreenManager::GetAndResetVirtualSurfaceUpdateFlag(ScreenId id) const
1253 {
1254 std::lock_guard<std::mutex> lock(mutex_);
1255 auto virtualScreen = screens_.find(id);
1256 if (virtualScreen == screens_.end()) {
1257 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1258 return false;
1259 }
1260 if (virtualScreen->second != nullptr) {
1261 return virtualScreen->second->GetAndResetVirtualSurfaceUpdateFlag();
1262 } else {
1263 RS_LOGW("RSScreenManager %{public}s: Null screen for id %{public}" PRIu64 ".", __func__, id);
1264 return false;
1265 }
1266 }
1267
RemoveVirtualScreen(ScreenId id)1268 void RSScreenManager::RemoveVirtualScreen(ScreenId id)
1269 {
1270 {
1271 std::lock_guard<std::mutex> lock(mutex_);
1272 RemoveVirtualScreenLocked(id);
1273 }
1274 // when virtual screen doesn't exist no more, render control can be recovered.
1275 {
1276 std::lock_guard<std::mutex> lock(renderControlMutex_);
1277 disableRenderControlScreens_.erase(id);
1278 }
1279 }
1280
RemoveVirtualScreenLocked(ScreenId id)1281 void RSScreenManager::RemoveVirtualScreenLocked(ScreenId id)
1282 {
1283 auto screensIt = screens_.find(id);
1284 if (screensIt == screens_.end()) {
1285 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1286 return;
1287 }
1288
1289 screens_.erase(screensIt);
1290 --currentVirtualScreenNum_;
1291
1292 // Update other screens' mirrorId.
1293 for (auto &[id, screen] : screens_) {
1294 if (screen == nullptr) {
1295 RS_LOGW("RemoveVirtualScreenLocked:screen %{public}" PRIu64 " not found", id);
1296 continue;
1297 }
1298 if (screen->MirrorId() == id) {
1299 screen->SetMirror(INVALID_SCREEN_ID);
1300 }
1301 }
1302 RS_LOGD("RSScreenManager %{public}s: remove virtual screen(id %{public}" PRIu64 ").", __func__, id);
1303
1304 ReuseVirtualScreenIdLocked(id);
1305 }
1306
SetScreenActiveMode(ScreenId id,uint32_t modeId)1307 void RSScreenManager::SetScreenActiveMode(ScreenId id, uint32_t modeId)
1308 {
1309 std::lock_guard<std::mutex> lock(mutex_);
1310
1311 auto screensIt = screens_.find(id);
1312 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1313 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1314 return;
1315 }
1316 screensIt->second->SetActiveMode(modeId);
1317 }
1318
SetScreenActiveRect(ScreenId id,const GraphicIRect & activeRect)1319 uint32_t RSScreenManager::SetScreenActiveRect(ScreenId id, const GraphicIRect& activeRect)
1320 {
1321 std::lock_guard<std::mutex> lock(mutex_);
1322
1323 auto screensIt = screens_.find(id);
1324 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1325 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1326 return SCREEN_NOT_FOUND;
1327 }
1328 return screensIt->second->SetScreenActiveRect(activeRect);
1329 }
1330
SetPhysicalScreenResolution(ScreenId id,uint32_t width,uint32_t height)1331 int32_t RSScreenManager::SetPhysicalScreenResolution(ScreenId id, uint32_t width, uint32_t height)
1332 {
1333 std::lock_guard<std::mutex> lock(mutex_);
1334
1335 auto screensIt = screens_.find(id);
1336 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1337 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1338 return SCREEN_NOT_FOUND;
1339 }
1340 return screensIt->second->SetResolution(width, height);
1341 }
1342
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)1343 int32_t RSScreenManager::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
1344 {
1345 std::lock_guard<std::mutex> lock(mutex_);
1346
1347 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
1348 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
1349 " the maximum limit!", __func__, width, height);
1350 return INVALID_ARGUMENTS;
1351 }
1352 auto screensIt = screens_.find(id);
1353 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1354 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1355 return SCREEN_NOT_FOUND;
1356 }
1357 screensIt->second->SetResolution(width, height);
1358 RS_LOGD("RSScreenManager %{public}s: set virtual screen resolution success", __func__);
1359 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetVirtualScreenResolution, ForceRefreshOneFrame.");
1360 ForceRefreshOneFrame();
1361 return SUCCESS;
1362 }
1363
SetRogScreenResolution(ScreenId id,uint32_t width,uint32_t height)1364 int32_t RSScreenManager::SetRogScreenResolution(ScreenId id, uint32_t width, uint32_t height)
1365 {
1366 std::lock_guard<std::mutex> lock(mutex_);
1367
1368 auto screensIt = screens_.find(id);
1369 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1370 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1371 return SCREEN_NOT_FOUND;
1372 }
1373 screensIt->second->SetRogResolution(width, height);
1374 return SUCCESS;
1375 }
1376
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)1377 void RSScreenManager::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
1378 {
1379 std::lock_guard<std::mutex> lock(mutex_);
1380
1381 auto screensIt = screens_.find(id);
1382 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1383 RS_LOGW("[UL_POWER]RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1384 return;
1385 }
1386 screensIt->second->SetPowerStatus(static_cast<uint32_t>(status));
1387
1388 /*
1389 * If app adds the first frame when power on the screen, delete the code
1390 */
1391 if (status == ScreenPowerStatus::POWER_STATUS_ON ||
1392 status == ScreenPowerStatus::POWER_STATUS_ON_ADVANCED) {
1393 auto mainThread = RSMainThread::Instance();
1394 if (mainThread == nullptr) {
1395 return;
1396 }
1397 mainThread->PostTask([mainThread]() {
1398 mainThread->SetDirtyFlag();
1399 mainThread->SetScreenPowerOnChanged(true);
1400 });
1401 if (screenPowerStatus_.count(id) == 0 ||
1402 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF ||
1403 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF_FAKE ||
1404 screenPowerStatus_[id] == ScreenPowerStatus::POWER_STATUS_OFF_ADVANCED) {
1405 mainThread->ForceRefreshForUni();
1406 } else {
1407 mainThread->RequestNextVSync();
1408 }
1409
1410 RS_LOGD("[UL_POWER]RSScreenManager %{public}s: PowerStatus %{public}d, request a frame", __func__, status);
1411 }
1412 screenPowerStatus_[id] = status;
1413 }
1414
SetVirtualMirrorScreenCanvasRotation(ScreenId id,bool canvasRotation)1415 bool RSScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId id, bool canvasRotation)
1416 {
1417 std::lock_guard<std::mutex> lock(mutex_);
1418
1419 auto screensIt = screens_.find(id);
1420 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1421 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1422 return false;
1423 }
1424
1425 RS_LOGD("RSScreenManager %{public}s: canvasRotation: %{public}d", __func__, canvasRotation);
1426
1427 return screensIt->second->SetVirtualMirrorScreenCanvasRotation(canvasRotation);
1428 }
1429
SetVirtualMirrorScreenScaleMode(ScreenId id,ScreenScaleMode scaleMode)1430 bool RSScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId id, ScreenScaleMode scaleMode)
1431 {
1432 std::lock_guard<std::mutex> lock(mutex_);
1433
1434 auto screensIt = screens_.find(id);
1435 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1436 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1437 return false;
1438 }
1439
1440 RS_LOGD("RSScreenManager %{public}s: scaleMode: %{public}d", __func__, scaleMode);
1441
1442 return screensIt->second->SetVirtualMirrorScreenScaleMode(scaleMode);
1443 }
1444
GetVirtualScreenResolution(ScreenId id,RSVirtualScreenResolution & virtualScreenResolution) const1445 void RSScreenManager::GetVirtualScreenResolution(ScreenId id, RSVirtualScreenResolution& virtualScreenResolution) const
1446 {
1447 std::lock_guard<std::mutex> lock(mutex_);
1448
1449 GetVirtualScreenResolutionLocked(id, virtualScreenResolution);
1450 }
1451
GetScreenActiveMode(ScreenId id,RSScreenModeInfo & screenModeInfo) const1452 void RSScreenManager::GetScreenActiveMode(ScreenId id, RSScreenModeInfo& screenModeInfo) const
1453 {
1454 std::lock_guard<std::mutex> lock(mutex_);
1455
1456 GetScreenActiveModeLocked(id, screenModeInfo);
1457 }
1458
GetScreenSupportedModes(ScreenId id) const1459 std::vector<RSScreenModeInfo> RSScreenManager::GetScreenSupportedModes(ScreenId id) const
1460 {
1461 std::lock_guard<std::mutex> lock(mutex_);
1462
1463 return GetScreenSupportedModesLocked(id);
1464 }
1465
GetScreenCapability(ScreenId id) const1466 RSScreenCapability RSScreenManager::GetScreenCapability(ScreenId id) const
1467 {
1468 std::lock_guard<std::mutex> lock(mutex_);
1469
1470 return GetScreenCapabilityLocked(id);
1471 }
1472
GetScreenPowerStatus(ScreenId id) const1473 ScreenPowerStatus RSScreenManager::GetScreenPowerStatus(ScreenId id) const
1474 {
1475 std::lock_guard<std::mutex> lock(mutex_);
1476
1477 return GetScreenPowerStatusLocked(id);
1478 }
1479
GetScreenCorrection(ScreenId id) const1480 ScreenRotation RSScreenManager::GetScreenCorrection(ScreenId id) const
1481 {
1482 std::lock_guard<std::mutex> lock(mutex_);
1483
1484 return GetScreenCorrectionLocked(id);
1485 }
1486
GetScreenData(ScreenId id) const1487 RSScreenData RSScreenManager::GetScreenData(ScreenId id) const
1488 {
1489 std::lock_guard<std::mutex> lock(mutex_);
1490 RSScreenData screenData;
1491 if (screens_.count(id) == 0) {
1492 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1493 return screenData;
1494 }
1495 RSScreenCapability capability = GetScreenCapabilityLocked(id);
1496 RSScreenModeInfo activeMode;
1497 GetScreenActiveModeLocked(id, activeMode);
1498 std::vector<RSScreenModeInfo> supportModes = GetScreenSupportedModesLocked(id);
1499 ScreenPowerStatus powerStatus = GetScreenPowerStatusLocked(id);
1500 screenData.SetCapability(capability);
1501 screenData.SetActivityModeInfo(activeMode);
1502 screenData.SetSupportModeInfo(supportModes);
1503 screenData.SetPowerStatus(powerStatus);
1504 return screenData;
1505 }
1506
ResizeVirtualScreen(ScreenId id,uint32_t width,uint32_t height)1507 int32_t RSScreenManager::ResizeVirtualScreen(ScreenId id, uint32_t width, uint32_t height)
1508 {
1509 std::lock_guard<std::mutex> lock(mutex_);
1510
1511 if (width > MAX_VIRTUAL_SCREEN_WIDTH || height > MAX_VIRTUAL_SCREEN_HEIGHT) {
1512 RS_LOGW("RSScreenManager %{public}s: width %{public}" PRIu32" or height %{public}" PRIu32" has reached"
1513 " the maximum limit!", __func__, width, height);
1514 return INVALID_ARGUMENTS;
1515 }
1516 auto screensIt = screens_.find(id);
1517 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1518 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1519 return SCREEN_NOT_FOUND;
1520 }
1521 screensIt->second->ResizeVirtualScreen(width, height);
1522 RS_LOGI("RSScreenManager %{public}s: resize virtual screen success, width:%{public}u, height:%{public}u",
1523 __func__, width, height);
1524
1525 return SUCCESS;
1526 }
1527
GetScreenBacklight(ScreenId id) const1528 int32_t RSScreenManager::GetScreenBacklight(ScreenId id) const
1529 {
1530 return GetScreenBacklightLocked(id);
1531 }
1532
GetScreenBacklightLocked(ScreenId id) const1533 int32_t RSScreenManager::GetScreenBacklightLocked(ScreenId id) const
1534 {
1535 std::shared_ptr<OHOS::Rosen::RSScreen> screen = nullptr;
1536 {
1537 std::lock_guard<std::mutex> lock(mutex_);
1538 auto screensIt = screens_.find(id);
1539 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1540 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1541 return INVALID_BACKLIGHT_VALUE;
1542 }
1543 screen = screensIt->second;
1544 }
1545 int32_t level = screen->GetScreenBacklight();
1546 return level;
1547 }
1548
SetScreenBacklight(ScreenId id,uint32_t level)1549 void RSScreenManager::SetScreenBacklight(ScreenId id, uint32_t level)
1550 {
1551 std::shared_ptr<OHOS::Rosen::RSScreen> screen = nullptr;
1552 {
1553 std::lock_guard<std::mutex> lock(mutex_);
1554 auto screensIt = screens_.find(id);
1555 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1556 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1557 return;
1558 }
1559 if (screenBacklight_[id] == level) {
1560 RS_LOGD("%{public}s: repeat backlight screenId: %{public}" PRIu64 " newLevel: %d",
1561 __func__, id, level);
1562 }
1563 screenBacklight_[id] = level;
1564 screen = screensIt->second;
1565 }
1566 screen->SetScreenBacklight(level);
1567 }
1568
QueryDefaultScreenInfo() const1569 ScreenInfo RSScreenManager::QueryDefaultScreenInfo() const
1570 {
1571 std::lock_guard<std::mutex> lock(mutex_);
1572 return QueryScreenInfoLocked(defaultScreenId_);
1573 }
1574
QueryScreenInfo(ScreenId id) const1575 ScreenInfo RSScreenManager::QueryScreenInfo(ScreenId id) const
1576 {
1577 std::lock_guard<std::mutex> lock(mutex_);
1578 return QueryScreenInfoLocked(id);
1579 }
1580
QueryScreenInfoLocked(ScreenId id) const1581 ScreenInfo RSScreenManager::QueryScreenInfoLocked(ScreenId id) const
1582 {
1583 ScreenInfo info;
1584 auto screensIt = screens_.find(id);
1585 if (screensIt == screens_.end()) {
1586 RS_LOGD("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1587 return info;
1588 }
1589
1590 const auto &screen = screensIt->second;
1591 if (!screen) {
1592 RS_LOGE("RSScreenManager::QueryScreenInfo screen %{public}" PRIu64 " has no info.", id);
1593 return info;
1594 }
1595 info.id = id;
1596 info.width = screen->Width();
1597 info.height = screen->Height();
1598 info.phyWidth = screen->PhyWidth() ? screen->PhyWidth() : screen->Width();
1599 info.phyHeight = screen->PhyHeight() ? screen->PhyHeight() : screen->Height();
1600 info.isSamplingOn = screen->IsSamplingOn();
1601 info.samplingTranslateX = screen->GetSamplingTranslateX();
1602 info.samplingTranslateY = screen->GetSamplingTranslateY();
1603 info.samplingScale = screen->GetSamplingScale();
1604 auto ret = screen->GetScreenColorGamut(info.colorGamut);
1605 if (ret != StatusCode::SUCCESS) {
1606 info.colorGamut = COLOR_GAMUT_SRGB;
1607 }
1608
1609 if (!screen->IsEnable()) {
1610 info.state = ScreenState::DISABLED;
1611 } else if (!screen->IsVirtual()) {
1612 info.state = ScreenState::HDI_OUTPUT_ENABLE;
1613 } else {
1614 info.state = ScreenState::PRODUCER_SURFACE_ENABLE;
1615 }
1616 info.skipFrameInterval = screen->GetScreenSkipFrameInterval();
1617 info.expectedRefreshRate = screen->GetScreenExpectedRefreshRate();
1618 info.skipFrameStrategy = screen->GetScreenSkipFrameStrategy();
1619 info.isEqualVsyncPeriod = screen->GetEqualVsyncPeriod();
1620 screen->GetPixelFormat(info.pixelFormat);
1621 screen->GetScreenHDRFormat(info.hdrFormat);
1622 info.whiteList = screen->GetWhiteList();
1623 info.activeRect = screen->GetActiveRect();
1624 return info;
1625 }
1626
GetCanvasRotation(ScreenId id) const1627 bool RSScreenManager::GetCanvasRotation(ScreenId id) const
1628 {
1629 std::lock_guard<std::mutex> lock(mutex_);
1630
1631 auto screensIt = screens_.find(id);
1632 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1633 RS_LOGD("RSScreenManager::GetCanvasRotation: There is no screen for id %{public}" PRIu64 ".", id);
1634 return false;
1635 }
1636 return screensIt->second->GetCanvasRotation();
1637 }
1638
GetScaleMode(ScreenId id) const1639 ScreenScaleMode RSScreenManager::GetScaleMode(ScreenId id) const
1640 {
1641 std::lock_guard<std::mutex> lock(mutex_);
1642
1643 auto screensIt = screens_.find(id);
1644 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1645 RS_LOGD("RSScreenManager::GetScaleMode: There is no screen for id %{public}" PRIu64 ".", id);
1646 return ScreenScaleMode::INVALID_MODE;
1647 }
1648 auto scaleModeDFX = static_cast<ScreenScaleMode>(
1649 RSSystemProperties::GetVirtualScreenScaleModeDFX());
1650 // Support mode can be configured for maintenance and testing before
1651 // upper layer application adaptation
1652 const auto& scaleMode = (scaleModeDFX == ScreenScaleMode::INVALID_MODE) ?
1653 screensIt->second->GetScaleMode() : scaleModeDFX;
1654 return scaleMode;
1655 }
1656
GetProducerSurface(ScreenId id) const1657 sptr<Surface> RSScreenManager::GetProducerSurface(ScreenId id) const
1658 {
1659 std::lock_guard<std::mutex> lock(mutex_);
1660
1661 auto screensIt = screens_.find(id);
1662 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1663 RS_LOGD("RSScreenManager::GetProducerSurface: There is no screen for id %{public}" PRIu64 ".", id);
1664 return nullptr;
1665 }
1666 return screensIt->second->GetProducerSurface();
1667 }
1668
GetOutput(ScreenId id) const1669 std::shared_ptr<HdiOutput> RSScreenManager::GetOutput(ScreenId id) const
1670 {
1671 std::lock_guard<std::mutex> lock(mutex_);
1672
1673 auto screensIt = screens_.find(id);
1674 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1675 RS_LOGW("RSScreenManager::GetOutput: There is no screen for id %{public}" PRIu64 ".", id);
1676 return nullptr;
1677 }
1678 return screensIt->second->GetOutput();
1679 }
1680
AddScreenChangeCallback(const sptr<RSIScreenChangeCallback> & callback)1681 int32_t RSScreenManager::AddScreenChangeCallback(const sptr<RSIScreenChangeCallback> &callback)
1682 {
1683 if (callback == nullptr) {
1684 RS_LOGE("RSScreenManager %{public}s: callback is NULL.", __func__);
1685 return INVALID_ARGUMENTS;
1686 }
1687
1688 std::lock_guard<std::mutex> lock(mutex_);
1689 // when the callback first registered, maybe there were some physical screens already connected,
1690 // so notify to remote immediately.
1691 for (const auto &[id, screen] : screens_) {
1692 if (screen == nullptr) {
1693 RS_LOGW("AddScreenChangeCallback:screen %{public}" PRIu64 " not found", id);
1694 continue;
1695 }
1696 if (!screen->IsVirtual()) {
1697 callback->OnScreenChanged(id, ScreenEvent::CONNECTED);
1698 }
1699 }
1700 screenChangeCallbacks_.push_back(callback);
1701 RS_LOGD("RSScreenManager %{public}s: add a remote callback succeed.", __func__);
1702 return SUCCESS;
1703 }
1704
RemoveScreenChangeCallback(const sptr<RSIScreenChangeCallback> & callback)1705 void RSScreenManager::RemoveScreenChangeCallback(const sptr<RSIScreenChangeCallback> &callback)
1706 {
1707 std::lock_guard<std::mutex> lock(mutex_);
1708 for (auto it = screenChangeCallbacks_.begin(); it != screenChangeCallbacks_.end(); it++) {
1709 if (*it == callback) {
1710 screenChangeCallbacks_.erase(it);
1711 RS_LOGD("RSScreenManager %{public}s: remove a remote callback succeed.", __func__);
1712 break;
1713 }
1714 }
1715 }
1716
DisplayDump(std::string & dumpString)1717 void RSScreenManager::DisplayDump(std::string& dumpString)
1718 {
1719 std::lock_guard<std::mutex> lock(mutex_);
1720 int32_t index = 0;
1721 for (const auto &[id, screen] : screens_) {
1722 if (screen == nullptr) {
1723 continue;
1724 }
1725 screen->DisplayDump(index, dumpString);
1726 index++;
1727 }
1728 }
1729
SurfaceDump(std::string & dumpString)1730 void RSScreenManager::SurfaceDump(std::string& dumpString)
1731 {
1732 std::lock_guard<std::mutex> lock(mutex_);
1733 int32_t index = 0;
1734 for (const auto &[id, screen] : screens_) {
1735 if (screen == nullptr) {
1736 continue;
1737 }
1738 screen->SurfaceDump(index, dumpString);
1739 index++;
1740 }
1741 }
1742
FpsDump(std::string & dumpString,std::string & arg)1743 void RSScreenManager::FpsDump(std::string& dumpString, std::string& arg)
1744 {
1745 std::lock_guard<std::mutex> lock(mutex_);
1746 int32_t index = 0;
1747 dumpString += "\n-- The recently fps records info of screens:\n";
1748 for (const auto &[id, screen] : screens_) {
1749 if (screen == nullptr) {
1750 continue;
1751 }
1752 screen->FpsDump(index, dumpString, arg);
1753 index++;
1754 }
1755 }
1756
ClearFpsDump(std::string & dumpString,std::string & arg)1757 void RSScreenManager::ClearFpsDump(std::string& dumpString, std::string& arg)
1758 {
1759 std::lock_guard<std::mutex> lock(mutex_);
1760 int32_t index = 0;
1761 dumpString += "\n-- Clear fps records info of screens:\n";
1762 for (const auto &[id, screen] : screens_) {
1763 if (screen == nullptr) {
1764 RS_LOGW("ClearFpsDump:screen %{public}" PRIu64 " not found", id);
1765 continue;
1766 }
1767 screen->ClearFpsDump(index, dumpString, arg);
1768 index++;
1769 }
1770 }
1771
ClearFrameBufferIfNeed()1772 void RSScreenManager::ClearFrameBufferIfNeed()
1773 {
1774 RSHardwareThread::Instance().PostTask([this]() {
1775 std::lock_guard<std::mutex> lock(mutex_);
1776 for (const auto& [id, screen] : screens_) {
1777 if (!screen || !screen->GetOutput()) {
1778 continue;
1779 }
1780 if (screen->GetOutput()->GetBufferCacheSize() > 0) {
1781 RSHardwareThread::Instance().ClearFrameBuffers(screen->GetOutput());
1782 }
1783 }
1784 });
1785 }
1786
SetScreenConstraint(ScreenId id,uint64_t timestamp,ScreenConstraintType type)1787 int32_t RSScreenManager::SetScreenConstraint(ScreenId id, uint64_t timestamp, ScreenConstraintType type)
1788 {
1789 frameId_++;
1790 auto screensIt = screens_.find(id);
1791 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1792 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1793 return StatusCode::SCREEN_NOT_FOUND;
1794 }
1795 RS_TRACE_NAME_FMT("SetScreenConstraint frameId:%lu timestamp:%lu type:%d", frameId_, timestamp, type);
1796 return screensIt->second->SetScreenConstraint(frameId_, timestamp, type);
1797 }
1798
HitchsDump(std::string & dumpString,std::string & arg)1799 void RSScreenManager::HitchsDump(std::string& dumpString, std::string& arg)
1800 {
1801 std::lock_guard<std::mutex> lock(mutex_);
1802 int32_t index = 0;
1803 dumpString += "\n-- The recently window hitchs records info of screens:\n";
1804 for (const auto &[id, screen] : screens_) {
1805 if (screen == nullptr) {
1806 continue;
1807 }
1808 screen->HitchsDump(index, dumpString, arg);
1809 index++;
1810 }
1811 }
1812
GetScreenSupportedColorGamutsLocked(ScreenId id,std::vector<ScreenColorGamut> & mode) const1813 int32_t RSScreenManager::GetScreenSupportedColorGamutsLocked(ScreenId id, std::vector<ScreenColorGamut>& mode) const
1814 {
1815 auto screensIt = screens_.find(id);
1816 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1817 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1818 return StatusCode::SCREEN_NOT_FOUND;
1819 }
1820 return screensIt->second->GetScreenSupportedColorGamuts(mode);
1821 }
1822
GetScreenSupportedMetaDataKeysLocked(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys) const1823 int32_t RSScreenManager::GetScreenSupportedMetaDataKeysLocked(
1824 ScreenId id, std::vector<ScreenHDRMetadataKey>& keys) 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 return screensIt->second->GetScreenSupportedMetaDataKeys(keys);
1832 }
1833
GetScreenColorGamutLocked(ScreenId id,ScreenColorGamut & mode) const1834 int32_t RSScreenManager::GetScreenColorGamutLocked(ScreenId id, ScreenColorGamut& mode) const
1835 {
1836 auto screensIt = screens_.find(id);
1837 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1838 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1839 return StatusCode::SCREEN_NOT_FOUND;
1840 }
1841 return screensIt->second->GetScreenColorGamut(mode);
1842 }
1843
SetScreenColorGamutLocked(ScreenId id,int32_t modeIdx)1844 int32_t RSScreenManager::SetScreenColorGamutLocked(ScreenId id, int32_t modeIdx)
1845 {
1846 auto screensIt = screens_.find(id);
1847 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1848 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1849 return StatusCode::SCREEN_NOT_FOUND;
1850 }
1851 return screensIt->second->SetScreenColorGamut(modeIdx);
1852 }
1853
SetScreenGamutMapLocked(ScreenId id,ScreenGamutMap mode)1854 int32_t RSScreenManager::SetScreenGamutMapLocked(ScreenId id, ScreenGamutMap mode)
1855 {
1856 auto screensIt = screens_.find(id);
1857 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1858 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1859 return StatusCode::SCREEN_NOT_FOUND;
1860 }
1861 RS_OPTIONAL_TRACE_NAME("RSScreenManager::SetScreenGamutMapLocked, ForceRefreshOneFrame.");
1862 ForceRefreshOneFrame();
1863 return screensIt->second->SetScreenGamutMap(mode);
1864 }
1865
SetScreenCorrectionLocked(ScreenId id,ScreenRotation screenRotation)1866 int32_t RSScreenManager::SetScreenCorrectionLocked(ScreenId id, ScreenRotation screenRotation)
1867 {
1868 auto screensIt = screens_.find(id);
1869 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1870 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1871 return StatusCode::SCREEN_NOT_FOUND;
1872 }
1873 screensIt->second->SetScreenCorrection(screenRotation);
1874 screenCorrection_[id] = screenRotation;
1875 return StatusCode::SUCCESS;
1876 }
1877
GetScreenGamutMapLocked(ScreenId id,ScreenGamutMap & mode) const1878 int32_t RSScreenManager::GetScreenGamutMapLocked(ScreenId id, ScreenGamutMap &mode) const
1879 {
1880 auto screensIt = screens_.find(id);
1881 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1882 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1883 return StatusCode::SCREEN_NOT_FOUND;
1884 }
1885 return screensIt->second->GetScreenGamutMap(mode);
1886 }
1887
GetScreenHDRCapabilityLocked(ScreenId id,RSScreenHDRCapability & screenHdrCapability) const1888 int32_t RSScreenManager::GetScreenHDRCapabilityLocked(ScreenId id, RSScreenHDRCapability& screenHdrCapability) const
1889 {
1890 auto screensIt = screens_.find(id);
1891 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1892 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1893 return StatusCode::SCREEN_NOT_FOUND;
1894 }
1895 GraphicHDRCapability hdrCapability = screensIt->second->GetHDRCapability();
1896 std::vector<ScreenHDRFormat> hdrFormats;
1897 uint32_t formatCount = hdrCapability.formatCount;
1898 hdrFormats.resize(formatCount);
1899 for (uint32_t index = 0; index < formatCount; index++) {
1900 hdrFormats[index] = static_cast<ScreenHDRFormat>(hdrCapability.formats[index]);
1901 }
1902 screenHdrCapability.SetMaxLum(hdrCapability.maxLum);
1903 screenHdrCapability.SetMaxAverageLum(hdrCapability.maxAverageLum);
1904 screenHdrCapability.SetMinLum(hdrCapability.minLum);
1905 screenHdrCapability.SetHdrFormats(hdrFormats);
1906 return StatusCode::SUCCESS;
1907 }
1908
GetScreenTypeLocked(ScreenId id,RSScreenType & type) const1909 int32_t RSScreenManager::GetScreenTypeLocked(ScreenId id, RSScreenType& type) const
1910 {
1911 auto screensIt = screens_.find(id);
1912 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1913 RS_LOGD("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1914 return StatusCode::SCREEN_NOT_FOUND;
1915 }
1916
1917 type = screensIt->second->GetScreenType();
1918 return StatusCode::SUCCESS;
1919 }
1920
SetScreenSkipFrameIntervalLocked(ScreenId id,uint32_t skipFrameInterval)1921 int32_t RSScreenManager::SetScreenSkipFrameIntervalLocked(ScreenId id, uint32_t skipFrameInterval)
1922 {
1923 auto screensIt = screens_.find(id);
1924 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1925 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1926 return StatusCode::SCREEN_NOT_FOUND;
1927 }
1928 RSScreenModeInfo screenModeInfo;
1929 // use the refresh rate of the physical screen as the maximum refresh rate
1930 GetScreenActiveModeLocked(defaultScreenId_, screenModeInfo);
1931 // guaranteed screen refresh rate at least 1
1932 if (skipFrameInterval == 0 || (skipFrameInterval > screenModeInfo.GetScreenRefreshRate())) {
1933 return INVALID_ARGUMENTS;
1934 }
1935 screensIt->second->SetScreenSkipFrameInterval(skipFrameInterval);
1936 screensIt->second->SetEqualVsyncPeriod(skipFrameInterval == 1);
1937 RS_LOGD("RSScreenManager %{public}s: screen(id %" PRIu64 "), skipFrameInterval(%d).",
1938 __func__, id, skipFrameInterval);
1939 return StatusCode::SUCCESS;
1940 }
1941
SetVirtualScreenRefreshRate(ScreenId id,uint32_t maxRefreshRate,uint32_t & actualRefreshRate)1942 int32_t RSScreenManager::SetVirtualScreenRefreshRate(ScreenId id, uint32_t maxRefreshRate, uint32_t& actualRefreshRate)
1943 {
1944 std::lock_guard<std::mutex> lock(mutex_);
1945 auto screensIt = screens_.find(id);
1946 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1947 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1948 return StatusCode::SCREEN_NOT_FOUND;
1949 }
1950 if (!screensIt->second->IsVirtual()) {
1951 RS_LOGW("RSScreenManager %{public}s: Not Support for screen:%{public}" PRIu64 ".", __func__, id);
1952 return StatusCode::SCREEN_NOT_FOUND;
1953 }
1954 if (maxRefreshRate == 0) {
1955 RS_LOGW("RSScreenManager %{public}s: Invalid maxRefreshRate:%{public}u.", __func__, maxRefreshRate);
1956 return StatusCode::INVALID_ARGUMENTS;
1957 }
1958 if (maxRefreshRate > MAX_VIRTUAL_SCREEN_REFRESH_RATE) {
1959 maxRefreshRate = MAX_VIRTUAL_SCREEN_REFRESH_RATE;
1960 }
1961 screensIt->second->SetScreenExpectedRefreshRate(maxRefreshRate);
1962 RS_LOGI("RSScreenManager %{public}s: screen(id %" PRIu64 "), maxRefreshRate(%d).",
1963 __func__, id, maxRefreshRate);
1964 actualRefreshRate = maxRefreshRate;
1965 return StatusCode::SUCCESS;
1966 }
1967
SetEqualVsyncPeriod(ScreenId id,bool isEqualVsyncPeriod)1968 void RSScreenManager::SetEqualVsyncPeriod(ScreenId id, bool isEqualVsyncPeriod)
1969 {
1970 std::lock_guard<std::mutex> lock(mutex_);
1971 auto screensIt = screens_.find(id);
1972 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1973 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1974 return;
1975 }
1976 screensIt->second->SetEqualVsyncPeriod(isEqualVsyncPeriod);
1977 return;
1978 }
1979
GetPixelFormatLocked(ScreenId id,GraphicPixelFormat & pixelFormat) const1980 int32_t RSScreenManager::GetPixelFormatLocked(ScreenId id, GraphicPixelFormat& pixelFormat) const
1981 {
1982 auto screensIt = screens_.find(id);
1983 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1984 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1985 return StatusCode::SCREEN_NOT_FOUND;
1986 }
1987 return screensIt->second->GetPixelFormat(pixelFormat);
1988 }
1989
SetPixelFormatLocked(ScreenId id,GraphicPixelFormat pixelFormat)1990 int32_t RSScreenManager::SetPixelFormatLocked(ScreenId id, GraphicPixelFormat pixelFormat)
1991 {
1992 auto screensIt = screens_.find(id);
1993 if (screensIt == screens_.end() || screensIt->second == nullptr) {
1994 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
1995 return StatusCode::SCREEN_NOT_FOUND;
1996 }
1997 return screensIt->second->SetPixelFormat(pixelFormat);
1998 }
1999
GetScreenSupportedHDRFormatsLocked(ScreenId id,std::vector<ScreenHDRFormat> & hdrFormats) const2000 int32_t RSScreenManager::GetScreenSupportedHDRFormatsLocked(ScreenId id, std::vector<ScreenHDRFormat>& hdrFormats) const
2001 {
2002 auto screensIt = screens_.find(id);
2003 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2004 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2005 return StatusCode::SCREEN_NOT_FOUND;
2006 }
2007 return screensIt->second->GetScreenSupportedHDRFormats(hdrFormats);
2008 }
2009
GetScreenHDRFormatLocked(ScreenId id,ScreenHDRFormat & hdrFormat) const2010 int32_t RSScreenManager::GetScreenHDRFormatLocked(ScreenId id, ScreenHDRFormat& hdrFormat) const
2011 {
2012 auto screensIt = screens_.find(id);
2013 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2014 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2015 return StatusCode::SCREEN_NOT_FOUND;
2016 }
2017 return screensIt->second->GetScreenHDRFormat(hdrFormat);
2018 }
2019
SetScreenHDRFormatLocked(ScreenId id,int32_t modeIdx)2020 int32_t RSScreenManager::SetScreenHDRFormatLocked(ScreenId id, int32_t modeIdx)
2021 {
2022 auto screensIt = screens_.find(id);
2023 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2024 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2025 return StatusCode::SCREEN_NOT_FOUND;
2026 }
2027 return screensIt->second->SetScreenHDRFormat(modeIdx);
2028 }
2029
GetScreenSupportedColorSpacesLocked(ScreenId id,std::vector<GraphicCM_ColorSpaceType> & colorSpaces) const2030 int32_t RSScreenManager::GetScreenSupportedColorSpacesLocked(
2031 ScreenId id, std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const
2032 {
2033 auto screensIt = screens_.find(id);
2034 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2035 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2036 return StatusCode::SCREEN_NOT_FOUND;
2037 }
2038 return screensIt->second->GetScreenSupportedColorSpaces(colorSpaces);
2039 }
2040
GetScreenColorSpaceLocked(ScreenId id,GraphicCM_ColorSpaceType & colorSpace) const2041 int32_t RSScreenManager::GetScreenColorSpaceLocked(ScreenId id, GraphicCM_ColorSpaceType& colorSpace) const
2042 {
2043 auto screensIt = screens_.find(id);
2044 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2045 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2046 return StatusCode::SCREEN_NOT_FOUND;
2047 }
2048 return screensIt->second->GetScreenColorSpace(colorSpace);
2049 }
2050
SetScreenColorSpaceLocked(ScreenId id,GraphicCM_ColorSpaceType colorSpace)2051 int32_t RSScreenManager::SetScreenColorSpaceLocked(ScreenId id, GraphicCM_ColorSpaceType colorSpace)
2052 {
2053 auto screensIt = screens_.find(id);
2054 if (screensIt == screens_.end() || screensIt->second == nullptr) {
2055 RS_LOGW("RSScreenManager %{public}s: There is no screen for id %{public}" PRIu64 ".", __func__, id);
2056 return StatusCode::SCREEN_NOT_FOUND;
2057 }
2058 return screensIt->second->SetScreenColorSpace(colorSpace);
2059 }
2060
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode) const2061 int32_t RSScreenManager::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode) const
2062 {
2063 std::lock_guard<std::mutex> lock(mutex_);
2064 return GetScreenSupportedColorGamutsLocked(id, mode);
2065 }
2066
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys) const2067 int32_t RSScreenManager::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys) const
2068 {
2069 std::lock_guard<std::mutex> lock(mutex_);
2070 return GetScreenSupportedMetaDataKeysLocked(id, keys);
2071 }
2072
GetActualScreensNum() const2073 uint32_t RSScreenManager::GetActualScreensNum() const
2074 {
2075 std::lock_guard<std::mutex> lock(mutex_);
2076 uint32_t num = 0;
2077 for (const auto &[id, screen] : screens_) {
2078 if (!screen) {
2079 continue;
2080 }
2081 if (!screen->IsVirtual()) {
2082 num += 1;
2083 } else {
2084 if (screen->GetProducerSurface()) {
2085 num += 1;
2086 }
2087 }
2088 }
2089 return num;
2090 }
2091
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode) const2092 int32_t RSScreenManager::GetScreenColorGamut(ScreenId id, ScreenColorGamut &mode) const
2093 {
2094 std::lock_guard<std::mutex> lock(mutex_);
2095 return GetScreenColorGamutLocked(id, mode);
2096 }
2097
SetScreenColorGamut(ScreenId id,int32_t modeIdx)2098 int32_t RSScreenManager::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
2099 {
2100 std::lock_guard<std::mutex> lock(mutex_);
2101 return SetScreenColorGamutLocked(id, modeIdx);
2102 }
2103
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)2104 int32_t RSScreenManager::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
2105 {
2106 std::lock_guard<std::mutex> lock(mutex_);
2107 return SetScreenGamutMapLocked(id, mode);
2108 }
2109
SetScreenCorrection(ScreenId id,ScreenRotation screenRotation)2110 int32_t RSScreenManager::SetScreenCorrection(ScreenId id, ScreenRotation screenRotation)
2111 {
2112 std::lock_guard<std::mutex> lock(mutex_);
2113 return SetScreenCorrectionLocked(id, screenRotation);
2114 }
2115
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode) const2116 int32_t RSScreenManager::GetScreenGamutMap(ScreenId id, ScreenGamutMap &mode) const
2117 {
2118 std::lock_guard<std::mutex> lock(mutex_);
2119 return GetScreenGamutMapLocked(id, mode);
2120 }
2121
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability) const2122 int32_t RSScreenManager::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability) const
2123 {
2124 std::lock_guard<std::mutex> lock(mutex_);
2125 return GetScreenHDRCapabilityLocked(id, screenHdrCapability);
2126 }
2127
GetScreenType(ScreenId id,RSScreenType & type) const2128 int32_t RSScreenManager::GetScreenType(ScreenId id, RSScreenType& type) const
2129 {
2130 std::lock_guard<std::mutex> lock(mutex_);
2131 return GetScreenTypeLocked(id, type);
2132 }
2133
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)2134 int32_t RSScreenManager::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
2135 {
2136 std::lock_guard<std::mutex> lock(mutex_);
2137 return SetScreenSkipFrameIntervalLocked(id, skipFrameInterval);
2138 }
2139
GetPixelFormat(ScreenId id,GraphicPixelFormat & pixelFormat) const2140 int32_t RSScreenManager::GetPixelFormat(ScreenId id, GraphicPixelFormat& pixelFormat) const
2141 {
2142 std::lock_guard<std::mutex> lock(mutex_);
2143 return GetPixelFormatLocked(id, pixelFormat);
2144 }
2145
SetPixelFormat(ScreenId id,GraphicPixelFormat pixelFormat)2146 int32_t RSScreenManager::SetPixelFormat(ScreenId id, GraphicPixelFormat pixelFormat)
2147 {
2148 std::lock_guard<std::mutex> lock(mutex_);
2149 return SetPixelFormatLocked(id, pixelFormat);
2150 }
2151
GetScreenSupportedHDRFormats(ScreenId id,std::vector<ScreenHDRFormat> & hdrFormats) const2152 int32_t RSScreenManager::GetScreenSupportedHDRFormats(ScreenId id, std::vector<ScreenHDRFormat>& hdrFormats) const
2153 {
2154 std::lock_guard<std::mutex> lock(mutex_);
2155 return GetScreenSupportedHDRFormatsLocked(id, hdrFormats);
2156 }
2157
GetScreenHDRFormat(ScreenId id,ScreenHDRFormat & hdrFormat) const2158 int32_t RSScreenManager::GetScreenHDRFormat(ScreenId id, ScreenHDRFormat& hdrFormat) const
2159 {
2160 std::lock_guard<std::mutex> lock(mutex_);
2161 return GetScreenHDRFormatLocked(id, hdrFormat);
2162 }
2163
SetScreenHDRFormat(ScreenId id,int32_t modeIdx)2164 int32_t RSScreenManager::SetScreenHDRFormat(ScreenId id, int32_t modeIdx)
2165 {
2166 std::lock_guard<std::mutex> lock(mutex_);
2167 return SetScreenHDRFormatLocked(id, modeIdx);
2168 }
2169
GetScreenSupportedColorSpaces(ScreenId id,std::vector<GraphicCM_ColorSpaceType> & colorSpaces) const2170 int32_t RSScreenManager::GetScreenSupportedColorSpaces(
2171 ScreenId id, std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const
2172 {
2173 std::lock_guard<std::mutex> lock(mutex_);
2174 return GetScreenSupportedColorSpacesLocked(id, colorSpaces);
2175 }
2176
GetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType & colorSpace) const2177 int32_t RSScreenManager::GetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType& colorSpace) const
2178 {
2179 std::lock_guard<std::mutex> lock(mutex_);
2180 return GetScreenColorSpaceLocked(id, colorSpace);
2181 }
2182
SetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType colorSpace)2183 int32_t RSScreenManager::SetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType colorSpace)
2184 {
2185 std::lock_guard<std::mutex> lock(mutex_);
2186 return SetScreenColorSpaceLocked(id, colorSpace);
2187 }
2188
MarkPowerOffNeedProcessOneFrame()2189 void RSScreenManager::MarkPowerOffNeedProcessOneFrame()
2190 {
2191 powerOffNeedProcessOneFrame_ = true;
2192 }
2193
ResetPowerOffNeedProcessOneFrame()2194 void RSScreenManager::ResetPowerOffNeedProcessOneFrame()
2195 {
2196 powerOffNeedProcessOneFrame_ = false;
2197 }
2198
GetPowerOffNeedProcessOneFrame() const2199 bool RSScreenManager::GetPowerOffNeedProcessOneFrame() const
2200 {
2201 return powerOffNeedProcessOneFrame_;
2202 }
2203
IsScreenPowerOff(ScreenId id) const2204 bool RSScreenManager::IsScreenPowerOff(ScreenId id) const
2205 {
2206 std::lock_guard<std::mutex> lock(mutex_);
2207 if (screenPowerStatus_.count(id) == 0) {
2208 return false;
2209 }
2210 return screenPowerStatus_.at(id) == GraphicDispPowerStatus::GRAPHIC_POWER_STATUS_SUSPEND ||
2211 screenPowerStatus_.at(id) == GraphicDispPowerStatus::GRAPHIC_POWER_STATUS_OFF;
2212 }
2213
DisablePowerOffRenderControl(ScreenId id)2214 void RSScreenManager::DisablePowerOffRenderControl(ScreenId id)
2215 {
2216 std::lock_guard<std::mutex> lock(renderControlMutex_);
2217 RS_LOGD("RSScreenManager Add Screen_%{public}" PRIu64 " for disable power-off render control.", id);
2218 disableRenderControlScreens_.insert(id);
2219 }
2220
GetDisableRenderControlScreensCount() const2221 int RSScreenManager::GetDisableRenderControlScreensCount() const
2222 {
2223 std::lock_guard<std::mutex> lock(renderControlMutex_);
2224 return disableRenderControlScreens_.size();
2225 }
2226
SetScreenSwitchStatus(bool flag)2227 void RSScreenManager::SetScreenSwitchStatus(bool flag)
2228 {
2229 isScreenSwitching_ = flag;
2230 }
2231
IsScreenSwitching() const2232 bool RSScreenManager::IsScreenSwitching() const
2233 {
2234 return isScreenSwitching_;
2235 }
2236 } // namespace impl
2237
CreateOrGetScreenManager()2238 sptr<RSScreenManager> CreateOrGetScreenManager()
2239 {
2240 return impl::RSScreenManager::GetInstance();
2241 }
2242 } // namespace Rosen
2243 } // namespace OHOS
2244