From b66bda38afacd6db1323b9c11fae4fd6c552bf1f Mon Sep 17 00:00:00 2001 From: zhangyao Date: Sat, 27 Jan 2024 08:30:50 +0000 Subject: [PATCH] =?UTF-8?q?Description:=20=E4=BF=AE=E5=A4=8DDMS=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8E=A5=E5=8F=A3=E6=80=A7=E8=83=BD=E5=8A=A3=E5=8C=96?= =?UTF-8?q?=20IssueNo:=20https://gitee.com/openharmony/window=5Fwindow=5Fm?= =?UTF-8?q?anager/issues/I8ZBPC=20Feature=20or=20Bugfix:=20Feature=20Binar?= =?UTF-8?q?y=20Source:No=20Signed-off-by:=20zhangyao=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/innerkits/dm/dm_common.h | 21 +++++++++- previewer/include/dm_common.h | 21 +++++++++- .../session/screen/include/screen_session.h | 1 + .../session/screen/src/screen_session.cpp | 8 +++- .../include/screen_session_manager.h | 2 + .../src/screen_session_manager.cpp | 41 +++++++++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) diff --git a/interfaces/innerkits/dm/dm_common.h b/interfaces/innerkits/dm/dm_common.h index cf439c244d..aa986ba410 100644 --- a/interfaces/innerkits/dm/dm_common.h +++ b/interfaces/innerkits/dm/dm_common.h @@ -215,6 +215,25 @@ enum class ScreenGroupChangeEvent : uint32_t { CHANGE_GROUP, }; +/** + * @brief Enumerates refreshrate modes. + */ +enum class RefreshRateMode : int32_t { + SMART = -1, + NORMAL = 1, + MIDDLE = 2, + HIGH = 3, +}; + +/** + * @brief Enumerates refreshrates. + */ +enum class RefreshRate : uint32_t { + NORMAL = 60, + MIDDLE = 90, + HIGH = 120, +}; + /** * @brief Enumerates rotations. */ @@ -387,4 +406,4 @@ struct DMRect { }; } } -#endif // OHOS_ROSEN_DM_COMMON_H \ No newline at end of file +#endif // OHOS_ROSEN_DM_COMMON_H diff --git a/previewer/include/dm_common.h b/previewer/include/dm_common.h index 4523152419..ec069f4188 100644 --- a/previewer/include/dm_common.h +++ b/previewer/include/dm_common.h @@ -216,6 +216,25 @@ enum class ScreenGroupChangeEvent : uint32_t { CHANGE_GROUP, }; +/** + * @brief Enumerates refreshrate modes. + */ +enum class RefreshRateMode : int32_t { + SMART = -1, + NORMAL = 1, + MIDDLE = 2, + HIGH = 3, +}; + +/** + * @brief Enumerates refreshrates. + */ +enum class RefreshRate : uint32_t { + NORMAL = 60, + MIDDLE = 90, + HIGH = 120, +}; + /** * @brief Enumerates rotations. */ @@ -339,4 +358,4 @@ struct DMRect { }; } } -#endif // OHOS_ROSEN_DM_COMMON_H \ No newline at end of file +#endif // OHOS_ROSEN_DM_COMMON_H diff --git a/window_scene/session/screen/include/screen_session.h b/window_scene/session/screen/include/screen_session.h index fb6e6ae0f3..a6523c9223 100644 --- a/window_scene/session/screen/include/screen_session.h +++ b/window_scene/session/screen/include/screen_session.h @@ -130,6 +130,7 @@ public: void UpdatePropertyAfterRotation(RRect bounds, int rotation, FoldDisplayMode foldDisplayMode); void UpdateAfterFoldExpand(bool foldToExpand); void UpdatePropertyByFoldControl(RRect bounds, RRect phyBounds); + void UpdateRefreshRate(uint32_t refreshRate); void UpdatePropertyByResolution(uint32_t width, uint32_t height, float virtualPixelRatio); void SetName(std::string name); void Resize(uint32_t width, uint32_t height); diff --git a/window_scene/session/screen/src/screen_session.cpp b/window_scene/session/screen/src/screen_session.cpp index b937d4ec00..0d1a84ea62 100644 --- a/window_scene/session/screen/src/screen_session.cpp +++ b/window_scene/session/screen/src/screen_session.cpp @@ -129,7 +129,6 @@ sptr ScreenSession::ConvertToDisplayInfo() if (displayInfo == nullptr) { return displayInfo; } - uint32_t refreshRate = RSInterfaces::GetInstance().GetScreenCurrentRefreshRate(screenId_); displayInfo->name_ = name_; displayInfo->SetWidth(property_.GetBounds().rect_.GetWidth()); displayInfo->SetHeight(property_.GetBounds().rect_.GetHeight()); @@ -137,7 +136,7 @@ sptr ScreenSession::ConvertToDisplayInfo() displayInfo->SetPhysicalHeight(property_.GetPhyBounds().rect_.GetHeight()); displayInfo->SetScreenId(screenId_); displayInfo->SetDisplayId(screenId_); - displayInfo->SetRefreshRate(refreshRate); + displayInfo->SetRefreshRate(property_.GetRefreshRate()); displayInfo->SetVirtualPixelRatio(property_.GetVirtualPixelRatio()); displayInfo->SetXDpi(property_.GetXDpi()); displayInfo->SetYDpi(property_.GetYDpi()); @@ -208,6 +207,11 @@ void ScreenSession::UpdatePropertyByFoldControl(RRect bounds, RRect phyBounds) property_.SetPhyBounds(phyBounds); } +void ScreenSession::UpdateRefreshRate(uint32_t refreshRate) +{ + property_.SetRefreshRate(refreshRate); +} + void ScreenSession::UpdatePropertyByResolution(uint32_t width, uint32_t height, float virtualPixelRatio) { auto screenBounds = property_.GetBounds(); diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index 4bc1063d1b..3962feb098 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -235,6 +235,8 @@ private: void ConfigureWaterfallDisplayCompressionParams(); void RegisterScreenChangeListener(); void OnScreenChange(ScreenId screenId, ScreenEvent screenEvent); + void RegisterRefreshRateModeChangeListener(); + void OnHgmRefreshRateModeChange(int32_t refreshRateMode); sptr GetOrCreateScreenSession(ScreenId screenId); sptr GetScreenSessionInner(ScreenId screenId, ScreenProperty property); void FreeDisplayMirrorNodeInner(const sptr mirrorSession); diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index 7a48a10a66..d0e644ea9e 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -159,6 +159,7 @@ void ScreenSessionManager::Init() } RegisterScreenChangeListener(); + RegisterRefreshRateModeChangeListener(); bool isPcDevice = system::GetParameter("const.product.devicetype", "unknown") == "2in1"; if (isPcDevice) { @@ -288,6 +289,18 @@ void ScreenSessionManager::RegisterScreenChangeListener() } } +void ScreenSessionManager::RegisterRefreshRateModeChangeListener() +{ + WLOGFI("Register refreshrate mode change listener."); + auto res = rsInterface_.RegisterHgmRefreshRateModeChangeCallback( + [this](int32_t refreshRateMode) { OnHgmRefreshRateModeChange(refreshRateMode); }); + if (res != StatusCode::SUCCESS) { + WLOGFE("Register refreshrate mode change listener failed, retry after 50 ms."); + auto task = [this]() { RegisterRefreshRateModeChangeListener(); }; + taskScheduler_->PostAsyncTask(task, "RegisterRefreshRateModeChangeListener", 50); // Retry after 50 ms. + } +} + void ScreenSessionManager::OnVirtualScreenChange(ScreenId screenId, ScreenEvent screenEvent) { WLOGFI("Notify scb virtual screen change, ScreenId: %{public}" PRIu64 ", ScreenEvent: %{public}d", screenId, @@ -378,6 +391,34 @@ void ScreenSessionManager::OnScreenChange(ScreenId screenId, ScreenEvent screenE } } +void ScreenSessionManager::OnHgmRefreshRateModeChange(int32_t refreshRateMode) +{ + GetDefaultScreenId(); + WLOGFI("Set refreshRateMode: %{public}d, defaultscreenid: %{public}" PRIu64"", refreshRateMode, defaultScreenId_); + uint32_t refreshRate; + RefreshRateMode mode = static_cast(refreshRateMode); + switch (mode) { + case RefreshRateMode::NORMAL : + refreshRate = static_cast(RefreshRate::NORMAL); + break; + case RefreshRateMode::MIDDLE : + refreshRate = static_cast(RefreshRate::MIDDLE); + break; + case RefreshRateMode::HIGH : + refreshRate = static_cast(RefreshRate::HIGH); + break; + default: + refreshRate = static_cast(RefreshRate::HIGH); + } + sptr screenSession = GetScreenSession(defaultScreenId_); + if (screenSession) { + screenSession->UpdateRefreshRate(refreshRate); + } else { + WLOGFE("Get default screen session failed."); + } + return ; +} + sptr ScreenSessionManager::GetScreenSession(ScreenId screenId) const { std::lock_guard lock(screenSessionMapMutex_); -- Gitee