• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 "adapter/ohos/entrance/rs_adapter.h"
17 
18 #include "base/utils/system_properties.h"
19 #include "core/components_ng/render/adapter/rosen_window.h"
20 #include "core/pipeline/pipeline_base.h"
21 #include "render_service_client/core/ui/rs_node.h"
22 #include "render_service_client/core/ui/rs_root_node.h"
23 #include "render_service_client/core/ui/rs_surface_node.h"
24 #include "render_service_client/core/ui/rs_ui_context.h"
25 #include "render_service_client/core/ui/rs_ui_director.h"
26 #include "wm/window.h"
27 
28 namespace OHOS::Ace {
29 
RsUIDirectorInit(std::shared_ptr<OHOS::Rosen::RSUIDirector> & rsUiDirector,const OHOS::sptr<OHOS::Rosen::Window> & window,std::string cacheDir)30 void RsAdapter::RsUIDirectorInit(
31     std::shared_ptr<OHOS::Rosen::RSUIDirector>& rsUiDirector,
32     const OHOS::sptr<OHOS::Rosen::Window>& window, std::string cacheDir)
33 {
34     if (!SystemProperties::GetMultiInstanceEnabled()) {
35         rsUiDirector = OHOS::Rosen::RSUIDirector::Create();
36         auto surfaceNode = window->GetSurfaceNode();
37         rsUiDirector->SetRSSurfaceNode(surfaceNode);
38         rsUiDirector->SetCacheDir(cacheDir);
39         rsUiDirector->Init();
40     } else {
41         rsUiDirector = window->GetRSUIDirector();
42         if (!rsUiDirector) {
43             rsUiDirector = OHOS::Rosen::RSUIDirector::Create();
44         }
45         rsUiDirector->SetRSSurfaceNode(window->GetSurfaceNode());
46         rsUiDirector->SetCacheDir(cacheDir);
47         rsUiDirector->Init(true, true);
48     }
49 }
50 
RsFlushImplicitTransaction(std::shared_ptr<OHOS::Rosen::RSUIDirector> & rsUiDirector,const OHOS::sptr<OHOS::Rosen::Window> & dragWindow,std::shared_ptr<OHOS::Rosen::RSSurfaceNode> & surfaceNode)51 void RsAdapter::RsFlushImplicitTransaction(
52     std::shared_ptr<OHOS::Rosen::RSUIDirector>& rsUiDirector,
53     const OHOS::sptr<OHOS::Rosen::Window>& dragWindow,
54     std::shared_ptr<OHOS::Rosen::RSSurfaceNode>& surfaceNode)
55 {
56     if (!SystemProperties::GetMultiInstanceEnabled()) {
57         rsUiDirector = Rosen::RSUIDirector::Create();
58         rsUiDirector->Init();
59         auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
60         if (transactionProxy != nullptr) {
61             transactionProxy->FlushImplicitTransaction();
62         }
63     } else {
64         rsUiDirector = dragWindow->GetRSUIDirector();
65         if (!rsUiDirector) {
66             rsUiDirector = Rosen::RSUIDirector::Create();
67         }
68         rsUiDirector->Init(true, true);
69         auto surfaceNode = dragWindow->GetSurfaceNode();
70         if (surfaceNode) {
71             auto rsUiContext = surfaceNode->GetRSUIContext();
72             if (rsUiContext) {
73                 rsUiContext->GetRSTransaction()->FlushImplicitTransaction();
74             } else {
75                 FlushImplicitTransaction();
76             }
77         } else {
78             FlushImplicitTransaction();
79         }
80     }
81     rsUiDirector->SetRSSurfaceNode(surfaceNode);
82 }
83 
RsFlushImplicitTransactionWithRoot(std::shared_ptr<OHOS::Rosen::RSUIDirector> & rsUiDirector,const OHOS::sptr<OHOS::Rosen::Window> & dragWindow,std::shared_ptr<OHOS::Rosen::RSSurfaceNode> & surfaceNode,std::shared_ptr<Rosen::RSNode> & rootNode)84 void RsAdapter::RsFlushImplicitTransactionWithRoot(
85     std::shared_ptr<OHOS::Rosen::RSUIDirector>& rsUiDirector,
86     const OHOS::sptr<OHOS::Rosen::Window>& dragWindow,
87     std::shared_ptr<OHOS::Rosen::RSSurfaceNode>& surfaceNode,
88     std::shared_ptr<Rosen::RSNode>& rootNode)
89 {
90     if (!SystemProperties::GetMultiInstanceEnabled()) {
91         rsUiDirector = Rosen::RSUIDirector::Create();
92         rsUiDirector->Init();
93         auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
94         if (transactionProxy != nullptr) {
95             transactionProxy->FlushImplicitTransaction();
96         }
97         rsUiDirector->SetRSSurfaceNode(surfaceNode);
98         rootNode = Rosen::RSRootNode::Create();
99     } else {
100         rsUiDirector = dragWindow->GetRSUIDirector();
101         if (!rsUiDirector) {
102             rsUiDirector = Rosen::RSUIDirector::Create();
103         }
104         rsUiDirector->Init(true, true);
105         auto surfaceNode = dragWindow->GetSurfaceNode();
106         std::shared_ptr<Rosen::RSUIContext> rsUiContext;
107         if (surfaceNode) {
108             rsUiContext = surfaceNode->GetRSUIContext();
109             if (rsUiContext) {
110                 rsUiContext->GetRSTransaction()->FlushImplicitTransaction();
111             } else {
112                 FlushImplicitTransaction();
113             }
114         } else {
115             FlushImplicitTransaction();
116         }
117         rsUiDirector->SetRSSurfaceNode(surfaceNode);
118         rootNode = Rosen::RSRootNode::Create(false, false, rsUiContext);
119     }
120 }
121 
FlushImplicitTransaction()122 void RsAdapter::FlushImplicitTransaction()
123 {
124     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
125     if (transactionProxy != nullptr) {
126         transactionProxy->FlushImplicitTransaction();
127     }
128 }
129 
GetRSUIContext(const RefPtr<PipelineBase> & pipeline)130 std::shared_ptr<Rosen::RSUIContext> RsAdapter::GetRSUIContext(const RefPtr<PipelineBase>& pipeline)
131 {
132     CHECK_NULL_RETURN(pipeline, nullptr);
133     auto window = pipeline->GetWindow();
134     CHECK_NULL_RETURN(window, nullptr);
135     auto rsUIDirector = window->GetRSUIDirector();
136     CHECK_NULL_RETURN(rsUIDirector, nullptr);
137     auto rsUIContext = rsUIDirector->GetRSUIContext();
138     return rsUIContext;
139 }
140 }