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