From e5585be61664c05fe0450e9a2e2e2a536544e5f1 Mon Sep 17 00:00:00 2001 From: huangji731 Date: Mon, 25 Dec 2023 20:55:46 +0800 Subject: [PATCH] add phy mirror Signed-off-by: huangji731 --- .../session/screen/include/screen_session.h | 3 ++ .../session/screen/src/screen_session.cpp | 18 +++++++ .../include/screen_session_manager.h | 2 + .../src/screen_session_manager.cpp | 51 +++++++++++++++++-- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/window_scene/session/screen/include/screen_session.h b/window_scene/session/screen/include/screen_session.h index 0bad01fbe3..2aced91abc 100644 --- a/window_scene/session/screen/include/screen_session.h +++ b/window_scene/session/screen/include/screen_session.h @@ -58,6 +58,7 @@ public: ScreenSession(ScreenId screenId, ScreenId rsId, const std::string& name, const ScreenProperty& property, const std::shared_ptr& displayNode); ScreenSession(ScreenId screenId, const ScreenProperty& property, ScreenId defaultScreenId); + ScreenSession(ScreenId screenId, const ScreenProperty& property, NodeId nodeId, ScreenId defaultScreenId); ScreenSession(const std::string& name, ScreenId smsId, ScreenId rsId, ScreenId defaultScreenId); virtual ~ScreenSession() = default; @@ -131,6 +132,8 @@ public: ScreenId rsId_ {}; ScreenId defaultScreenId_ = SCREEN_ID_INVALID; + ScreenId nodeId_ {}; + int32_t activeIdx_ { 0 }; std::vector> modes_ = {}; diff --git a/window_scene/session/screen/src/screen_session.cpp b/window_scene/session/screen/src/screen_session.cpp index fe34f9d6ca..53220a0a89 100644 --- a/window_scene/session/screen/src/screen_session.cpp +++ b/window_scene/session/screen/src/screen_session.cpp @@ -46,6 +46,24 @@ ScreenSession::ScreenSession(ScreenId screenId, const ScreenProperty& property, RSTransaction::FlushImplicitTransaction(); } +ScreenSession::ScreenSession(ScreenId screenId, const ScreenProperty& property, + NodeId nodeId, ScreenId defaultScreenId) + : screenId_(screenId), defaultScreenId_(defaultScreenId), property_(property) +{ + rsId_ = screenId; + Rosen::RSDisplayNodeConfig config = { .screenId = screenId_, .isMirrored = true, .mirrorNodeId = nodeId}; + displayNode_ = Rosen::RSDisplayNode::Create(config); + if (displayNode_) { + displayNode_->SetFrame(property_.GetBounds().rect_.left_, property_.GetBounds().rect_.top_, + property_.GetBounds().rect_.width_, property_.GetBounds().rect_.height_); + displayNode_->SetBounds(property_.GetBounds().rect_.left_, property_.GetBounds().rect_.top_, + property_.GetBounds().rect_.width_, property_.GetBounds().rect_.height_); + } else { + WLOGFE("Failed to create displayNode, displayNode is null!"); + } + RSTransaction::FlushImplicitTransaction(); +} + ScreenSession::ScreenSession(const std::string& name, ScreenId smsId, ScreenId rsId, ScreenId defaultScreenId) : name_(name), screenId_(smsId), rsId_(rsId), defaultScreenId_(defaultScreenId) { diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index f857385500..0e74eb271e 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -230,6 +230,8 @@ private: void RegisterScreenChangeListener(); void OnScreenChange(ScreenId screenId, ScreenEvent screenEvent); sptr GetOrCreateScreenSession(ScreenId screenId); + sptr GetScreenSessionInner(ScreenId screenId, ScreenProperty property); + void FreeDisplayMirrorNodeInner(const sptr mirrorSession); ScreenId GetDefaultScreenId(); diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index 467accddb3..2359cb90a8 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -288,9 +288,28 @@ void ScreenSessionManager::OnVirtualScreenChange(ScreenId screenId, ScreenEvent } } +void ScreenSessionManager::FreeDisplayMirrorNodeInner(const sptr mirrorSession) +{ + bool phyMirrorEnable = system::GetParameter("persist.display.mirror.enabled", "0") == "1"; + if (mirrorSession == nullptr || !phyMirrorEnable) { + return; + } + std::shared_ptr displayNode = mirrorSession->GetDisplayNode(); + if (displayNode == nullptr) { + return; + } + displayNode->RemoveFromTree(); + auto transactionProxy = RSTransactionProxy::GetInstance(); + if (transactionProxy != nullptr) { + WLOGFI("FreeDisplayMirrorNodeInner free displayNode"); + transactionProxy->FlushImplicitTransaction(); + } +} + void ScreenSessionManager::OnScreenChange(ScreenId screenId, ScreenEvent screenEvent) { WLOGFI("screenId: %{public}" PRIu64 " screenEvent: %{public}d", screenId, static_cast(screenEvent)); + bool phyMirrorEnable = system::GetParameter("persist.display.mirror.enabled", "0") == "1"; auto screenSession = GetOrCreateScreenSession(screenId); if (!screenSession) { WLOGFE("screenSession is nullptr"); @@ -309,13 +328,17 @@ void ScreenSessionManager::OnScreenChange(ScreenId screenId, ScreenEvent screenE } return; } - if (clientProxy_) { + + if (clientProxy_ && !phyMirrorEnable) { clientProxy_->OnScreenConnectionChanged(screenId, ScreenEvent::CONNECTED, screenSession->GetRSScreenId(), screenSession->GetName()); } return; } if (screenEvent == ScreenEvent::DISCONNECTED) { + if (phyMirrorEnable) { + FreeDisplayMirrorNodeInner(screenSession); + } if (clientProxy_) { clientProxy_->OnScreenConnectionChanged(screenId, ScreenEvent::DISCONNECTED, screenSession->GetRSScreenId(), screenSession->GetName()); @@ -639,6 +662,25 @@ DMError ScreenSessionManager::SetScreenColorTransform(ScreenId screenId) return screenSession->SetScreenColorTransform(); } +sptr ScreenSessionManager::GetScreenSessionInner(ScreenId screenId, ScreenProperty property) +{ + bool phyMirrorEnable = system::GetParameter("persist.display.mirror.enabled", "0") == "1"; + sptr session = nullptr; + ScreenId defScreenId = GetDefaultScreenId(); + if (phyMirrorEnable && screenId != defScreenId) { + NodeId nodeId = 0; + auto sIt = screenSessionMap_.find(defScreenId); + if (sIt != screenSessionMap_.end() && sIt->second != nullptr && sIt->second->GetDisplayNode() != nullptr) { + nodeId = sIt->second->GetDisplayNode()->GetId(); + } + WLOGFI("GetScreenSessionInner: nodeId:%{public}" PRIu64 "", nodeId); + session = new ScreenSession(screenId, property, nodeId, defScreenId); + } else { + session = new ScreenSession(screenId, property, defScreenId); + } + return session; +} + sptr ScreenSessionManager::GetOrCreateScreenSession(ScreenId screenId) { WLOGFI("SCB: ScreenSessionManager::GetOrCreateScreenSession ENTER"); @@ -648,7 +690,7 @@ sptr ScreenSessionManager::GetOrCreateScreenSession(ScreenId scre return sessionIt->second; } - ScreenId rsId = rsInterface_.GetDefaultScreenId(); + ScreenId rsId = screenId; screenIdManager_.UpdateScreenId(rsId, screenId); auto screenMode = rsInterface_.GetScreenActiveMode(screenId); @@ -684,12 +726,13 @@ sptr ScreenSessionManager::GetOrCreateScreenSession(ScreenId scre if (foldScreenController_ != nullptr) { // sensor may earlier than screen connect, when physical screen property changed, update foldScreenController_->UpdateForPhyScreenPropertyChange(); - if (screenId != 0) { + /* folder screen outer screenId is 5 */ + if (screenId == 5) { return nullptr; } } - sptr session = new ScreenSession(screenId, property, GetDefaultScreenId()); + sptr session = GetScreenSessionInner(screenId, property); session->RegisterScreenChangeListener(this); InitAbstractScreenModesInfo(session); session->groupSmsId_ = 1; -- Gitee