• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "params/rs_render_params.h"
17 #include "pipeline/rs_render_node.h"
18 #ifdef DDGR_ENABLE_FEATURE_OPINC_DFX
19 #include "string_utils.h"
20 #endif
21 #include "common/rs_optional_trace.h"
22 
23 namespace OHOS {
24 namespace Rosen {
25 
26 constexpr int64_t MIN_REUSECOUNT = 10;
27 constexpr int64_t MAX_REUSECOUNT = 60;
28 constexpr int32_t MAX_TRY_TIMES = 3;
29 
30 // mark stable node
OpincSetInAppStateStart(bool & unchangeMarkInApp)31 void RSRenderNode::OpincSetInAppStateStart(bool& unchangeMarkInApp)
32 {
33     if (unchangeMarkInApp) {
34         return;
35     }
36     isUnchangeMarkInApp_ = true;
37     unchangeMarkInApp = true;
38 }
39 
OpincSetInAppStateEnd(bool & unchangeMarkInApp)40 void RSRenderNode::OpincSetInAppStateEnd(bool& unchangeMarkInApp)
41 {
42     if (isUnchangeMarkInApp_) {
43         isUnchangeMarkInApp_ = false;
44         unchangeMarkInApp = false;
45     }
46 }
47 
OpincQuickMarkStableNode(bool & unchangeMarkInApp,bool & unchangeMarkEnable)48 void RSRenderNode::OpincQuickMarkStableNode(bool& unchangeMarkInApp, bool& unchangeMarkEnable)
49 {
50     if (!unchangeMarkInApp) {
51         return;
52     }
53     if (GetSuggestOpincNode() && !unchangeMarkEnable) {
54         isUnchangeMarkEnable_ = true;
55         unchangeMarkEnable = true;
56     }
57     if (!unchangeMarkEnable) {
58         return;
59     }
60     auto isSelfDirty = IsSubTreeDirty() || IsContentDirty() ||
61         nodeGroupType_ > RSRenderNode::NodeGroupType::NONE;
62     if (isSelfDirty) {
63         NodeCacheStateChange(NodeChangeType::SELF_DIRTY);
64     } else if (nodeCacheState_ != NodeCacheState::STATE_UNCHANGE) {
65         NodeCacheStateChange(NodeChangeType::KEEP_UNCHANGE);
66     }
67 }
68 
OpincUpdateRootFlag(bool & unchangeMarkEnable)69 void RSRenderNode::OpincUpdateRootFlag(bool& unchangeMarkEnable)
70 {
71     if (unchangeMarkEnable) {
72         if (IsOpincUnchangeState()) {
73             isOpincRootFlag_ = true;
74             if (stagingRenderParams_) {
75                 stagingRenderParams_->OpincUpdateRootFlag(true);
76             }
77         }
78     }
79     if (isUnchangeMarkEnable_) {
80         isUnchangeMarkEnable_ = false;
81         unchangeMarkEnable = false;
82     }
83 }
84 
IsOpincUnchangeState()85 bool RSRenderNode::IsOpincUnchangeState()
86 {
87     return (nodeCacheState_ == NodeCacheState::STATE_UNCHANGE) && OpincGetNodeSupportFlag() && GetSuggestOpincNode();
88 }
89 
QuickGetNodeDebugInfo()90 std::string RSRenderNode::QuickGetNodeDebugInfo()
91 {
92     std::string ret("");
93 #ifdef DDGR_ENABLE_FEATURE_OPINC_DFX
94     AppendFormat(ret, "%llx, IsSTD:%d s:%d uc:%d suggest:%d support:%d rootF:%d",
95         GetId(), IsSubTreeDirty(), nodeCacheState_, unchangeCount_, GetSuggestOpincNode(),
96         OpincGetNodeSupportFlag(), isOpincRootFlag_);
97 #endif
98     return ret;
99 }
100 
101 // mark support node
OpincUpdateNodeSupportFlag(bool supportFlag)102 void RSRenderNode::OpincUpdateNodeSupportFlag(bool supportFlag)
103 {
104     isOpincNodeSupportFlag_ = isOpincNodeSupportFlag_ && supportFlag && (!IsMarkedRenderGroup());
105 }
106 
IsMarkedRenderGroup()107 bool RSRenderNode::IsMarkedRenderGroup()
108 {
109     return (nodeGroupType_ > RSRenderNode::NodeGroupType::NONE) || isOpincRootFlag_;
110 }
111 
OpincForcePrepareSubTree()112 bool RSRenderNode::OpincForcePrepareSubTree()
113 {
114     bool flag = (!(IsSubTreeDirty() || IsContentDirty())) && GetSuggestOpincNode() &&
115         OpincGetNodeSupportFlag() && !isOpincRootFlag_;
116     if (flag) {
117         SetParentSubTreeDirty();
118     }
119     return flag;
120 }
121 
OpincGetRootFlag() const122 bool RSRenderNode::OpincGetRootFlag() const
123 {
124     return isOpincRootFlag_;
125 }
126 
127 // arkui mark
MarkSuggestOpincNode(bool isOpincNode,bool isNeedCalculate)128 void RSRenderNode::MarkSuggestOpincNode(bool isOpincNode, bool isNeedCalculate)
129 {
130     RS_TRACE_NAME_FMT("mark opinc %llx, isopinc:%d. isCal:%d", GetId(), isOpincNode, isNeedCalculate);
131     isSuggestOpincNode_ = isOpincNode;
132     isNeedCalculate_ = isNeedCalculate;
133     SetDirty();
134 }
135 
GetSuggestOpincNode() const136 bool RSRenderNode::GetSuggestOpincNode() const
137 {
138     return isSuggestOpincNode_;
139 }
140 
NodeCacheStateChange(NodeChangeType type)141 void RSRenderNode::NodeCacheStateChange(NodeChangeType type)
142 {
143 #ifdef DDGR_ENABLE_FEATURE_OPINC_DFX
144     RS_TRACE_NAME_FMT("NodeCacheStateChange %llx, type:%d r%d unc:%d uncU:%d",
145         GetId(), type, nodeCacheState_, unchangeCount_, unchangeCountUpper_);
146 #endif
147     switch (type) {
148         case NodeChangeType::KEEP_UNCHANGE:
149             unchangeCount_++;
150             if (unchangeCount_ > unchangeCountUpper_) {
151                 nodeCacheState_ = NodeCacheState::STATE_UNCHANGE;
152             }
153             if (stagingRenderParams_) {
154                 stagingRenderParams_->OpincSetCacheChangeFlag(false, lastFrameSynced_);
155             }
156             break;
157         case NodeChangeType::SELF_DIRTY:
158             NodeCacheStateReset(NodeCacheState::STATE_CHANGE);
159             break;
160     }
161 }
162 
SetCacheStateByRetrytime()163 void RSRenderNode::SetCacheStateByRetrytime()
164 {
165     tryCacheTimes_++;
166     if (tryCacheTimes_ < MAX_TRY_TIMES) {
167         unchangeCountUpper_ = unchangeCountUpper_ + MIN_REUSECOUNT;
168         return;
169     }
170     unchangeCountUpper_ = unchangeCountUpper_ + MAX_REUSECOUNT;
171 }
172 
NodeCacheStateReset(NodeCacheState nodeCacheState)173 void RSRenderNode::NodeCacheStateReset(NodeCacheState nodeCacheState)
174 {
175     nodeCacheState_ = nodeCacheState;
176     unchangeCount_ = 0;
177     isUnchangeMarkInApp_ = false;
178     isUnchangeMarkEnable_ = false;
179     if (OpincGetRootFlag()) {
180         SetCacheStateByRetrytime();
181     }
182     if (stagingRenderParams_) {
183         stagingRenderParams_->OpincSetCacheChangeFlag(true, lastFrameSynced_);
184         stagingRenderParams_->OpincUpdateRootFlag(false);
185     }
186     isOpincRootFlag_ = false;
187 }
188 } // namespace Rosen
189 } // namespace OHOS
190