• 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 "params/rs_render_params.h"
19 #include "pipeline/rs_canvas_drawing_render_node.h"
20 #include "pipeline/rs_render_node.h"
21 #include "pipeline/rs_display_render_node.h"
22 #include "pipeline/rs_render_node_gc.h"
23 #include "pipeline/rs_surface_render_node.h"
24 #include "platform/common/rs_log.h"
25 #include "gfx/fps_info/rs_surface_fps_manager.h"
26 
27 namespace OHOS {
28 namespace Rosen {
29 namespace {
30 constexpr const char* ENTRY_VIEW = "SCBDesktop";
31 constexpr const char* WALLPAPER_VIEW = "SCBWallpaper";
32 constexpr const char* SCREENLOCK_WINDOW = "SCBScreenLock";
33 constexpr const char* SYSUI_DROPDOWN = "SCBDropdownPanel";
34 constexpr const char* NEGATIVE_SCREEN = "SCBNegativeScreen";
35 };
36 
37 using ResidentSurfaceNodeMap = std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>>;
38 
RSRenderNodeMap()39 RSRenderNodeMap::RSRenderNodeMap()
40 {
41     // add animation fallback node, NOTE: this is different from RSContext::globalRootRenderNode_
42     renderNodeMap_[0][0] = std::make_shared<RSBaseRenderNode>(0);
43     renderNodeMap_[0][0]->stagingRenderParams_ = std::make_unique<RSRenderParams>(0);
44 }
45 
Initialize(const std::weak_ptr<RSContext> & context)46 void RSRenderNodeMap::Initialize(const std::weak_ptr<RSContext>& context)
47 {
48     context_ = context;
49 }
50 
ObtainLauncherNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)51 void RSRenderNodeMap::ObtainLauncherNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
52 {
53     if (surfaceNode == nullptr) {
54         return;
55     }
56     if (surfaceNode->GetName().find(ENTRY_VIEW) != std::string::npos) {
57         entryViewNodeId_ = surfaceNode->GetId();
58     }
59     if (surfaceNode->GetName().find(WALLPAPER_VIEW) != std::string::npos) {
60         wallpaperViewNodeId_ = surfaceNode->GetId();
61     }
62     if (surfaceNode->GetName().find(NEGATIVE_SCREEN) != std::string::npos) {
63         negativeScreenNodeId_ = surfaceNode->GetId();
64     }
65 }
66 
ObtainScreenLockWindowNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)67 void RSRenderNodeMap::ObtainScreenLockWindowNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
68 {
69     if (surfaceNode == nullptr) {
70         return;
71     }
72     if (surfaceNode->GetName().find(SCREENLOCK_WINDOW) != std::string::npos) {
73         screenLockWindowNodeId_ = surfaceNode->GetId();
74     }
75 }
76 
GetEntryViewNodeId() const77 NodeId RSRenderNodeMap::GetEntryViewNodeId() const
78 {
79     return entryViewNodeId_;
80 }
81 
GetWallPaperViewNodeId() const82 NodeId RSRenderNodeMap::GetWallPaperViewNodeId() const
83 {
84     return wallpaperViewNodeId_;
85 }
86 
GetScreenLockWindowNodeId() const87 NodeId RSRenderNodeMap::GetScreenLockWindowNodeId() const
88 {
89     return screenLockWindowNodeId_;
90 }
91 
GetNegativeScreenNodeId() const92 NodeId RSRenderNodeMap::GetNegativeScreenNodeId() const
93 {
94     return negativeScreenNodeId_;
95 }
96 
IsResidentProcess(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)97 static bool IsResidentProcess(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
98 {
99     return surfaceNode->GetName().find(ENTRY_VIEW) != std::string::npos ||
100            surfaceNode->GetName().find(SYSUI_DROPDOWN) != std::string::npos ||
101            surfaceNode->GetName().find(SCREENLOCK_WINDOW) != std::string::npos ||
102            surfaceNode->GetName().find(WALLPAPER_VIEW) != std::string::npos;
103 }
104 
GetVisibleLeashWindowCount() const105 uint32_t RSRenderNodeMap::GetVisibleLeashWindowCount() const
106 {
107     if (surfaceNodeMap_.empty()) {
108         return 0;
109     }
110 
111     return std::count_if(surfaceNodeMap_.begin(), surfaceNodeMap_.end(),
112         [](const auto& pair) -> bool {
113             return pair.second && pair.second->IsLeashWindowSurfaceNodeVisible();
114         });
115 }
116 
GetSize() const117 uint64_t RSRenderNodeMap::GetSize() const
118 {
119     size_t mapSize = 0;
120     for (const auto& [_, subMap] : renderNodeMap_) {
121         mapSize += subMap.size();
122     }
123     return static_cast<uint64_t>(mapSize);
124 }
125 
IsResidentProcessNode(NodeId id) const126 bool RSRenderNodeMap::IsResidentProcessNode(NodeId id) const
127 {
128     auto nodePid = ExtractPid(id);
129     return std::any_of(residentSurfaceNodeMap_.begin(), residentSurfaceNodeMap_.end(),
130         [nodePid](const auto& pair) -> bool { return ExtractPid(pair.first) == nodePid; });
131 }
132 
IsUIExtensionSurfaceNode(NodeId id) const133 bool RSRenderNodeMap::IsUIExtensionSurfaceNode(NodeId id) const
134 {
135     std::lock_guard<std::mutex> lock(uiExtensionSurfaceNodesMutex_);
136     return uiExtensionSurfaceNodes_.find(id) != uiExtensionSurfaceNodes_.end();
137 }
138 
AddUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)139 void RSRenderNodeMap::AddUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
140 {
141     if (surfaceNode && surfaceNode->IsUIExtension()) {
142         std::lock_guard<std::mutex> lock(uiExtensionSurfaceNodesMutex_);
143         uiExtensionSurfaceNodes_.insert(surfaceNode->GetId());
144     }
145 }
146 
RemoveUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)147 void RSRenderNodeMap::RemoveUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode)
148 {
149     if (surfaceNode && surfaceNode->IsUIExtension()) {
150         std::lock_guard<std::mutex> lock(uiExtensionSurfaceNodesMutex_);
151         uiExtensionSurfaceNodes_.erase(surfaceNode->GetId());
152     }
153 }
154 
RegisterRenderNode(const std::shared_ptr<RSBaseRenderNode> & nodePtr)155 bool RSRenderNodeMap::RegisterRenderNode(const std::shared_ptr<RSBaseRenderNode>& nodePtr)
156 {
157     NodeId id = nodePtr->GetId();
158     pid_t pid = ExtractPid(id);
159     if (!(renderNodeMap_[pid].insert({ id, nodePtr })).second) {
160         return false;
161     }
162     nodePtr->OnRegister(context_);
163     if (nodePtr->GetType() == RSRenderNodeType::SURFACE_NODE) {
164         auto surfaceNode = nodePtr->ReinterpretCastTo<RSSurfaceRenderNode>();
165         surfaceNodeMap_.emplace(id, surfaceNode);
166         if (IsResidentProcess(surfaceNode)) {
167             residentSurfaceNodeMap_.emplace(id, surfaceNode);
168         }
169         AddUIExtensionSurfaceNode(surfaceNode);
170         ObtainLauncherNodeId(surfaceNode);
171         ObtainScreenLockWindowNodeId(surfaceNode);
172         RSSurfaceFpsManager::GetInstance().RegisterSurfaceFps(id, surfaceNode->GetName());
173     } else if (nodePtr->GetType() == RSRenderNodeType::CANVAS_DRAWING_NODE) {
174         auto canvasDrawingNode = nodePtr->ReinterpretCastTo<RSCanvasDrawingRenderNode>();
175         canvasDrawingNodeMap_.emplace(id, canvasDrawingNode);
176     }
177     return true;
178 }
179 
RegisterDisplayRenderNode(const std::shared_ptr<RSDisplayRenderNode> & nodePtr)180 bool RSRenderNodeMap::RegisterDisplayRenderNode(const std::shared_ptr<RSDisplayRenderNode>& nodePtr)
181 {
182     NodeId id = nodePtr->GetId();
183     pid_t pid = ExtractPid(id);
184     if (!(renderNodeMap_[pid].insert({ id, nodePtr })).second) {
185         return false;
186     }
187     displayNodeMap_.emplace(id, nodePtr);
188     nodePtr->OnRegister(context_);
189     return true;
190 }
191 
UnregisterRenderNode(NodeId id)192 void RSRenderNodeMap::UnregisterRenderNode(NodeId id)
193 {
194     pid_t pid = ExtractPid(id);
195     auto iter = renderNodeMap_.find(pid);
196     if (iter != renderNodeMap_.end()) {
197         auto& subMap = iter->second;
198         subMap.erase(id);
199         if (subMap.empty()) {
200             renderNodeMap_.erase(iter);
201         }
202     }
203 
204     auto it = surfaceNodeMap_.find(id);
205     if (it != surfaceNodeMap_.end()) {
206         RemoveUIExtensionSurfaceNode(it->second);
207         surfaceNodeMap_.erase(id);
208         RSSurfaceFpsManager::GetInstance().UnregisterSurfaceFps(id);
209     }
210     residentSurfaceNodeMap_.erase(id);
211     displayNodeMap_.erase(id);
212     canvasDrawingNodeMap_.erase(id);
213 }
214 
MoveRenderNodeMap(std::shared_ptr<std::unordered_map<NodeId,std::shared_ptr<RSBaseRenderNode>>> subRenderNodeMap,pid_t pid)215 void RSRenderNodeMap::MoveRenderNodeMap(
216     std::shared_ptr<std::unordered_map<NodeId, std::shared_ptr<RSBaseRenderNode>>> subRenderNodeMap, pid_t pid)
217 {
218     if (!subRenderNodeMap) {
219         return;
220     }
221     auto iter = renderNodeMap_.find(pid);
222     if (iter != renderNodeMap_.end()) {
223         auto& subMap = iter->second;
224         // remove node from tree
225         for (auto subIter = subMap.begin(); subIter != subMap.end();) {
226             subIter->second->RemoveFromTree(false);
227             subRenderNodeMap->emplace(subIter->first, subIter->second);
228             subIter = subMap.erase(subIter);
229         }
230         renderNodeMap_.erase(iter);
231     }
232 }
233 
FilterNodeByPid(pid_t pid)234 void RSRenderNodeMap::FilterNodeByPid(pid_t pid)
235 {
236     ROSEN_LOGD("RSRenderNodeMap::FilterNodeByPid removing all nodes belong to pid %{public}llu",
237         (unsigned long long)pid);
238     bool useBatchRemoving =
239         RSUniRenderJudgement::IsUniRender() && RSSystemProperties::GetBatchRemovingOnRemoteDiedEnabled();
240     // remove all nodes belong to given pid (by matching higher 32 bits of node id)
241     auto iter = renderNodeMap_.find(pid);
242     if (iter != renderNodeMap_.end()) {
243         auto& subMap = iter->second;
244         for (auto subIter = subMap.begin(); subIter != subMap.end();) {
245             if (subIter->second == nullptr) {
246                 subIter = subMap.erase(subIter);
247                 continue;
248             }
249             if (useBatchRemoving) {
250                 RSRenderNodeGC::Instance().AddToOffTreeNodeBucket(subIter->second);
251             } else if (auto parent = subIter->second->GetParent().lock()) {
252                 parent->RemoveChildFromFulllist(subIter->second->GetId());
253                 subIter->second->RemoveFromTree(false);
254             } else {
255                 subIter->second->RemoveFromTree(false);
256             }
257             subIter->second->GetAnimationManager().FilterAnimationByPid(pid);
258             subIter = subMap.erase(subIter);
259         }
260         renderNodeMap_.erase(iter);
261     }
262     EraseIf(surfaceNodeMap_, [pid, useBatchRemoving, this](const auto& pair) -> bool {
263         bool shouldErase = (ExtractPid(pair.first) == pid);
264         if (shouldErase) {
265             RSSurfaceFpsManager::GetInstance().UnregisterSurfaceFps(pair.first);
266             RemoveUIExtensionSurfaceNode(pair.second);
267         }
268         if (shouldErase && pair.second && useBatchRemoving) {
269             if (auto parent = pair.second->GetParent().lock()) {
270                 parent->RemoveChildFromFulllist(pair.second->GetId());
271             }
272             pair.second->RemoveFromTree(false);
273         }
274         return shouldErase;
275     });
276 
277     EraseIf(residentSurfaceNodeMap_, [pid](const auto& pair) -> bool {
278         return ExtractPid(pair.first) == pid;
279     });
280 
281     EraseIf(canvasDrawingNodeMap_, [pid](const auto& pair) -> bool {
282         return ExtractPid(pair.first) == pid;
283     });
284 
285     EraseIf(selfDrawingNodeInProcess_, [pid](const auto& pair) -> bool {
286         return pair.first == pid;
287     });
288 
289     EraseIf(displayNodeMap_, [pid](const auto& pair) -> bool {
290         if (ExtractPid(pair.first) != pid && pair.second) {
291             ROSEN_LOGD("RSRenderNodeMap::FilterNodeByPid removing all nodes belong to pid %{public}llu",
292                 (unsigned long long)pid);
293             pair.second->FilterModifiersByPid(pid);
294         }
295         return ExtractPid(pair.first) == pid;
296     });
297 
298     if (auto fallbackNode = GetAnimationFallbackNode()) {
299         // remove all fallback animations belong to given pid
300         fallbackNode->GetAnimationManager().FilterAnimationByPid(pid);
301     }
302 }
303 
TraversalNodes(std::function<void (const std::shared_ptr<RSBaseRenderNode> &)> func) const304 void RSRenderNodeMap::TraversalNodes(std::function<void (const std::shared_ptr<RSBaseRenderNode>&)> func) const
305 {
306     for (const auto& [_, subMap] : renderNodeMap_) {
307         for (const auto& [_, node] : subMap) {
308             func(node);
309         }
310     }
311 }
312 
TraversalNodesByPid(int pid,std::function<void (const std::shared_ptr<RSBaseRenderNode> &)> func) const313 void RSRenderNodeMap::TraversalNodesByPid(int pid,
314     std::function<void (const std::shared_ptr<RSBaseRenderNode>&)> func) const
315 {
316     const auto& itr = renderNodeMap_.find(pid);
317     if (itr != renderNodeMap_.end()) {
318         for (const auto& [_, node] : itr->second) {
319             func(node);
320         }
321     }
322 }
323 
TraverseCanvasDrawingNodes(std::function<void (const std::shared_ptr<RSCanvasDrawingRenderNode> &)> func) const324 void RSRenderNodeMap::TraverseCanvasDrawingNodes(
325     std::function<void(const std::shared_ptr<RSCanvasDrawingRenderNode>&)> func) const
326 {
327     for (const auto& [_, node] : canvasDrawingNodeMap_) {
328         func(node);
329     }
330 }
331 
TraverseSurfaceNodes(std::function<void (const std::shared_ptr<RSSurfaceRenderNode> &)> func) const332 void RSRenderNodeMap::TraverseSurfaceNodes(std::function<void (const std::shared_ptr<RSSurfaceRenderNode>&)> func) const
333 {
334     for (const auto& [_, node] : surfaceNodeMap_) {
335         func(node);
336     }
337 }
338 
TraverseSurfaceNodesBreakOnCondition(std::function<bool (const std::shared_ptr<RSSurfaceRenderNode> &)> func) const339 void RSRenderNodeMap::TraverseSurfaceNodesBreakOnCondition(
340     std::function<bool (const std::shared_ptr<RSSurfaceRenderNode>&)> func) const
341 {
342     for (const auto& [_, node] : surfaceNodeMap_) {
343         if (func(node)) {
344             break;
345         }
346     }
347 }
348 
ContainPid(pid_t pid) const349 bool RSRenderNodeMap::ContainPid(pid_t pid) const
350 {
351     return std::any_of(surfaceNodeMap_.begin(), surfaceNodeMap_.end(),
352         [pid](const auto& pair) -> bool { return ExtractPid(pair.first) == pid; });
353 }
354 
TraverseDisplayNodes(std::function<void (const std::shared_ptr<RSDisplayRenderNode> &)> func) const355 void RSRenderNodeMap::TraverseDisplayNodes(std::function<void (const std::shared_ptr<RSDisplayRenderNode>&)> func) const
356 {
357     for (const auto& [_, node] : displayNodeMap_) {
358         func(node);
359     }
360 }
361 
GetResidentSurfaceNodeMap() const362 const ResidentSurfaceNodeMap& RSRenderNodeMap::GetResidentSurfaceNodeMap() const
363 {
364     return residentSurfaceNodeMap_;
365 }
366 
367 template<>
GetRenderNode(NodeId id) const368 const std::shared_ptr<RSBaseRenderNode> RSRenderNodeMap::GetRenderNode(NodeId id) const
369 {
370     pid_t pid = ExtractPid(id);
371     auto iter = renderNodeMap_.find(pid);
372     if (iter != renderNodeMap_.end()) {
373         auto subIter = (iter->second).find(id);
374         if (subIter != (iter->second).end()) {
375             return subIter->second;
376         }
377     }
378     return nullptr;
379 }
380 
GetAnimationFallbackNode() const381 const std::shared_ptr<RSRenderNode> RSRenderNodeMap::GetAnimationFallbackNode() const
382 {
383     auto iter = renderNodeMap_.find(0);
384     if (iter != renderNodeMap_.cend()) {
385         if (auto subIter = iter->second.find(0); subIter != iter->second.end()) {
386             return subIter->second;
387         }
388     }
389     return nullptr;
390 }
391 
GetSelfDrawingNodeInProcess(pid_t pid)392 std::vector<NodeId> RSRenderNodeMap::GetSelfDrawingNodeInProcess(pid_t pid)
393 {
394     std::vector<NodeId> selfDrawingNodes;
395     std::vector<NodeId> sortedSelfDrawingNodes;
396     std::map<NodeId, std::shared_ptr<RSBaseRenderNode>> instanceNodeMap;
397     auto iter = renderNodeMap_.find(pid);
398     std::shared_ptr<RSBaseRenderNode> instanceRootNode;
399 
400     if (iter == renderNodeMap_.end()) {
401         return selfDrawingNodes;
402     }
403     for (auto subIter = iter->second.begin(); subIter != iter->second.end(); ++subIter) {
404         if (!subIter->second) {
405             continue;
406         }
407         auto surfaceNode = subIter->second->ReinterpretCastTo<RSSurfaceRenderNode>();
408         if (surfaceNode && surfaceNode->IsSelfDrawingType() && surfaceNode->IsOnTheTree()) {
409             selfDrawingNodes.push_back(surfaceNode->GetId());
410             auto rootNode = surfaceNode->GetInstanceRootNode();
411             if (rootNode) {
412                 instanceNodeMap.insert({ rootNode->GetId(), rootNode });
413             }
414         }
415     }
416 
417     if (selfDrawingNodes.size() <= 1) {
418         return selfDrawingNodes;
419     }
420 
421     std::vector<std::shared_ptr<RSSurfaceRenderNode>> instanceNodeVector;
422     for (const auto& pair : instanceNodeMap) {
423         auto node = pair.second->ReinterpretCastTo<RSSurfaceRenderNode>();
424         if (node && node->IsAppWindow()) {
425             instanceNodeVector.push_back(node);
426         } else {
427             return selfDrawingNodes;
428         }
429     }
430 
431     std::stable_sort(
432         instanceNodeVector.begin(), instanceNodeVector.end(), [](const auto& first, const auto& second) -> bool {
433         return first->GetAppWindowZOrder() < second->GetAppWindowZOrder();
434     });
435 
436     for (const auto& instanceNode : instanceNodeVector) {
437         instanceNode->CollectSelfDrawingChild(instanceNode, sortedSelfDrawingNodes);
438     }
439     return sortedSelfDrawingNodes;
440 }
441 
GetSelfDrawSurfaceNameByPid(pid_t nodePid) const442 const std::string RSRenderNodeMap::GetSelfDrawSurfaceNameByPid(pid_t nodePid) const
443 {
444     for (auto &t : surfaceNodeMap_) {
445         if (ExtractPid(t.first) == nodePid && t.second->IsSelfDrawingType() && !t.second->IsRosenWeb()) {
446             return t.second->GetName();
447         }
448     }
449     ROSEN_LOGD("RSRenderNodeMap::GetSurfaceNameByPid no self drawing nodes belong to pid %{public}d",
450         static_cast<int32_t>(nodePid));
451     return "";
452 }
453 
454 } // namespace Rosen
455 } // namespace OHOS
456