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 "pipeline/rs_render_node_map.h"
17 #include "common/rs_common_def.h"
18 #include "pipeline/rs_base_render_node.h"
19 #include "pipeline/rs_canvas_render_node.h"
20 #include "pipeline/rs_display_render_node.h"
21 #include "pipeline/rs_surface_render_node.h"
22 #include "platform/common/rs_log.h"
23
24 namespace OHOS {
25 namespace Rosen {
26 namespace {
27 constexpr const char* ENTRY_VIEW = "EntryView";
28 constexpr const char* WALLPAPER_VIEW = "WallpaperView";
29 constexpr const char* SCREENLOCK_WINDOW = "ScreenLockWindow";
30 constexpr const char* SYSUI_DROPDOWN = "SysUI_Dropdown";
31 };
RSRenderNodeMap()32 RSRenderNodeMap::RSRenderNodeMap()
33 {
34 // add animation fallback node
35 renderNodeMap_.emplace(0, new RSCanvasRenderNode(0));
36 }
37
ObtainLauncherNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)38 void RSRenderNodeMap::ObtainLauncherNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
39 {
40 if (surfaceNode == nullptr) {
41 return;
42 }
43 if (surfaceNode->GetName() == ENTRY_VIEW) {
44 entryViewNodeId_ = surfaceNode->GetId();
45 }
46 if (surfaceNode->GetName() == WALLPAPER_VIEW) {
47 wallpaperViewNodeId_ = surfaceNode->GetId();
48 }
49 }
50
ObtainScreenLockWindowNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)51 void RSRenderNodeMap::ObtainScreenLockWindowNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
52 {
53 if (surfaceNode == nullptr) {
54 return;
55 }
56 if (surfaceNode->GetName() == SCREENLOCK_WINDOW) {
57 screenLockWindowNodeId_ = surfaceNode->GetId();
58 }
59 }
60
GetEntryViewNodeId() const61 NodeId RSRenderNodeMap::GetEntryViewNodeId() const
62 {
63 return entryViewNodeId_;
64 }
65
GetWallPaperViewNodeId() const66 NodeId RSRenderNodeMap::GetWallPaperViewNodeId() const
67 {
68 return wallpaperViewNodeId_;
69 }
70
GetScreenLockWindowNodeId() const71 NodeId RSRenderNodeMap::GetScreenLockWindowNodeId() const
72 {
73 return screenLockWindowNodeId_;
74 }
75
IsResidentProcess(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)76 static bool IsResidentProcess(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
77 {
78 return surfaceNode->GetName() == ENTRY_VIEW || surfaceNode->GetName() == SYSUI_DROPDOWN ||
79 surfaceNode->GetName() == SCREENLOCK_WINDOW || surfaceNode->GetName() == WALLPAPER_VIEW;
80 }
81
IsResidentProcessNode(NodeId id) const82 bool RSRenderNodeMap::IsResidentProcessNode(NodeId id) const
83 {
84 auto nodePid = ExtractPid(id);
85 for (auto& [residentId, _] : residentSurfaceNodeMap_) {
86 if (ExtractPid(residentId) == nodePid) {
87 return true;
88 }
89 }
90 return false;
91 }
92
RegisterRenderNode(const std::shared_ptr<RSBaseRenderNode> & nodePtr)93 bool RSRenderNodeMap::RegisterRenderNode(const std::shared_ptr<RSBaseRenderNode>& nodePtr)
94 {
95 NodeId id = nodePtr->GetId();
96 if (renderNodeMap_.find(id) != renderNodeMap_.end()) {
97 return false;
98 }
99 renderNodeMap_.emplace(id, nodePtr);
100 if (nodePtr->GetType() == RSRenderNodeType::SURFACE_NODE) {
101 std::shared_ptr<RSSurfaceRenderNode> surfaceNode = nodePtr->ReinterpretCastTo<RSSurfaceRenderNode>();
102 surfaceNodeMap_.emplace(id, surfaceNode);
103 if (IsResidentProcess(surfaceNode)) {
104 residentSurfaceNodeMap_.emplace(id, surfaceNode);
105 }
106 ObtainLauncherNodeId(surfaceNode);
107 ObtainScreenLockWindowNodeId(surfaceNode);
108 }
109 return true;
110 }
111
RegisterDisplayRenderNode(const std::shared_ptr<RSDisplayRenderNode> & nodePtr)112 bool RSRenderNodeMap::RegisterDisplayRenderNode(const std::shared_ptr<RSDisplayRenderNode>& nodePtr)
113 {
114 NodeId id = nodePtr->GetId();
115 if (renderNodeMap_.find(id) != renderNodeMap_.end()) {
116 return false;
117 }
118 renderNodeMap_.emplace(id, nodePtr);
119 displayNodeMap_.emplace(id, nodePtr);
120 return true;
121 }
122
UnregisterRenderNode(NodeId id)123 void RSRenderNodeMap::UnregisterRenderNode(NodeId id)
124 {
125 renderNodeMap_.erase(id);
126 surfaceNodeMap_.erase(id);
127 drivenRenderNodeMap_.erase(id);
128 residentSurfaceNodeMap_.erase(id);
129 displayNodeMap_.erase(id);
130 }
131
AddDrivenRenderNode(const std::shared_ptr<RSBaseRenderNode> & nodePtr)132 void RSRenderNodeMap::AddDrivenRenderNode(const std::shared_ptr<RSBaseRenderNode>& nodePtr)
133 {
134 NodeId id = nodePtr->GetId();
135 if (renderNodeMap_.find(id) == renderNodeMap_.end()) {
136 return;
137 }
138 if (drivenRenderNodeMap_.find(id) != drivenRenderNodeMap_.end()) {
139 return;
140 }
141 drivenRenderNodeMap_.emplace(id, nodePtr);
142 }
143
RemoveDrivenRenderNode(NodeId id)144 void RSRenderNodeMap::RemoveDrivenRenderNode(NodeId id)
145 {
146 drivenRenderNodeMap_.erase(id);
147 }
148
FilterNodeByPid(pid_t pid)149 void RSRenderNodeMap::FilterNodeByPid(pid_t pid)
150 {
151 ROSEN_LOGD("RSRenderNodeMap::FilterNodeByPid removing all nodes belong to pid %d", pid);
152 // remove all nodes belong to given pid (by matching higher 32 bits of node id)
153 EraseIf(renderNodeMap_, [pid](const auto& pair) -> bool {
154 if (ExtractPid(pair.first) != pid) {
155 return false;
156 }
157 if (auto renderNode = (pair.second)) {
158 // update node flag to avoid animation fallback
159 renderNode->fallbackAnimationOnDestroy_ = false;
160 }
161 // remove node from tree
162 pair.second->RemoveFromTree(false);
163 return true;
164 });
165
166 EraseIf(surfaceNodeMap_, [pid](const auto& pair) -> bool {
167 return ExtractPid(pair.first) == pid;
168 });
169
170 EraseIf(drivenRenderNodeMap_, [pid](const auto& pair) -> bool {
171 return ExtractPid(pair.first) == pid;
172 });
173
174 EraseIf(residentSurfaceNodeMap_, [pid](const auto& pair) -> bool {
175 return ExtractPid(pair.first) == pid;
176 });
177
178 EraseIf(displayNodeMap_, [pid](const auto& pair) -> bool {
179 return ExtractPid(pair.first) == pid;
180 });
181
182 auto it = renderNodeMap_.find(0);
183 if (it != renderNodeMap_.end()) {
184 auto fallbackNode = (it->second);
185 if (fallbackNode) {
186 // remove all fallback animations belong to given pid
187 fallbackNode->GetAnimationManager().FilterAnimationByPid(pid);
188 }
189 }
190 }
191
TraversalNodes(std::function<void (const std::shared_ptr<RSBaseRenderNode> &)> func) const192 void RSRenderNodeMap::TraversalNodes(std::function<void (const std::shared_ptr<RSBaseRenderNode>&)> func) const
193 {
194 for (const auto& [_, node] : renderNodeMap_) {
195 func(node);
196 }
197 }
198
TraverseSurfaceNodes(std::function<void (const std::shared_ptr<RSSurfaceRenderNode> &)> func) const199 void RSRenderNodeMap::TraverseSurfaceNodes(std::function<void (const std::shared_ptr<RSSurfaceRenderNode>&)> func) const
200 {
201 for (const auto& [_, node] : surfaceNodeMap_) {
202 func(node);
203 }
204 }
205
ContainPid(pid_t pid) const206 bool RSRenderNodeMap::ContainPid(pid_t pid) const
207 {
208 bool flag = false;
209 for (const auto& [nodeId, _] : surfaceNodeMap_) {
210 if (pid == ExtractPid(nodeId)) {
211 flag = true;
212 break;
213 }
214 }
215 return flag;
216 }
217
TraverseDrivenRenderNodes(std::function<void (const std::shared_ptr<RSRenderNode> &)> func) const218 void RSRenderNodeMap::TraverseDrivenRenderNodes(std::function<void (const std::shared_ptr<RSRenderNode>&)> func) const
219 {
220 for (const auto& [_, node] : drivenRenderNodeMap_) {
221 func(node);
222 }
223 }
224
TraverseDisplayNodes(std::function<void (const std::shared_ptr<RSDisplayRenderNode> &)> func) const225 void RSRenderNodeMap::TraverseDisplayNodes(std::function<void (const std::shared_ptr<RSDisplayRenderNode>&)> func) const
226 {
227 for (const auto& [_, node] : displayNodeMap_) {
228 func(node);
229 }
230 }
231
GetResidentSurfaceNodeMap() const232 std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>> RSRenderNodeMap::GetResidentSurfaceNodeMap() const
233 {
234 return residentSurfaceNodeMap_;
235 }
236
237 template<>
GetRenderNode(NodeId id) const238 const std::shared_ptr<RSBaseRenderNode> RSRenderNodeMap::GetRenderNode(NodeId id) const
239 {
240 auto itr = renderNodeMap_.find(id);
241 if (itr == renderNodeMap_.end()) {
242 return nullptr;
243 }
244 return itr->second;
245 }
246
GetAnimationFallbackNode() const247 const std::shared_ptr<RSRenderNode> RSRenderNodeMap::GetAnimationFallbackNode() const
248 {
249 auto itr = renderNodeMap_.find(0);
250 if (itr == renderNodeMap_.end()) {
251 return nullptr;
252 }
253 return std::static_pointer_cast<RSRenderNode>(renderNodeMap_.at(0));
254 }
255
256 } // namespace Rosen
257 } // namespace OHOS
258