• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "command/rs_node_command.h"
17 #include "platform/common/rs_log.h"
18 
19 namespace OHOS {
20 namespace Rosen {
21 namespace {
22 RSNodeCommandHelper::DumpNodeTreeProcessor gDumpNodeTreeProcessor = nullptr;
23 RSNodeCommandHelper::CommitDumpNodeTreeProcessor gCommitDumpNodeTreeProcessor = nullptr;
24 }
25 
AddModifier(RSContext & context,NodeId nodeId,const std::shared_ptr<RSRenderModifier> & modifier)26 void RSNodeCommandHelper::AddModifier(RSContext& context, NodeId nodeId,
27     const std::shared_ptr<RSRenderModifier>& modifier)
28 {
29     auto& nodeMap = context.GetNodeMap();
30     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
31     if (node) {
32         node->AddModifier(modifier);
33     }
34 }
35 
RemoveModifier(RSContext & context,NodeId nodeId,PropertyId propertyId)36 void RSNodeCommandHelper::RemoveModifier(RSContext& context, NodeId nodeId, PropertyId propertyId)
37 {
38     auto& nodeMap = context.GetNodeMap();
39     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
40     if (node) {
41         node->RemoveModifier(propertyId);
42     }
43 }
44 
RemoveAllModifiers(RSContext & context,NodeId nodeId)45 void RSNodeCommandHelper::RemoveAllModifiers(RSContext& context, NodeId nodeId)
46 {
47     auto& nodeMap = context.GetNodeMap();
48     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
49     if (node) {
50         node->RemoveAllModifiers();
51     }
52 }
53 
SetFreeze(RSContext & context,NodeId nodeId,bool isFreeze)54 void RSNodeCommandHelper::SetFreeze(RSContext& context, NodeId nodeId, bool isFreeze)
55 {
56     auto& nodeMap = context.GetNodeMap();
57     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
58     if (node) {
59         node->SetStaticCached(isFreeze);
60     }
61 }
62 
SetNodeName(RSContext & context,NodeId nodeId,std::string & nodeName)63 void RSNodeCommandHelper::SetNodeName(RSContext& context, NodeId nodeId, std::string& nodeName)
64 {
65     auto& nodeMap = context.GetNodeMap();
66     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
67     if (node) {
68         node->SetNodeName(nodeName);
69     }
70 }
71 
MarkNodeGroup(RSContext & context,NodeId nodeId,bool isNodeGroup,bool isForced,bool includeProperty)72 void RSNodeCommandHelper::MarkNodeGroup(RSContext& context, NodeId nodeId, bool isNodeGroup, bool isForced,
73     bool includeProperty)
74 {
75     auto& nodeMap = context.GetNodeMap();
76     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
77         node->MarkNodeGroup(isForced ? RSRenderNode::GROUPED_BY_USER : RSRenderNode::GROUPED_BY_UI, isNodeGroup,
78             includeProperty);
79     }
80 }
81 
MarkNodeSingleFrameComposer(RSContext & context,NodeId nodeId,bool isNodeSingleFrameComposer,pid_t pid)82 void RSNodeCommandHelper::MarkNodeSingleFrameComposer(RSContext& context,
83     NodeId nodeId, bool isNodeSingleFrameComposer, pid_t pid)
84 {
85     auto& nodeMap = context.GetNodeMap();
86     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
87         RSSingleFrameComposer::AddOrRemoveAppPidToMap(isNodeSingleFrameComposer, pid);
88         node->MarkNodeSingleFrameComposer(isNodeSingleFrameComposer, pid);
89     }
90 }
91 
MarkSuggestOpincNode(RSContext & context,NodeId nodeId,bool isOpincNode,bool isNeedCalculate)92 void RSNodeCommandHelper::MarkSuggestOpincNode(RSContext& context, NodeId nodeId,
93     bool isOpincNode, bool isNeedCalculate)
94 {
95     auto& nodeMap = context.GetNodeMap();
96     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
97         node->MarkSuggestOpincNode(isOpincNode, isNeedCalculate);
98     }
99 }
100 
MarkUifirstNode(RSContext & context,NodeId nodeId,bool isUifirstNode)101 void RSNodeCommandHelper::MarkUifirstNode(RSContext& context, NodeId nodeId, bool isUifirstNode)
102 {
103     auto& nodeMap = context.GetNodeMap();
104     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
105         node->MarkUifirstNode(isUifirstNode);
106     }
107 }
108 
ForceUifirstNode(RSContext & context,NodeId nodeId,bool isForceFlag,bool isUifirstEnable)109 void RSNodeCommandHelper::ForceUifirstNode(RSContext& context, NodeId nodeId, bool isForceFlag,
110     bool isUifirstEnable)
111 {
112     auto& nodeMap = context.GetNodeMap();
113     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
114         node->MarkUifirstNode(isForceFlag, isUifirstEnable);
115     }
116 }
117 
SetUIFirstSwitch(RSContext & context,NodeId nodeId,RSUIFirstSwitch uiFirstSwitch)118 void RSNodeCommandHelper::SetUIFirstSwitch(RSContext& context, NodeId nodeId, RSUIFirstSwitch uiFirstSwitch)
119 {
120     auto& nodeMap = context.GetNodeMap();
121     if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
122         node->SetUIFirstSwitch(uiFirstSwitch);
123     }
124 }
125 
SetDrawRegion(RSContext & context,NodeId nodeId,std::shared_ptr<RectF> rect)126 void RSNodeCommandHelper::SetDrawRegion(RSContext& context, NodeId nodeId, std::shared_ptr<RectF> rect)
127 {
128     auto& nodeMap = context.GetNodeMap();
129     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
130     if (node) {
131         node->SetDrawRegion(rect);
132     }
133 }
134 
SetOutOfParent(RSContext & context,NodeId nodeId,OutOfParentType outOfParent)135 void RSNodeCommandHelper::SetOutOfParent(RSContext& context, NodeId nodeId, OutOfParentType outOfParent)
136 {
137     auto& nodeMap = context.GetNodeMap();
138     auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
139     if (node) {
140         node->SetOutOfParent(outOfParent);
141     }
142 }
143 
SetTakeSurfaceForUIFlag(RSContext & context,NodeId nodeId)144 void RSNodeCommandHelper::SetTakeSurfaceForUIFlag(RSContext& context, NodeId nodeId)
145 {
146     context.InsertUiCaptureCmdsExecutedFlag(nodeId, true);
147 }
148 
RegisterGeometryTransitionPair(RSContext & context,NodeId inNodeId,NodeId outNodeId,const bool isInSameWindow)149 void RSNodeCommandHelper::RegisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId,
150     const bool isInSameWindow)
151 {
152     auto& nodeMap = context.GetNodeMap();
153     auto inNode = nodeMap.GetRenderNode<RSRenderNode>(inNodeId);
154     auto outNode = nodeMap.GetRenderNode<RSRenderNode>(outNodeId);
155     if (inNode == nullptr || outNode == nullptr) {
156         return;
157     }
158     auto sharedTransitionParam = std::make_shared<SharedTransitionParam>(inNode, outNode, isInSameWindow);
159     inNode->SetSharedTransitionParam(sharedTransitionParam);
160     outNode->SetSharedTransitionParam(sharedTransitionParam);
161 }
162 
UnregisterGeometryTransitionPair(RSContext & context,NodeId inNodeId,NodeId outNodeId)163 void RSNodeCommandHelper::UnregisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId)
164 {
165     auto& nodeMap = context.GetNodeMap();
166     auto inNode = nodeMap.GetRenderNode<RSRenderNode>(inNodeId);
167     auto outNode = nodeMap.GetRenderNode<RSRenderNode>(outNodeId);
168     // Sanity check, if any check failed, RSUniRenderVisitor will auto unregister the pair, we do nothing here.
169     if (inNode && outNode && inNode->GetSharedTransitionParam() == outNode->GetSharedTransitionParam()) {
170         inNode->SetSharedTransitionParam(nullptr);
171         outNode->SetSharedTransitionParam(nullptr);
172     }
173 }
174 
DumpClientNodeTree(RSContext & context,NodeId nodeId,pid_t pid,uint32_t taskId)175 void RSNodeCommandHelper::DumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t pid, uint32_t taskId)
176 {
177     if (gDumpNodeTreeProcessor) {
178         gDumpNodeTreeProcessor(nodeId, pid, taskId);
179     }
180 }
181 
SetDumpNodeTreeProcessor(DumpNodeTreeProcessor processor)182 void RSNodeCommandHelper::SetDumpNodeTreeProcessor(DumpNodeTreeProcessor processor)
183 {
184     gDumpNodeTreeProcessor = processor;
185 }
186 
CommitDumpClientNodeTree(RSContext & context,NodeId nodeId,pid_t pid,uint32_t taskId,const std::string & result)187 void RSNodeCommandHelper::CommitDumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t pid, uint32_t taskId,
188     const std::string& result)
189 {
190     if (gCommitDumpNodeTreeProcessor) {
191         gCommitDumpNodeTreeProcessor(nodeId, pid, taskId, result);
192     }
193 }
194 
SetCommitDumpNodeTreeProcessor(CommitDumpNodeTreeProcessor processor)195 void RSNodeCommandHelper::SetCommitDumpNodeTreeProcessor(CommitDumpNodeTreeProcessor processor)
196 {
197     gCommitDumpNodeTreeProcessor = processor;
198 }
199 } // namespace Rosen
200 } // namespace OHOS
201