• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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