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 #ifndef RENDER_SERVICE_BASE_PIPELINE_RS_RENDER_NODE_MAP_H 16 #define RENDER_SERVICE_BASE_PIPELINE_RS_RENDER_NODE_MAP_H 17 18 #include <mutex> 19 #include <unordered_map> 20 #include <unordered_set> 21 22 #include "common/rs_common_def.h" 23 #include "common/rs_macros.h" 24 #include "pipeline/rs_base_render_node.h" 25 26 namespace OHOS { 27 namespace Rosen { 28 class RSRenderNode; 29 class RSSurfaceRenderNode; 30 class RSScreenRenderNode; 31 class RSCanvasDrawingRenderNode; 32 class RSLogicalDisplayRenderNode; 33 class RSB_EXPORT RSRenderNodeMap final { 34 public: 35 bool RegisterRenderNode(const std::shared_ptr<RSBaseRenderNode>& nodePtr); 36 void UnregisterRenderNode(NodeId id); 37 38 void RegisterUnTreeNode(NodeId id); 39 bool UnRegisterUnTreeNode(NodeId id); 40 41 // Get RenderNode with type T, return nullptr if not found or type mismatch 42 template<typename T = RSBaseRenderNode> GetRenderNode(NodeId id)43 const std::shared_ptr<T> GetRenderNode(NodeId id) const 44 { 45 auto renderNode = GetRenderNode<RSBaseRenderNode>(id); 46 return RSBaseRenderNode::ReinterpretCast<T>(renderNode); 47 } 48 template<> 49 const std::shared_ptr<RSBaseRenderNode> GetRenderNode(NodeId id) const; 50 51 const std::shared_ptr<RSRenderNode> GetAnimationFallbackNode() const; 52 53 const std::string GetSelfDrawSurfaceNameByPid(pid_t nodePid) const; 54 55 bool ContainPid(pid_t pid) const; 56 // On remote died, the instance root node will be directly removed from the tree, 57 // and the remaining subtree will be released in batches (this feature is enabled by default). 58 void FilterNodeByPid(pid_t pid, bool immediate = false); 59 void MoveRenderNodeMap( 60 std::shared_ptr<std::unordered_map<NodeId, std::shared_ptr<RSBaseRenderNode>>> subRenderNodeMap, pid_t pid); 61 void TraversalNodes(std::function<void (const std::shared_ptr<RSBaseRenderNode>&)> func) const; 62 void TraversalNodesByPid(int pid, std::function<void (const std::shared_ptr<RSBaseRenderNode>&)> func) const; 63 void TraverseSurfaceNodes(std::function<void (const std::shared_ptr<RSSurfaceRenderNode>&)> func) const; 64 void TraverseSurfaceNodesBreakOnCondition( 65 std::function<bool (const std::shared_ptr<RSSurfaceRenderNode>&)> func) const; 66 void TraverseScreenNodes(std::function<void (const std::shared_ptr<RSScreenRenderNode>&)> func) const; 67 void TraverseLogicalDisplayNodes( 68 std::function<void (const std::shared_ptr<RSLogicalDisplayRenderNode>&)> func) const; 69 void TraverseCanvasDrawingNodes(std::function<void (const std::shared_ptr<RSCanvasDrawingRenderNode>&)> func) const; 70 const std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>>& GetResidentSurfaceNodeMap() const; 71 bool IsResidentProcessNode(NodeId id) const; 72 bool IsUIExtensionSurfaceNode(NodeId id) const; 73 74 NodeId GetEntryViewNodeId() const; 75 NodeId GetWallPaperViewNodeId() const; 76 NodeId GetScreenLockWindowNodeId() const; 77 NodeId GetNegativeScreenNodeId() const; 78 void ObtainScreenLockWindowNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode); 79 void ObtainLauncherNodeId(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode); 80 81 uint32_t GetVisibleLeashWindowCount() const; 82 uint64_t GetSize() const; 83 84 // call from main thread 85 std::vector<NodeId> GetSelfDrawingNodeInProcess(pid_t pid); 86 private: 87 explicit RSRenderNodeMap(); 88 ~RSRenderNodeMap() = default; 89 RSRenderNodeMap(const RSRenderNodeMap&) = delete; 90 RSRenderNodeMap(const RSRenderNodeMap&&) = delete; 91 RSRenderNodeMap& operator=(const RSRenderNodeMap&) = delete; 92 RSRenderNodeMap& operator=(const RSRenderNodeMap&&) = delete; 93 94 private: 95 std::weak_ptr<RSContext> context_; 96 NodeId entryViewNodeId_ = 0; 97 NodeId negativeScreenNodeId_ = 0; 98 NodeId wallpaperViewNodeId_ = 0; 99 NodeId screenLockWindowNodeId_ = 0; 100 101 std::unordered_map<pid_t, std::unordered_map<NodeId, std::shared_ptr<RSBaseRenderNode>>> renderNodeMap_; 102 std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>> surfaceNodeMap_; 103 std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>> residentSurfaceNodeMap_; 104 std::unordered_map<NodeId, std::shared_ptr<RSScreenRenderNode>> screenNodeMap_; 105 std::unordered_map<NodeId, std::shared_ptr<RSLogicalDisplayRenderNode>> logicalDisplayNodeMap_; 106 std::unordered_map<NodeId, std::shared_ptr<RSCanvasDrawingRenderNode>> canvasDrawingNodeMap_; 107 std::unordered_map<NodeId, bool> purgeableNodeMap_; 108 std::unordered_map<pid_t, std::unordered_map<NodeId, std::shared_ptr<RSSurfaceRenderNode>>> 109 selfDrawingNodeInProcess_; 110 std::unordered_set<NodeId> unInTreeNodeSet_; 111 112 void Initialize(const std::weak_ptr<RSContext>& context); 113 114 void AddUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode); 115 void RemoveUIExtensionSurfaceNode(const std::shared_ptr<RSSurfaceRenderNode> surfaceNode); 116 void CollectSelfDrawingNodeOfSubTree(std::vector<NodeId>& vec, const std::shared_ptr<RSBaseRenderNode> rootNode); 117 std::unordered_set<NodeId> uiExtensionSurfaceNodes_; 118 mutable std::mutex uiExtensionSurfaceNodesMutex_; 119 120 friend class RSContext; 121 friend class RSMainThread; 122 #ifdef RS_PROFILER_ENABLED 123 friend class RSProfiler; 124 #endif 125 }; 126 } // namespace Rosen 127 } // namespace OHOS 128 129 #endif // RENDER_SERVICE_BASE_PIPELINE_RS_RENDER_NODE_MAP_H 130