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 }