• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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