• 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_surface_render_node.h"
17 
18 #include "command/rs_command_verify_helper.h"
19 #include "command/rs_surface_node_command.h"
20 #include "common/rs_common_def.h"
21 #include "common/rs_common_hook.h"
22 #include "rs_trace.h"
23 #include "common/rs_optional_trace.h"
24 #include "common/rs_obj_abs_geometry.h"
25 #include "common/rs_rect.h"
26 #include "common/rs_vector2.h"
27 #include "common/rs_vector4.h"
28 #include "ipc_callbacks/rs_rt_refresh_callback.h"
29 #include "params/rs_surface_render_params.h"
30 #include "pipeline/rs_render_node.h"
31 #include "pipeline/rs_effect_render_node.h"
32 #include "pipeline/rs_root_render_node.h"
33 #include "pipeline/rs_surface_handler.h"
34 #include "platform/common/rs_log.h"
35 #include "platform/ohos/rs_jank_stats.h"
36 #include "property/rs_properties_painter.h"
37 #include "render/rs_drawing_filter.h"
38 #include "render/rs_skia_filter.h"
39 #include "transaction/rs_render_service_client.h"
40 #include "visitor/rs_node_visitor.h"
41 #ifndef ROSEN_CROSS_PLATFORM
42 #include "metadata_helper.h"
43 #include <v1_0/cm_color_space.h>
44 #endif
45 namespace OHOS {
46 namespace Rosen {
47 
48 // set the offset value to prevent the situation where the float number
49 // with the suffix 0.000x is still rounded up.
50 constexpr float RECT_CEIL_DEVIATION = 0.001;
51 
52 namespace {
CheckRootNodeReadyToDraw(const std::shared_ptr<RSBaseRenderNode> & child)53 bool CheckRootNodeReadyToDraw(const std::shared_ptr<RSBaseRenderNode>& child)
54 {
55     if (child->IsInstanceOf<RSRootRenderNode>()) {
56         auto rootNode = child->ReinterpretCastTo<RSRootRenderNode>();
57         // when rootnode is occluded, its applymodifiers will be skipped
58         // need to applymodifiers to update its properties here
59         rootNode->ApplyModifiers();
60         const auto& property = rootNode->GetRenderProperties();
61         if (property.GetFrameWidth() > 0 && property.GetFrameHeight() > 0 && rootNode->GetEnableRender()) {
62             return true;
63         }
64     }
65     return false;
66 }
67 
CheckScbReadyToDraw(const std::shared_ptr<RSBaseRenderNode> & child)68 bool CheckScbReadyToDraw(const std::shared_ptr<RSBaseRenderNode>& child)
69 {
70     if (child->IsInstanceOf<RSCanvasRenderNode>()) {
71         auto canvasRenderNode = child->ReinterpretCastTo<RSCanvasRenderNode>();
72         const auto& property = canvasRenderNode->GetRenderProperties();
73         if (property.GetFrameWidth() > 0 && property.GetFrameHeight() > 0) {
74             return true;
75         }
76     }
77     return false;
78 }
79 
IsFirstFrameReadyToDraw(RSSurfaceRenderNode & node)80 bool IsFirstFrameReadyToDraw(RSSurfaceRenderNode& node)
81 {
82     auto sortedChildren = node.GetSortedChildren();
83     if (node.IsScbScreen() || node.IsSCBNode()) {
84         for (const auto& child : *sortedChildren) {
85             if (CheckScbReadyToDraw(child)) {
86                 return true;
87             }
88         }
89     }
90     for (auto& child : *sortedChildren) {
91         if (CheckRootNodeReadyToDraw(child)) {
92             return true;
93         }
94         // when appWindow has abilityComponent node
95         if (child->IsInstanceOf<RSSurfaceRenderNode>()) {
96             for (const auto& surfaceNodeChild : *child->GetSortedChildren()) {
97                 if (CheckRootNodeReadyToDraw(surfaceNodeChild)) {
98                     return true;
99                 }
100             }
101         }
102     }
103     return false;
104 }
105 }
106 
RSSurfaceRenderNode(const RSSurfaceRenderNodeConfig & config,const std::weak_ptr<RSContext> & context)107 RSSurfaceRenderNode::RSSurfaceRenderNode(
108     const RSSurfaceRenderNodeConfig& config, const std::weak_ptr<RSContext>& context)
109     : RSRenderNode(config.id, context, config.isTextureExportNode), name_(config.name),
110       nodeType_(config.nodeType), surfaceWindowType_(config.surfaceWindowType),
111       dirtyManager_(std::make_shared<RSDirtyRegionManager>()),
112       cacheSurfaceDirtyManager_(std::make_shared<RSDirtyRegionManager>()),
113       surfaceHandler_(std::make_shared<RSSurfaceHandler>(config.id))
114 {
115 #ifndef ROSEN_ARKUI_X
116     MemoryInfo info = {sizeof(*this), ExtractPid(config.id), config.id, MEMORY_TYPE::MEM_RENDER_NODE};
117     MemoryTrack::Instance().AddNodeRecord(config.id, info);
118     RsCommandVerifyHelper::GetInstance().AddSurfaceNodeCreateCnt(ExtractPid(config.id));
119 #endif
120     MemorySnapshot::Instance().AddCpuMemory(ExtractPid(config.id), sizeof(*this));
121 }
122 
RSSurfaceRenderNode(NodeId id,const std::weak_ptr<RSContext> & context,bool isTextureExportNode)123 RSSurfaceRenderNode::RSSurfaceRenderNode(NodeId id, const std::weak_ptr<RSContext>& context, bool isTextureExportNode)
124     : RSSurfaceRenderNode(RSSurfaceRenderNodeConfig { .id = id, .name = "SurfaceNode",
125     .isTextureExportNode = isTextureExportNode}, context)
126 {}
127 
~RSSurfaceRenderNode()128 RSSurfaceRenderNode::~RSSurfaceRenderNode()
129 {
130 #ifdef USE_SURFACE_TEXTURE
131     SetSurfaceTexture(nullptr);
132 #endif
133 #ifndef ROSEN_ARKUI_X
134     MemoryTrack::Instance().RemoveNodeRecord(GetId());
135     RsCommandVerifyHelper::GetInstance().SubSurfaceNodeCreateCnt(ExtractPid(GetId()));
136 #endif
137     MemorySnapshot::Instance().RemoveCpuMemory(ExtractPid(GetId()), sizeof(*this));
138 }
139 
140 #ifndef ROSEN_CROSS_PLATFORM
SetConsumer(const sptr<IConsumerSurface> & consumer)141 void RSSurfaceRenderNode::SetConsumer(const sptr<IConsumerSurface>& consumer)
142 {
143     GetMutableRSSurfaceHandler()->SetConsumer(consumer);
144 }
145 #endif
146 
UpdateSrcRect(const Drawing::Canvas & canvas,const Drawing::RectI & dstRect,bool hasRotation)147 void RSSurfaceRenderNode::UpdateSrcRect(const Drawing::Canvas& canvas, const Drawing::RectI& dstRect,
148     bool hasRotation)
149 {
150     auto localClipRect = RSPaintFilterCanvas::GetLocalClipBounds(canvas, &dstRect).value_or(Drawing::Rect());
151     const RSProperties& properties = GetRenderProperties();
152     int left = std::clamp<int>(localClipRect.GetLeft(), 0, properties.GetBoundsWidth());
153     int top = std::clamp<int>(localClipRect.GetTop(), 0, properties.GetBoundsHeight());
154     int width = std::clamp<int>(std::ceil(localClipRect.GetWidth() - RECT_CEIL_DEVIATION), 0,
155         std::ceil(properties.GetBoundsWidth() - left));
156     int height = std::clamp<int>(std::ceil(localClipRect.GetHeight() - RECT_CEIL_DEVIATION), 0,
157         std::ceil(properties.GetBoundsHeight() - top));
158     RectI srcRect = {left, top, width, height};
159     SetSrcRect(srcRect);
160     // We allow 1px error value to avoid disable dss by mistake [this flag only used for YUV buffer format]
161     if (IsYUVBufferFormat()) {
162         isHardwareForcedDisabledBySrcRect_ = !GetAncoForceDoDirect() &&
163             (hasRotation ? (width + 1 < static_cast<int>(properties.GetBoundsWidth())) :
164             (height + 1 < static_cast<int>(properties.GetBoundsHeight())));
165 #ifndef ROSEN_CROSS_PLATFORM
166         RS_OPTIONAL_TRACE_NAME_FMT("UpdateSrcRect hwcDisableBySrc:%d localClip:[%.2f, %.2f, %.2f, %.2f]" \
167             " bounds:[%.2f, %.2f] hasRotation:%d name:%s id:%llu",
168             isHardwareForcedDisabledBySrcRect_,
169             localClipRect.GetLeft(), localClipRect.GetTop(), localClipRect.GetWidth(), localClipRect.GetHeight(),
170             properties.GetBoundsWidth(), properties.GetBoundsHeight(), hasRotation,
171             GetName().c_str(), GetId());
172 #endif
173     }
174 }
175 
UpdateHwcDisabledBySrcRect(bool hasRotation)176 void RSSurfaceRenderNode::UpdateHwcDisabledBySrcRect(bool hasRotation)
177 {
178 #ifndef ROSEN_CROSS_PLATFORM
179     const auto& buffer = surfaceHandler_->GetBuffer();
180     isHardwareForcedDisabledBySrcRect_ = false;
181     if (buffer == nullptr) {
182         return;
183     }
184 #endif
185 }
186 
IsYUVBufferFormat() const187 bool RSSurfaceRenderNode::IsYUVBufferFormat() const
188 {
189 #ifndef ROSEN_CROSS_PLATFORM
190     auto curBuffer = surfaceHandler_->GetBuffer();
191     if (!curBuffer) {
192         return false;
193     }
194     auto format = curBuffer->GetFormat();
195     if (format < GRAPHIC_PIXEL_FMT_YUV_422_I || format == GRAPHIC_PIXEL_FMT_RGBA_1010102 ||
196         format > GRAPHIC_PIXEL_FMT_YCRCB_P010) {
197         return false;
198     }
199     return true;
200 #else
201     return false;
202 #endif
203 }
204 
ShouldPrepareSubnodes()205 bool RSSurfaceRenderNode::ShouldPrepareSubnodes()
206 {
207     // if a appwindow or abilitycomponent has a empty dstrect, its subnodes' prepare stage can be skipped
208     // most common scenario: HiBoard (SwipeLeft screen on home screen)
209     if (GetDstRect().IsEmpty() && (IsAppWindow() || IsAbilityComponent())) {
210         return false;
211     }
212     return true;
213 }
214 
StoreMustRenewedInfo()215 void RSSurfaceRenderNode::StoreMustRenewedInfo()
216 {
217     mustRenewedInfo_ = RSRenderNode::HasMustRenewedInfo() || GetHasSecurityLayer() ||
218         GetHasSkipLayer() || GetHasSnapshotSkipLayer() || GetHasProtectedLayer();
219 }
220 
DirtyRegionDump() const221 std::string RSSurfaceRenderNode::DirtyRegionDump() const
222 {
223     std::string dump = GetName() +
224         " SurfaceNodeType [" + std::to_string(static_cast<unsigned int>(GetSurfaceNodeType())) + "]" +
225         " Transparent [" + std::to_string(IsTransparent()) +"]" +
226         " DstRect: " + GetDstRect().ToString() +
227         " VisibleRegion: " + GetVisibleRegion().GetRegionInfo();
228     if (GetDirtyManager()) {
229         dump += " DirtyRegion: " + GetDirtyManager()->GetDirtyRegion().ToString();
230     }
231     return dump;
232 }
233 
PrepareRenderBeforeChildren(RSPaintFilterCanvas & canvas)234 void RSSurfaceRenderNode::PrepareRenderBeforeChildren(RSPaintFilterCanvas& canvas)
235 {
236     // Save the current state of the canvas before modifying it.
237     renderNodeSaveCount_ = canvas.SaveAllStatus();
238 
239     // Apply alpha to canvas
240     const RSProperties& properties = GetRenderProperties();
241     canvas.MultiplyAlpha(properties.GetAlpha());
242 
243     // Apply matrix to canvas
244     auto& currentGeoPtr = (properties.GetBoundsGeometry());
245     if (currentGeoPtr != nullptr) {
246         currentGeoPtr->UpdateByMatrixFromSelf();
247         auto matrix = currentGeoPtr->GetMatrix();
248         matrix.Set(Drawing::Matrix::TRANS_X, std::ceil(matrix.Get(Drawing::Matrix::TRANS_X)));
249         matrix.Set(Drawing::Matrix::TRANS_Y, std::ceil(matrix.Get(Drawing::Matrix::TRANS_Y)));
250         canvas.ConcatMatrix(matrix);
251     }
252 
253     // Clip by bounds
254     canvas.ClipRect(Drawing::Rect(0, 0, std::floor(properties.GetBoundsWidth()),
255         std::floor(properties.GetBoundsHeight())), Drawing::ClipOp::INTERSECT, false);
256 
257     // Extract srcDest and dstRect from Drawing::Canvas, localCLipBounds as SrcRect, deviceClipBounds as DstRect
258     auto deviceClipRect = canvas.GetDeviceClipBounds();
259     UpdateSrcRect(canvas, deviceClipRect);
260     RectI dstRect = {
261         deviceClipRect.GetLeft(), deviceClipRect.GetTop(), deviceClipRect.GetWidth(), deviceClipRect.GetHeight() };
262     SetDstRect(dstRect);
263 
264     // Save TotalMatrix and GlobalAlpha for compositor
265     SetTotalMatrix(canvas.GetTotalMatrix());
266     SetGlobalAlpha(canvas.GetAlpha());
267 }
268 
PrepareRenderAfterChildren(RSPaintFilterCanvas & canvas)269 void RSSurfaceRenderNode::PrepareRenderAfterChildren(RSPaintFilterCanvas& canvas)
270 {
271     canvas.RestoreStatus(renderNodeSaveCount_);
272 }
273 
CollectSurface(const std::shared_ptr<RSBaseRenderNode> & node,std::vector<RSBaseRenderNode::SharedPtr> & vec,bool isUniRender,bool onlyFirstLevel)274 void RSSurfaceRenderNode::CollectSurface(const std::shared_ptr<RSBaseRenderNode>& node,
275     std::vector<RSBaseRenderNode::SharedPtr>& vec, bool isUniRender, bool onlyFirstLevel)
276 {
277     if (IsScbScreen()) {
278         for (auto& child : *node->GetSortedChildren()) {
279             child->CollectSurface(child, vec, isUniRender, onlyFirstLevel);
280         }
281         return;
282     }
283     if (IsStartingWindow()) {
284         if (isUniRender) {
285             vec.emplace_back(shared_from_this());
286         }
287         return;
288     }
289     if (IsLeashWindow()) {
290         if (isUniRender) {
291             vec.emplace_back(shared_from_this());
292         }
293         if (onlyFirstLevel) {
294             return;
295         }
296         for (auto& child : *node->GetSortedChildren()) {
297             child->CollectSurface(child, vec, isUniRender, onlyFirstLevel);
298         }
299         return;
300     }
301 
302 #ifndef ROSEN_CROSS_PLATFORM
303     auto consumer = surfaceHandler_->GetConsumer();
304     if (consumer != nullptr && consumer->GetTunnelHandle() != nullptr) {
305         return;
306     }
307 #endif
308     auto num = find(vec.begin(), vec.end(), shared_from_this());
309     if (num != vec.end()) {
310         return;
311     }
312     if (isUniRender && ShouldPaint()) {
313         vec.emplace_back(shared_from_this());
314     } else {
315 #ifndef ROSEN_CROSS_PLATFORM
316         if (surfaceHandler_->GetBuffer() != nullptr && ShouldPaint()) {
317             vec.emplace_back(shared_from_this());
318         }
319 #endif
320     }
321 
322     if (isSubSurfaceEnabled_) {
323         if (onlyFirstLevel) {
324             return;
325         }
326         for (auto &nodes : node->GetSubSurfaceNodes()) {
327             for (auto &node : nodes.second) {
328                 auto surfaceNode = node.lock();
329                 if (surfaceNode != nullptr) {
330                     surfaceNode->CollectSurface(surfaceNode, vec, isUniRender, onlyFirstLevel);
331                 }
332             }
333         }
334     }
335 }
336 
CollectSurfaceForUIFirstSwitch(uint32_t & leashWindowCount,uint32_t minNodeNum)337 void RSSurfaceRenderNode::CollectSurfaceForUIFirstSwitch(uint32_t& leashWindowCount, uint32_t minNodeNum)
338 {
339     if (IsLeashWindow() || IsStartingWindow()) {
340         leashWindowCount++;
341     }
342     return;
343 }
344 
ClearChildrenCache()345 void RSSurfaceRenderNode::ClearChildrenCache()
346 {
347     for (auto& child : *GetChildren()) {
348         auto surfaceNode = child->ReinterpretCastTo<RSSurfaceRenderNode>();
349         if (surfaceNode == nullptr) {
350             continue;
351         }
352 #ifndef ROSEN_CROSS_PLATFORM
353         auto consumer = surfaceNode->GetRSSurfaceHandler()->GetConsumer();
354         if (consumer != nullptr) {
355             consumer->GoBackground();
356         }
357 #endif
358     }
359     // Temporary solution, GetChildren will generate fullChildrenList_, which will cause memory leak
360     OnTreeStateChanged();
361 }
362 
OnTreeStateChanged()363 void RSSurfaceRenderNode::OnTreeStateChanged()
364 {
365     NotifyTreeStateChange();
366     RSRenderNode::OnTreeStateChanged();
367 #if defined(RS_ENABLE_GL) || defined(RS_ENABLE_VK)
368     if (!IsOnTheTree()) {
369         if (auto context = GetContext().lock()) {
370             RS_TRACE_NAME_FMT("need purgeUnlockedResources this SurfaceNode isn't on the tree Id:%" PRIu64 " Name:%s",
371                 GetId(), GetName().c_str());
372             if (IsLeashWindow()) {
373                 context->MarkNeedPurge(ClearMemoryMoment::COMMON_SURFACE_NODE_HIDE, RSContext::PurgeType::GENTLY);
374             }
375             if (surfaceWindowType_ == SurfaceWindowType::SYSTEM_SCB_WINDOW) {
376                 context->MarkNeedPurge(ClearMemoryMoment::SCENEBOARD_SURFACE_NODE_HIDE, RSContext::PurgeType::STRONGLY);
377             }
378         }
379     }
380 #endif
381     if (IsAbilityComponent()) {
382         if (auto instanceRootNode = GetInstanceRootNode()) {
383             if (auto surfaceNode = instanceRootNode->ReinterpretCastTo<RSSurfaceRenderNode>()) {
384                 surfaceNode->UpdateAbilityNodeIds(GetId(), IsOnTheTree());
385             }
386         }
387     } else if (IsHardwareEnabledType() && RSUniRenderJudgement::IsUniRender()) {
388         if (auto instanceRootNode = GetInstanceRootNode()) {
389             if (auto surfaceNode = instanceRootNode->ReinterpretCastTo<RSSurfaceRenderNode>()) {
390                 surfaceNode->UpdateChildHardwareEnabledNode(GetId(), IsOnTheTree());
391             }
392         }
393     }
394     OnSubSurfaceChanged();
395 
396     // sync skip & security info
397     SyncSecurityInfoToFirstLevelNode();
398     SyncSkipInfoToFirstLevelNode();
399     SyncSnapshotSkipInfoToFirstLevelNode();
400     SyncProtectedInfoToFirstLevelNode();
401     SyncPrivacyContentInfoToFirstLevelNode();
402 }
403 
HasSubSurfaceNodes() const404 bool RSSurfaceRenderNode::HasSubSurfaceNodes() const
405 {
406     return childSubSurfaceNodes_.size() != 0;
407 }
408 
SetIsSubSurfaceNode(bool isSubSurfaceNode)409 void RSSurfaceRenderNode::SetIsSubSurfaceNode(bool isSubSurfaceNode)
410 {
411     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
412     if (surfaceParams) {
413         surfaceParams->SetIsSubSurfaceNode(isSubSurfaceNode);
414         isSubSurfaceNode_ = isSubSurfaceNode;
415         AddToPendingSyncList();
416     }
417 }
418 
IsSubSurfaceNode() const419 bool RSSurfaceRenderNode::IsSubSurfaceNode() const
420 {
421     return isSubSurfaceNode_;
422 }
423 
GetChildSubSurfaceNodes() const424 const std::map<NodeId, RSSurfaceRenderNode::WeakPtr>& RSSurfaceRenderNode::GetChildSubSurfaceNodes() const
425 {
426     return childSubSurfaceNodes_;
427 }
428 
OnSubSurfaceChanged()429 void RSSurfaceRenderNode::OnSubSurfaceChanged()
430 {
431     if (!IsMainWindowType() || !RSUniRenderJudgement::IsUniRender()) {
432         return;
433     }
434     auto parentNode = GetParent().lock();
435     if (!parentNode) {
436         return;
437     }
438     std::shared_ptr<RSSurfaceRenderNode> parentSurfaceNode = parentNode->ReinterpretCastTo<RSSurfaceRenderNode>();
439     if (!parentSurfaceNode || !parentSurfaceNode->IsMainWindowType()) {
440         if (auto instanceRootNode = parentNode->GetInstanceRootNode()) {
441             parentSurfaceNode = instanceRootNode->ReinterpretCastTo<RSSurfaceRenderNode>();
442         }
443     }
444     if (parentSurfaceNode && parentSurfaceNode->IsLeashOrMainWindow()) {
445         parentSurfaceNode->UpdateChildSubSurfaceNodes(ReinterpretCastTo<RSSurfaceRenderNode>(), IsOnTheTree());
446     }
447 }
448 
UpdateChildSubSurfaceNodes(RSSurfaceRenderNode::SharedPtr node,bool isOnTheTree)449 void RSSurfaceRenderNode::UpdateChildSubSurfaceNodes(RSSurfaceRenderNode::SharedPtr node, bool isOnTheTree)
450 {
451     if (isOnTheTree) {
452         childSubSurfaceNodes_[node->GetId()] = node;
453     } else {
454         childSubSurfaceNodes_.erase(node->GetId());
455     }
456     if (!IsLeashWindow()) {
457         node->SetIsSubSurfaceNode(isOnTheTree);
458     }
459 }
460 
GetAllSubSurfaceNodeIds() const461 std::unordered_set<NodeId> RSSurfaceRenderNode::GetAllSubSurfaceNodeIds() const
462 {
463     std::unordered_set<NodeId> allSubSurfaceNodeIds;
464     std::vector<std::pair<NodeId, RSSurfaceRenderNode::WeakPtr>> allSubSurfaceNodes;
465     GetAllSubSurfaceNodes(allSubSurfaceNodes);
466     for (auto& [id, _] : allSubSurfaceNodes) {
467         allSubSurfaceNodeIds.insert(id);
468     }
469     return allSubSurfaceNodeIds;
470 }
471 
GetAllSubSurfaceNodes(std::vector<std::pair<NodeId,RSSurfaceRenderNode::WeakPtr>> & allSubSurfaceNodes) const472 void RSSurfaceRenderNode::GetAllSubSurfaceNodes(
473     std::vector<std::pair<NodeId, RSSurfaceRenderNode::WeakPtr>>& allSubSurfaceNodes) const
474 {
475     for (auto& [id, node] : childSubSurfaceNodes_) {
476         auto subSubSurfaceNodePtr = node.lock();
477         if (!subSubSurfaceNodePtr) {
478             continue;
479         }
480         if (subSubSurfaceNodePtr->HasSubSurfaceNodes()) {
481             subSubSurfaceNodePtr->GetAllSubSurfaceNodes(allSubSurfaceNodes);
482         }
483         allSubSurfaceNodes.push_back({id, node});
484     }
485 }
486 
SubSurfaceNodesDump() const487 std::string RSSurfaceRenderNode::SubSurfaceNodesDump() const
488 {
489     std::string out;
490     out += ", subSurface";
491     for (auto [id, _] : childSubSurfaceNodes_) {
492         out += "[" + std::to_string(id) + "]";
493     }
494     return out;
495 }
496 
SetIsNodeToBeCaptured(bool isNodeToBeCaptured)497 void RSSurfaceRenderNode::SetIsNodeToBeCaptured(bool isNodeToBeCaptured)
498 {
499     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
500     if (surfaceParams) {
501         surfaceParams->SetIsNodeToBeCaptured(isNodeToBeCaptured);
502         isNodeToBeCaptured_ = isNodeToBeCaptured;
503         AddToPendingSyncList();
504     }
505 }
506 
IsNodeToBeCaptured() const507 bool RSSurfaceRenderNode::IsNodeToBeCaptured() const
508 {
509     return isNodeToBeCaptured_;
510 }
511 
OnResetParent()512 void RSSurfaceRenderNode::OnResetParent()
513 {
514     if (nodeType_ == RSSurfaceNodeType::LEASH_WINDOW_NODE) {
515         ClearChildrenCache();
516     } else {
517 #ifndef ROSEN_CROSS_PLATFORM
518         auto consumer = GetRSSurfaceHandler()->GetConsumer();
519         if (consumer != nullptr && !IsSelfDrawingType() && !IsAbilityComponent()) {
520             consumer->GoBackground();
521         }
522 #endif
523     }
524 }
525 
SetIsNotifyUIBufferAvailable(bool available)526 void RSSurfaceRenderNode::SetIsNotifyUIBufferAvailable(bool available)
527 {
528 #ifdef USE_SURFACE_TEXTURE
529     auto texture = GetSurfaceTexture();
530     if (texture) {
531         texture->MarkUiFrameAvailable(available);
532     }
533 #endif
534     isNotifyUIBufferAvailable_.store(available);
535 }
536 
QuickPrepare(const std::shared_ptr<RSNodeVisitor> & visitor)537 void RSSurfaceRenderNode::QuickPrepare(const std::shared_ptr<RSNodeVisitor>& visitor)
538 {
539     if (!visitor) {
540         return;
541     }
542     ApplyModifiers();
543     visitor->QuickPrepareSurfaceRenderNode(*this);
544 }
545 
IsUIBufferAvailable()546 bool RSSurfaceRenderNode::IsUIBufferAvailable()
547 {
548     return ((IsAppWindow() || IsScbScreen()) && !IsNotifyUIBufferAvailable() && IsFirstFrameReadyToDraw(*this));
549 }
550 
IsSubTreeNeedPrepare(bool filterInGlobal,bool isOccluded)551 bool RSSurfaceRenderNode::IsSubTreeNeedPrepare(bool filterInGlobal, bool isOccluded)
552 {
553     // force preparation case for occlusion
554     if (IsLeashWindow()) {
555         SetSubTreeDirty(false);
556         UpdateChildrenOutOfRectFlag(false); // collect again
557         return true;
558     }
559 
560     // force preparation case for update gravity when appWindow geoDirty
561     auto parentPtr = this->GetParent().lock();
562     auto surfaceParentPtr = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(parentPtr);
563     if (surfaceParentPtr != nullptr &&
564         surfaceParentPtr->GetSurfaceNodeType() == RSSurfaceNodeType::LEASH_WINDOW_NODE) {
565         if (this->GetRenderProperties().IsCurGeoDirty()) {
566             return true;
567         }
568     }
569 
570     return RSRenderNode::IsSubTreeNeedPrepare(filterInGlobal, isOccluded);
571 }
572 
Prepare(const std::shared_ptr<RSNodeVisitor> & visitor)573 void RSSurfaceRenderNode::Prepare(const std::shared_ptr<RSNodeVisitor>& visitor)
574 {
575     if (!visitor) {
576         return;
577     }
578     ApplyModifiers();
579     visitor->PrepareSurfaceRenderNode(*this);
580 }
581 
Process(const std::shared_ptr<RSNodeVisitor> & visitor)582 void RSSurfaceRenderNode::Process(const std::shared_ptr<RSNodeVisitor>& visitor)
583 {
584     if (!visitor) {
585         return;
586     }
587     RSRenderNode::RenderTraceDebug();
588     visitor->ProcessSurfaceRenderNode(*this);
589 }
590 
ProcessRenderBeforeChildren(RSPaintFilterCanvas & canvas)591 void RSSurfaceRenderNode::ProcessRenderBeforeChildren(RSPaintFilterCanvas& canvas)
592 {
593     needDrawAnimateProperty_ = true;
594     ProcessAnimatePropertyBeforeChildren(canvas, true);
595     needDrawAnimateProperty_ = false;
596 }
597 
ProcessAnimatePropertyBeforeChildren(RSPaintFilterCanvas & canvas,bool includeProperty)598 void RSSurfaceRenderNode::ProcessAnimatePropertyBeforeChildren(RSPaintFilterCanvas& canvas, bool includeProperty)
599 {
600     if (GetCacheType() != CacheType::ANIMATE_PROPERTY && !needDrawAnimateProperty_) {
601         return;
602     }
603 
604     const auto& property = GetRenderProperties();
605     const RectF absBounds = {0, 0, property.GetBoundsWidth(), property.GetBoundsHeight()};
606     RRect absClipRRect = RRect(absBounds, property.GetCornerRadius());
607     RSPropertiesPainter::DrawShadow(property, canvas, &absClipRRect);
608     RSPropertiesPainter::DrawOutline(property, canvas);
609 
610     if (!property.GetCornerRadius().IsZero()) {
611         canvas.ClipRoundRect(
612             RSPropertiesPainter::RRect2DrawingRRect(absClipRRect), Drawing::ClipOp::INTERSECT, true);
613     } else {
614         canvas.ClipRect(Drawing::Rect(0, 0, property.GetBoundsWidth(), property.GetBoundsHeight()),
615             Drawing::ClipOp::INTERSECT, false);
616     }
617 
618 #ifndef ROSEN_CROSS_PLATFORM
619     RSPropertiesPainter::DrawBackground(
620         property, canvas, true, IsSelfDrawingNode() && (surfaceHandler_->GetBuffer() != nullptr));
621 #else
622     RSPropertiesPainter::DrawBackground(property, canvas);
623 #endif
624     RSPropertiesPainter::DrawMask(property, canvas);
625     RSPropertiesPainter::DrawFilter(property, canvas, FilterType::BACKGROUND_FILTER);
626     SetTotalMatrix(canvas.GetTotalMatrix());
627 }
628 
ProcessRenderAfterChildren(RSPaintFilterCanvas & canvas)629 void RSSurfaceRenderNode::ProcessRenderAfterChildren(RSPaintFilterCanvas& canvas)
630 {
631     needDrawAnimateProperty_ = true;
632     ProcessAnimatePropertyAfterChildren(canvas);
633     needDrawAnimateProperty_ = false;
634 }
635 
ProcessAnimatePropertyAfterChildren(RSPaintFilterCanvas & canvas)636 void RSSurfaceRenderNode::ProcessAnimatePropertyAfterChildren(RSPaintFilterCanvas& canvas)
637 {
638     if (GetCacheType() != CacheType::ANIMATE_PROPERTY && !needDrawAnimateProperty_) {
639         return;
640     }
641     const auto& property = GetRenderProperties();
642     RSPropertiesPainter::DrawFilter(property, canvas, FilterType::FOREGROUND_FILTER);
643     canvas.Save();
644     if (GetSurfaceNodeType() == RSSurfaceNodeType::SELF_DRAWING_NODE) {
645         auto& geoPtr = (property.GetBoundsGeometry());
646         canvas.ConcatMatrix(geoPtr->GetMatrix());
647     }
648     RSPropertiesPainter::DrawOutline(property, canvas);
649     RSPropertiesPainter::DrawBorder(property, canvas);
650     canvas.Restore();
651 }
652 
SetContextBounds(const Vector4f bounds)653 void RSSurfaceRenderNode::SetContextBounds(const Vector4f bounds)
654 {
655     std::unique_ptr<RSCommand> command = std::make_unique<RSSurfaceNodeSetBounds>(GetId(), bounds);
656     SendCommandFromRT(command, GetId());
657 }
658 
GetDirtyManager() const659 const std::shared_ptr<RSDirtyRegionManager>& RSSurfaceRenderNode::GetDirtyManager() const
660 {
661     return dirtyManager_;
662 }
663 
GetCacheSurfaceDirtyManager() const664 std::shared_ptr<RSDirtyRegionManager> RSSurfaceRenderNode::GetCacheSurfaceDirtyManager() const
665 {
666     return cacheSurfaceDirtyManager_;
667 }
668 
SetSurfaceNodeType(RSSurfaceNodeType nodeType)669 void RSSurfaceRenderNode::SetSurfaceNodeType(RSSurfaceNodeType nodeType)
670 {
671     if (nodeType_ == RSSurfaceNodeType::ABILITY_COMPONENT_NODE ||
672         nodeType_ == RSSurfaceNodeType::UI_EXTENSION_COMMON_NODE ||
673         nodeType_ == RSSurfaceNodeType::UI_EXTENSION_SECURE_NODE) {
674         return;
675     }
676     if (nodeType == RSSurfaceNodeType::UI_EXTENSION_COMMON_NODE ||
677         nodeType == RSSurfaceNodeType::UI_EXTENSION_SECURE_NODE) {
678         RS_LOGE("RSSurfaceRenderNode::SetSurfaceNodeType prohibition of converting surfaceNodeType to uiExtension");
679         return;
680     }
681     nodeType_ = nodeType;
682 }
683 
MarkUIHidden(bool isHidden)684 void RSSurfaceRenderNode::MarkUIHidden(bool isHidden)
685 {
686     isUIHidden_ = isHidden;
687 }
688 
IsUIHidden() const689 bool RSSurfaceRenderNode::IsUIHidden() const
690 {
691     return isUIHidden_;
692 }
693 
IsLeashWindowSurfaceNodeVisible()694 bool RSSurfaceRenderNode::IsLeashWindowSurfaceNodeVisible()
695 {
696     if (!IsLeashWindow()) {
697         return false;
698     }
699     auto nestedSurfaces = GetLeashWindowNestedSurfaces();
700     return std::any_of(nestedSurfaces.begin(), nestedSurfaces.end(),
701         [](const auto& node) -> bool {
702             return node && !node->IsUIHidden();
703         });
704 }
705 
SetContextMatrix(const std::optional<Drawing::Matrix> & matrix,bool sendMsg)706 void RSSurfaceRenderNode::SetContextMatrix(const std::optional<Drawing::Matrix>& matrix, bool sendMsg)
707 {
708     if (contextMatrix_ == matrix) {
709         return;
710     }
711     contextMatrix_ = matrix;
712     SetContentDirty();
713     AddDirtyType(RSModifierType::SCALE);
714     AddDirtyType(RSModifierType::SKEW);
715     AddDirtyType(RSModifierType::PERSP);
716     AddDirtyType(RSModifierType::TRANSLATE);
717     if (!sendMsg) {
718         return;
719     }
720     // send a Command
721     std::unique_ptr<RSCommand> command = std::make_unique<RSSurfaceNodeSetContextMatrix>(GetId(), matrix);
722     SendCommandFromRT(command, GetId());
723 }
724 
SetContextAlpha(float alpha,bool sendMsg)725 void RSSurfaceRenderNode::SetContextAlpha(float alpha, bool sendMsg)
726 {
727     if (contextAlpha_ == alpha) {
728         return;
729     }
730     contextAlpha_ = alpha;
731     SetContentDirty();
732     AddDirtyType(RSModifierType::ALPHA);
733     if (!sendMsg) {
734         return;
735     }
736     // send a Command
737     std::unique_ptr<RSCommand> command = std::make_unique<RSSurfaceNodeSetContextAlpha>(GetId(), alpha);
738     SendCommandFromRT(command, GetId());
739 }
740 
SetContextClipRegion(const std::optional<Drawing::Rect> & clipRegion,bool sendMsg)741 void RSSurfaceRenderNode::SetContextClipRegion(const std::optional<Drawing::Rect>& clipRegion, bool sendMsg)
742 {
743     if (contextClipRect_ == clipRegion) {
744         return;
745     }
746     contextClipRect_ = clipRegion;
747     SetContentDirty();
748     AddDirtyType(RSModifierType::BOUNDS);
749     if (!sendMsg) {
750         return;
751     }
752     // send a Command
753     std::unique_ptr<RSCommand> command = std::make_unique<RSSurfaceNodeSetContextClipRegion>(GetId(), clipRegion);
754     SendCommandFromRT(command, GetId());
755 }
SetBootAnimation(bool isBootAnimation)756 void RSSurfaceRenderNode::SetBootAnimation(bool isBootAnimation)
757 {
758     ROSEN_LOGD("SetBootAnimation:: id:%{public}" PRIu64 ", isBootAnimation:%{public}d",
759         GetId(), isBootAnimation);
760     isBootAnimation_ = isBootAnimation;
761 }
762 
GetBootAnimation() const763 bool RSSurfaceRenderNode::GetBootAnimation() const
764 {
765     return isBootAnimation_;
766 }
767 
SetForceHardwareAndFixRotation(bool flag)768 void RSSurfaceRenderNode::SetForceHardwareAndFixRotation(bool flag)
769 {
770     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
771     if (surfaceParams == nullptr) {
772         return;
773     }
774     surfaceParams->SetFixRotationByUser(flag);
775     AddToPendingSyncList();
776 
777     isFixRotationByUser_ = flag;
778 }
779 
GetFixRotationByUser() const780 bool RSSurfaceRenderNode::GetFixRotationByUser() const
781 {
782     return isFixRotationByUser_;
783 }
784 
IsInFixedRotation() const785 bool RSSurfaceRenderNode::IsInFixedRotation() const
786 {
787     return isInFixedRotation_;
788 }
789 
SetInFixedRotation(bool isRotating)790 void RSSurfaceRenderNode::SetInFixedRotation(bool isRotating)
791 {
792     if (isFixRotationByUser_ && !isInFixedRotation_ && isRotating) {
793 #ifndef ROSEN_CROSS_PLATFORM
794         auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
795         if (surfaceParams) {
796             auto layer = surfaceParams->GetLayerInfo();
797             originalSrcRect_ = { layer.srcRect.x, layer.srcRect.y, layer.srcRect.w, layer.srcRect.h };
798             originalDstRect_ = { layer.dstRect.x, layer.dstRect.y, layer.dstRect.w, layer.dstRect.h };
799         }
800 #endif
801     }
802     isInFixedRotation_ = isFixRotationByUser_ && isRotating;
803 }
804 
SetHidePrivacyContent(bool needHidePrivacyContent)805 void RSSurfaceRenderNode::SetHidePrivacyContent(bool needHidePrivacyContent)
806 {
807     if (needHidePrivacyContent_ == needHidePrivacyContent) {
808         return;
809     }
810     needHidePrivacyContent_ = needHidePrivacyContent;
811     SetDirty();
812     if (needHidePrivacyContent) {
813         privacyContentLayerIds_.insert(GetId());
814     } else {
815         privacyContentLayerIds_.erase(GetId());
816     }
817     ROSEN_LOGI("RSSurfaceRenderNode::SetHidePrivacyContent, Node id: %{public}" PRIu64 ", privacyContent:%{public}d",
818         GetId(), needHidePrivacyContent);
819     SyncPrivacyContentInfoToFirstLevelNode();
820 }
821 
SetSecurityLayer(bool isSecurityLayer)822 void RSSurfaceRenderNode::SetSecurityLayer(bool isSecurityLayer)
823 {
824     if (isSecurityLayer_ == isSecurityLayer) {
825         return;
826     }
827     specialLayerChanged_ = true;
828     isSecurityLayer_ = isSecurityLayer;
829     SetDirty();
830     if (isSecurityLayer) {
831         securityLayerIds_.insert(GetId());
832     } else {
833         securityLayerIds_.erase(GetId());
834     }
835     SyncSecurityInfoToFirstLevelNode();
836 }
837 
SetLeashPersistentId(NodeId leashPersistentId)838 void RSSurfaceRenderNode::SetLeashPersistentId(NodeId leashPersistentId)
839 {
840     if (leashPersistentId_ == leashPersistentId) {
841         return;
842     }
843 
844     leashPersistentId_ = leashPersistentId;
845     SetDirty();
846 
847     ROSEN_LOGD("RSSurfaceRenderNode::SetLeashPersistentId, Node id: %{public}" PRIu64 ", leashPersistentId:%{public}"
848         "" PRIu64, GetId(), leashPersistentId);
849 }
850 
SetSkipLayer(bool isSkipLayer)851 void RSSurfaceRenderNode::SetSkipLayer(bool isSkipLayer)
852 {
853     if (isSkipLayer_ == isSkipLayer) {
854         return;
855     }
856     specialLayerChanged_ = true;
857     isSkipLayer_ = isSkipLayer;
858     SetDirty();
859     if (isSkipLayer) {
860         skipLayerIds_.insert(GetId());
861     } else {
862         skipLayerIds_.erase(GetId());
863     }
864     SyncSkipInfoToFirstLevelNode();
865 }
866 
SetSnapshotSkipLayer(bool isSnapshotSkipLayer)867 void RSSurfaceRenderNode::SetSnapshotSkipLayer(bool isSnapshotSkipLayer)
868 {
869     if (isSnapshotSkipLayer_ == isSnapshotSkipLayer) {
870         return;
871     }
872     specialLayerChanged_ = true;
873     isSnapshotSkipLayer_ = isSnapshotSkipLayer;
874     SetDirty();
875     if (isSnapshotSkipLayer) {
876         snapshotSkipLayerIds_.insert(GetId());
877     } else {
878         snapshotSkipLayerIds_.erase(GetId());
879     }
880     SyncOnTheTreeInfoToFirstLevelNode();
881 }
882 
GetLeashPersistentId() const883 LeashPersistentId RSSurfaceRenderNode::GetLeashPersistentId() const
884 {
885     return leashPersistentId_;
886 }
887 
SetProtectedLayer(bool isProtectedLayer)888 void RSSurfaceRenderNode::SetProtectedLayer(bool isProtectedLayer)
889 {
890     if (isProtectedLayer_ == isProtectedLayer) {
891         return;
892     }
893     specialLayerChanged_ = true;
894     isProtectedLayer_ = isProtectedLayer;
895     SetDirty();
896     if (isProtectedLayer) {
897         protectedLayerIds_.insert(GetId());
898     } else {
899         protectedLayerIds_.erase(GetId());
900     }
901     SyncProtectedInfoToFirstLevelNode();
902 }
903 
GetSecurityLayer() const904 bool RSSurfaceRenderNode::GetSecurityLayer() const
905 {
906     return isSecurityLayer_;
907 }
908 
909 
GetSkipLayer() const910 bool RSSurfaceRenderNode::GetSkipLayer() const
911 {
912     return isSkipLayer_;
913 }
914 
GetSnapshotSkipLayer() const915 bool RSSurfaceRenderNode::GetSnapshotSkipLayer() const
916 {
917     return isSnapshotSkipLayer_;
918 }
919 
GetProtectedLayer() const920 bool RSSurfaceRenderNode::GetProtectedLayer() const
921 {
922     return isProtectedLayer_;
923 }
924 
GetHasSecurityLayer() const925 bool RSSurfaceRenderNode::GetHasSecurityLayer() const
926 {
927     return securityLayerIds_.size() != 0;
928 }
929 
GetHasSkipLayer() const930 bool RSSurfaceRenderNode::GetHasSkipLayer() const
931 {
932     return skipLayerIds_.size() != 0;
933 }
934 
GetHasSnapshotSkipLayer() const935 bool RSSurfaceRenderNode::GetHasSnapshotSkipLayer() const
936 {
937     return !snapshotSkipLayerIds_.empty();
938 }
939 
GetHasProtectedLayer() const940 bool RSSurfaceRenderNode::GetHasProtectedLayer() const
941 {
942     return protectedLayerIds_.size() != 0;
943 }
944 
GetHasPrivacyContentLayer() const945 bool RSSurfaceRenderNode::GetHasPrivacyContentLayer() const
946 {
947     return privacyContentLayerIds_.size() != 0;
948 }
949 
SyncSecurityInfoToFirstLevelNode()950 void RSSurfaceRenderNode::SyncSecurityInfoToFirstLevelNode()
951 {
952     auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
953     // firstLevelNode is the nearest app window / leash node
954     if (firstLevelNode && GetFirstLevelNodeId() != GetId()) {
955         if (isSecurityLayer_ && IsOnTheTree()) {
956             firstLevelNode->securityLayerIds_.insert(GetId());
957         } else {
958             firstLevelNode->securityLayerIds_.erase(GetId());
959         }
960         firstLevelNode->specialLayerChanged_ = specialLayerChanged_;
961     }
962 }
963 
SyncSkipInfoToFirstLevelNode()964 void RSSurfaceRenderNode::SyncSkipInfoToFirstLevelNode()
965 {
966     auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
967     // firstLevelNode is the nearest app window / leash node
968     if (firstLevelNode && GetFirstLevelNodeId() != GetId()) {
969         if (isSkipLayer_ && IsOnTheTree()) {
970             firstLevelNode->skipLayerIds_.insert(GetId());
971         } else {
972             firstLevelNode->skipLayerIds_.erase(GetId());
973         }
974         firstLevelNode->specialLayerChanged_ = specialLayerChanged_;
975     }
976 }
977 
SyncOnTheTreeInfoToFirstLevelNode()978 void RSSurfaceRenderNode::SyncOnTheTreeInfoToFirstLevelNode()
979 {
980     if (!IsOnTheTree() || GetFirstLevelNodeId() == GetId()) {
981         return;
982     }
983     auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
984     // firstLevelNode is the nearest app window / leash node
985     if (firstLevelNode) {
986         if (isSnapshotSkipLayer_) {
987             firstLevelNode->snapshotSkipLayerIds_.insert(GetId());
988         } else {
989             firstLevelNode->snapshotSkipLayerIds_.erase(GetId());
990         }
991         firstLevelNode->specialLayerChanged_ = specialLayerChanged_;
992     }
993 }
994 
SyncSnapshotSkipInfoToFirstLevelNode()995 void RSSurfaceRenderNode::SyncSnapshotSkipInfoToFirstLevelNode()
996 {
997     if (isSnapshotSkipLayer_ == false || GetFirstLevelNodeId() == GetId()) {
998         return;
999     }
1000     auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
1001     // firstLevelNode is the nearest app window / leash node
1002     if (firstLevelNode) {
1003         if (IsOnTheTree()) {
1004             firstLevelNode->snapshotSkipLayerIds_.insert(GetId());
1005         } else {
1006             firstLevelNode->snapshotSkipLayerIds_.erase(GetId());
1007         }
1008         firstLevelNode->specialLayerChanged_ = specialLayerChanged_;
1009     }
1010 }
1011 
SyncProtectedInfoToFirstLevelNode()1012 void RSSurfaceRenderNode::SyncProtectedInfoToFirstLevelNode()
1013 {
1014     if (isProtectedLayer_) {
1015         auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
1016         // firstLevelNode is the nearest app window / leash node
1017         if (firstLevelNode && GetFirstLevelNodeId() != GetId()) {
1018             firstLevelNode->SetDirty();
1019             // should always sync protectedLayerIds_ to firstLevelNode
1020             if (isProtectedLayer_ && IsOnTheTree()) {
1021                 firstLevelNode->protectedLayerIds_.insert(GetId());
1022             } else {
1023                 firstLevelNode->protectedLayerIds_.erase(GetId());
1024             }
1025             firstLevelNode->specialLayerChanged_ = specialLayerChanged_;
1026         }
1027     }
1028 }
1029 
SyncPrivacyContentInfoToFirstLevelNode()1030 void RSSurfaceRenderNode::SyncPrivacyContentInfoToFirstLevelNode()
1031 {
1032     auto firstLevelNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetFirstLevelNode());
1033     // firstLevelNode is the nearest app window / leash node
1034     if (firstLevelNode && GetFirstLevelNodeId() != GetId()) {
1035         if (needHidePrivacyContent_ && IsOnTheTree()) {
1036             firstLevelNode->privacyContentLayerIds_.insert(GetId());
1037         } else {
1038             firstLevelNode->privacyContentLayerIds_.erase(GetId());
1039         }
1040     }
1041 }
1042 
SetFingerprint(bool hasFingerprint)1043 void RSSurfaceRenderNode::SetFingerprint(bool hasFingerprint)
1044 {
1045     hasFingerprint_ = hasFingerprint;
1046 }
1047 
GetFingerprint() const1048 bool RSSurfaceRenderNode::GetFingerprint() const
1049 {
1050     return hasFingerprint_;
1051 }
1052 
SetForceUIFirst(bool forceUIFirst)1053 void RSSurfaceRenderNode::SetForceUIFirst(bool forceUIFirst)
1054 {
1055     if (forceUIFirst) {
1056         forceUIFirstChanged_ = true;
1057     }
1058     forceUIFirst_ = forceUIFirst;
1059 }
GetForceUIFirst() const1060 bool RSSurfaceRenderNode::GetForceUIFirst() const
1061 {
1062     return forceUIFirst_;
1063 }
1064 
SetHDRPresent(bool hasHdrPresent)1065 void RSSurfaceRenderNode::SetHDRPresent(bool hasHdrPresent)
1066 {
1067     hasHdrPresent_ = hasHdrPresent;
1068 }
1069 
GetHDRPresent() const1070 bool RSSurfaceRenderNode::GetHDRPresent() const
1071 {
1072     return hdrNum_ > 0;
1073 }
1074 
IncreaseHDRNum()1075 void RSSurfaceRenderNode::IncreaseHDRNum()
1076 {
1077     std::lock_guard<std::mutex> lockGuard(mutexHDR_);
1078     hdrNum_++;
1079     RS_LOGD("RSSurfaceRenderNode::IncreaseHDRNum HDRClient hdrNum_: %{public}d", hdrNum_);
1080 }
1081 
ReduceHDRNum()1082 void RSSurfaceRenderNode::ReduceHDRNum()
1083 {
1084     std::lock_guard<std::mutex> lockGuard(mutexHDR_);
1085     if (hdrNum_ == 0) {
1086         ROSEN_LOGE("RSSurfaceRenderNode::ReduceHDRNum error");
1087         return;
1088     }
1089     hdrNum_--;
1090     RS_LOGD("RSSurfaceRenderNode::ReduceHDRNum HDRClient hdrNum_: %{public}d", hdrNum_);
1091 }
1092 
SetForceUIFirstChanged(bool forceUIFirstChanged)1093 void RSSurfaceRenderNode::SetForceUIFirstChanged(bool forceUIFirstChanged)
1094 {
1095     forceUIFirstChanged_ = forceUIFirstChanged;
1096 }
GetForceUIFirstChanged()1097 bool RSSurfaceRenderNode::GetForceUIFirstChanged()
1098 {
1099     return forceUIFirstChanged_;
1100 }
1101 
SetAncoForceDoDirect(bool direct)1102 void RSSurfaceRenderNode::SetAncoForceDoDirect(bool direct)
1103 {
1104     ancoForceDoDirect_.store(direct);
1105 }
1106 
GetAncoForceDoDirect() const1107 bool RSSurfaceRenderNode::GetAncoForceDoDirect() const
1108 {
1109     return (ancoForceDoDirect_.load() && (GetAncoFlags() & static_cast<uint32_t>(AncoFlags::IS_ANCO_NODE)));
1110 }
1111 
SetAncoFlags(uint32_t flags)1112 void RSSurfaceRenderNode::SetAncoFlags(uint32_t flags)
1113 {
1114     ancoFlags_.store(flags);
1115 }
1116 
GetAncoFlags() const1117 uint32_t RSSurfaceRenderNode::GetAncoFlags() const
1118 {
1119     return ancoFlags_.load();
1120 }
1121 
RegisterTreeStateChangeCallback(TreeStateChangeCallback callback)1122 void RSSurfaceRenderNode::RegisterTreeStateChangeCallback(TreeStateChangeCallback callback)
1123 {
1124     treeStateChangeCallback_ = callback;
1125 }
1126 
NotifyTreeStateChange()1127 void RSSurfaceRenderNode::NotifyTreeStateChange()
1128 {
1129     if (treeStateChangeCallback_) {
1130         treeStateChangeCallback_(*this);
1131     }
1132 }
1133 
SetLayerTop(bool isTop)1134 void RSSurfaceRenderNode::SetLayerTop(bool isTop)
1135 {
1136     isLayerTop_ = isTop;
1137     SetContentDirty();
1138     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1139     if (surfaceParams == nullptr) {
1140         return;
1141     }
1142     surfaceParams->SetLayerTop(isTop);
1143     AddToPendingSyncList();
1144 }
1145 
SetColorSpace(GraphicColorGamut colorSpace)1146 void RSSurfaceRenderNode::SetColorSpace(GraphicColorGamut colorSpace)
1147 {
1148     colorSpace_ = colorSpace;
1149 }
1150 
GetColorSpace() const1151 GraphicColorGamut RSSurfaceRenderNode::GetColorSpace() const
1152 {
1153     return colorSpace_;
1154 }
1155 
UpdateColorSpaceWithMetadata()1156 void RSSurfaceRenderNode::UpdateColorSpaceWithMetadata()
1157 {
1158 #ifndef ROSEN_CROSS_PLATFORM
1159     if (!GetRSSurfaceHandler() || !GetRSSurfaceHandler()->GetBuffer()) {
1160         RS_LOGD("RSSurfaceRenderNode::UpdateColorSpaceWithMetadata node(%{public}s) did not have buffer.",
1161             GetName().c_str());
1162         return;
1163     }
1164     const sptr<SurfaceBuffer>& buffer = GetRSSurfaceHandler()->GetBuffer();
1165     using namespace HDI::Display::Graphic::Common::V1_0;
1166     CM_ColorSpaceInfo colorSpaceInfo;
1167     if (MetadataHelper::GetColorSpaceInfo(buffer, colorSpaceInfo) != GSERROR_OK) {
1168         RS_LOGD("RSSurfaceRenderNode::UpdateColorSpaceWithMetadata get color space info failed.");
1169         return;
1170     }
1171     // currently, P3 is the only supported wide color gamut, this may be modified later.
1172     colorSpace_ = colorSpaceInfo.primaries != COLORPRIMARIES_SRGB ?
1173         GRAPHIC_COLOR_GAMUT_DISPLAY_P3 : GRAPHIC_COLOR_GAMUT_SRGB;
1174 #endif
1175 }
1176 
UpdateSurfaceDefaultSize(float width,float height)1177 void RSSurfaceRenderNode::UpdateSurfaceDefaultSize(float width, float height)
1178 {
1179 #ifndef ROSEN_CROSS_PLATFORM
1180     if (!surfaceHandler_) {
1181         return;
1182     }
1183     auto consumer = surfaceHandler_->GetConsumer();
1184     if (!consumer) {
1185         return;
1186     }
1187     consumer->SetDefaultWidthAndHeight(width, height);
1188 #else
1189 #ifdef USE_SURFACE_TEXTURE
1190     auto texture = GetSurfaceTexture();
1191     if (texture) {
1192         texture->UpdateSurfaceDefaultSize(width, height);
1193     }
1194 #endif
1195 #endif
1196 }
1197 
1198 #ifndef ROSEN_CROSS_PLATFORM
UpdateBufferInfo(const sptr<SurfaceBuffer> & buffer,const Rect & damageRect,const sptr<SyncFence> & acquireFence,const sptr<SurfaceBuffer> & preBuffer)1199 void RSSurfaceRenderNode::UpdateBufferInfo(const sptr<SurfaceBuffer>& buffer, const Rect& damageRect,
1200     const sptr<SyncFence>& acquireFence, const sptr<SurfaceBuffer>& preBuffer)
1201 {
1202     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1203     if (!surfaceParams->IsBufferSynced()) {
1204         auto curBuffer = surfaceParams->GetBuffer();
1205         auto consumer = GetRSSurfaceHandler()->GetConsumer();
1206         if (curBuffer && consumer) {
1207             auto fence = surfaceParams->GetAcquireFence();
1208             consumer->ReleaseBuffer(curBuffer, fence);
1209         }
1210     } else {
1211         surfaceParams->SetPreBuffer(preBuffer);
1212     }
1213 
1214     surfaceParams->SetBuffer(buffer, damageRect);
1215     surfaceParams->SetAcquireFence(acquireFence);
1216     surfaceParams->SetBufferSynced(false);
1217     AddToPendingSyncList();
1218 }
1219 
NeedClearBufferCache()1220 void RSSurfaceRenderNode::NeedClearBufferCache()
1221 {
1222     if (!surfaceHandler_) {
1223         return;
1224     }
1225 
1226     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1227     std::set<int32_t> bufferCacheSet;
1228     if (auto buffer = surfaceHandler_->GetBuffer()) {
1229         bufferCacheSet.insert(buffer->GetSeqNum());
1230     }
1231     if (auto preBuffer = surfaceHandler_->GetPreBuffer()) {
1232         bufferCacheSet.insert(preBuffer->GetSeqNum());
1233     }
1234     surfaceParams->SetBufferClearCacheSet(bufferCacheSet);
1235     AddToPendingSyncList();
1236 }
1237 
NeedClearPreBuffer()1238 void RSSurfaceRenderNode::NeedClearPreBuffer()
1239 {
1240     if (!surfaceHandler_) {
1241         return;
1242     }
1243     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1244     if (surfaceParams == nullptr) {
1245         return;
1246     }
1247     std::set<int32_t> bufferCacheSet;
1248     if (auto preBuffer = surfaceHandler_->GetPreBuffer()) {
1249         bufferCacheSet.insert(preBuffer->GetSeqNum());
1250     }
1251     surfaceParams->SetBufferClearCacheSet(bufferCacheSet);
1252     surfaceParams->SetPreBuffer(nullptr);
1253     AddToPendingSyncList();
1254 }
1255 #endif
1256 
1257 #ifndef ROSEN_CROSS_PLATFORM
GetBlendType()1258 GraphicBlendType RSSurfaceRenderNode::GetBlendType()
1259 {
1260     return blendType_;
1261 }
1262 
SetBlendType(GraphicBlendType blendType)1263 void RSSurfaceRenderNode::SetBlendType(GraphicBlendType blendType)
1264 {
1265     blendType_ = blendType;
1266 }
1267 #endif
1268 
RegisterBufferAvailableListener(sptr<RSIBufferAvailableCallback> callback,bool isFromRenderThread)1269 void RSSurfaceRenderNode::RegisterBufferAvailableListener(
1270     sptr<RSIBufferAvailableCallback> callback, bool isFromRenderThread)
1271 {
1272     if (isFromRenderThread) {
1273         std::lock_guard<std::mutex> lock(mutexRT_);
1274         callbackFromRT_ = callback;
1275     } else {
1276         {
1277             std::lock_guard<std::mutex> lock(mutexUI_);
1278             callbackFromUI_ = callback;
1279         }
1280         isNotifyUIBufferAvailable_ = false;
1281     }
1282 }
1283 
RegisterBufferClearListener(sptr<RSIBufferClearCallback> callback)1284 void RSSurfaceRenderNode::RegisterBufferClearListener(
1285     sptr<RSIBufferClearCallback> callback)
1286 {
1287     std::lock_guard<std::mutex> lock(mutexClear_);
1288     clearBufferCallback_ = callback;
1289 }
1290 
SetNotifyRTBufferAvailable(bool isNotifyRTBufferAvailable)1291 void RSSurfaceRenderNode::SetNotifyRTBufferAvailable(bool isNotifyRTBufferAvailable)
1292 {
1293     isNotifyRTBufferAvailable_ = isNotifyRTBufferAvailable;
1294     if (GetIsTextureExportNode()) {
1295         SetContentDirty();
1296     }
1297     std::lock_guard<std::mutex> lock(mutexClear_);
1298     if (clearBufferCallback_) {
1299         clearBufferCallback_->OnBufferClear();
1300     }
1301 }
1302 
ConnectToNodeInRenderService()1303 void RSSurfaceRenderNode::ConnectToNodeInRenderService()
1304 {
1305     ROSEN_LOGI("RSSurfaceRenderNode::ConnectToNodeInRenderService nodeId = %{public}" PRIu64, GetId());
1306     auto renderServiceClient =
1307         std::static_pointer_cast<RSRenderServiceClient>(RSIRenderClient::CreateRenderServiceClient());
1308     if (renderServiceClient != nullptr) {
1309         renderServiceClient->RegisterBufferAvailableListener(
1310             GetId(), [weakThis = weak_from_this()]() {
1311                 auto node = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(weakThis.lock());
1312                 if (node == nullptr) {
1313                     return;
1314                 }
1315                 node->NotifyRTBufferAvailable(node->GetIsTextureExportNode());
1316             }, true);
1317         renderServiceClient->RegisterBufferClearListener(
1318             GetId(), [weakThis = weak_from_this()]() {
1319                 auto node = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(weakThis.lock());
1320                 if (node == nullptr) {
1321                     return;
1322                 }
1323                 node->SetNotifyRTBufferAvailable(false);
1324             });
1325     }
1326 }
1327 
NotifyRTBufferAvailable(bool isTextureExportNode)1328 void RSSurfaceRenderNode::NotifyRTBufferAvailable(bool isTextureExportNode)
1329 {
1330     // In RS, "isNotifyRTBufferAvailable_ = true" means buffer is ready and need to trigger ipc callback.
1331     // In RT, "isNotifyRTBufferAvailable_ = true" means RT know that RS have had available buffer
1332     // and ready to trigger "callbackForRenderThreadRefresh_" to "clip" on parent surface.
1333     if (!isTextureExportNode) {
1334         isNotifyRTBufferAvailablePre_ = isNotifyRTBufferAvailable_;
1335         if (isNotifyRTBufferAvailable_) {
1336             return;
1337         }
1338         isNotifyRTBufferAvailable_ = true;
1339     }
1340 
1341     if (isRefresh_) {
1342         ROSEN_LOGD("RSSurfaceRenderNode::NotifyRTBufferAvailable nodeId = %{public}" PRIu64 " RenderThread", GetId());
1343         RSRTRefreshCallback::Instance().ExecuteRefresh();
1344     }
1345     if (isTextureExportNode) {
1346         SetContentDirty();
1347     }
1348 
1349     {
1350         std::lock_guard<std::mutex> lock(mutexRT_);
1351         if (callbackFromRT_) {
1352             ROSEN_LOGD("RSSurfaceRenderNode::NotifyRTBufferAvailable nodeId = %{public}" PRIu64 " RenderService",
1353                 GetId());
1354             callbackFromRT_->OnBufferAvailable();
1355         }
1356         if (!isRefresh_ && !callbackFromRT_) {
1357             isNotifyRTBufferAvailable_ = false;
1358         }
1359     }
1360 }
1361 
NotifyUIBufferAvailable()1362 void RSSurfaceRenderNode::NotifyUIBufferAvailable()
1363 {
1364     RS_TRACE_NAME_FMT("RSSurfaceRenderNode::NotifyUIBufferAvailable id:%llu bufferAvailable:%d waitUifirst:%d",
1365         GetId(), IsNotifyUIBufferAvailable(), IsWaitUifirstFirstFrame());
1366     if (isNotifyUIBufferAvailable_ || isWaitUifirstFirstFrame_) {
1367         return;
1368     }
1369     isNotifyUIBufferAvailable_ = true;
1370     {
1371         std::lock_guard<std::mutex> lock(mutexUI_);
1372         if (callbackFromUI_) {
1373             RS_TRACE_NAME_FMT("NotifyUIBufferAvailable done. id:%llu", GetId());
1374             ROSEN_LOGI("RSSurfaceRenderNode::NotifyUIBufferAvailable nodeId = %{public}" PRIu64, GetId());
1375             callbackFromUI_->OnBufferAvailable();
1376 #ifdef OHOS_PLATFORM
1377             if (IsAppWindow()) {
1378                 RSJankStats::GetInstance().SetAppFirstFrame(ExtractPid(GetId()));
1379             }
1380 #endif
1381         }
1382     }
1383 }
1384 
IsNotifyRTBufferAvailable() const1385 bool RSSurfaceRenderNode::IsNotifyRTBufferAvailable() const
1386 {
1387 #if defined(ROSEN_ANDROID) || defined(ROSEN_IOS)
1388     return true;
1389 #else
1390     return isNotifyRTBufferAvailable_;
1391 #endif
1392 }
1393 
IsNotifyRTBufferAvailablePre() const1394 bool RSSurfaceRenderNode::IsNotifyRTBufferAvailablePre() const
1395 {
1396 #if defined(ROSEN_ANDROID) || defined(ROSEN_IOS)
1397     return true;
1398 #else
1399     return isNotifyRTBufferAvailablePre_;
1400 #endif
1401 }
1402 
IsNotifyUIBufferAvailable() const1403 bool RSSurfaceRenderNode::IsNotifyUIBufferAvailable() const
1404 {
1405     return isNotifyUIBufferAvailable_;
1406 }
1407 
SetCallbackForRenderThreadRefresh(bool isRefresh)1408 void RSSurfaceRenderNode::SetCallbackForRenderThreadRefresh(bool isRefresh)
1409 {
1410     isRefresh_ = isRefresh;
1411 }
1412 
NeedSetCallbackForRenderThreadRefresh()1413 bool RSSurfaceRenderNode::NeedSetCallbackForRenderThreadRefresh()
1414 {
1415     return !isRefresh_;
1416 }
1417 
IsStartAnimationFinished() const1418 bool RSSurfaceRenderNode::IsStartAnimationFinished() const
1419 {
1420     return startAnimationFinished_;
1421 }
1422 
SetStartAnimationFinished()1423 void RSSurfaceRenderNode::SetStartAnimationFinished()
1424 {
1425     RS_LOGD("RSSurfaceRenderNode::SetStartAnimationFinished");
1426     startAnimationFinished_ = true;
1427 }
1428 
UpdateDirtyIfFrameBufferConsumed()1429 bool RSSurfaceRenderNode::UpdateDirtyIfFrameBufferConsumed()
1430 {
1431     if (surfaceHandler_ && surfaceHandler_->IsCurrentFrameBufferConsumed()) {
1432         SetContentDirty();
1433         return true;
1434     }
1435     return false;
1436 }
1437 
IsSurfaceInStartingWindowStage() const1438 bool RSSurfaceRenderNode::IsSurfaceInStartingWindowStage() const
1439 {
1440     auto parentPtr = this->GetParent().lock();
1441     if (parentPtr != nullptr && parentPtr->IsInstanceOf<RSSurfaceRenderNode>()) {
1442         auto surfaceParentPtr = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(parentPtr);
1443         if (surfaceParentPtr->GetSurfaceNodeType() == RSSurfaceNodeType::LEASH_WINDOW_NODE &&
1444             !this->IsNotifyUIBufferAvailable()) {
1445             return true;
1446         }
1447     }
1448     return false;
1449 }
1450 
IsParentLeashWindowInScale() const1451 bool RSSurfaceRenderNode::IsParentLeashWindowInScale() const
1452 {
1453     auto parentPtr = this->GetParent().lock();
1454     if (parentPtr != nullptr && parentPtr->IsInstanceOf<RSSurfaceRenderNode>()) {
1455         auto surfaceParentPtr = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(parentPtr);
1456         if (surfaceParentPtr->IsLeashWindow() && surfaceParentPtr->IsScale()) {
1457             return true;
1458         }
1459     }
1460     return false;
1461 }
1462 
GetSurfaceOcclusionRect(bool isUniRender)1463 Occlusion::Rect RSSurfaceRenderNode::GetSurfaceOcclusionRect(bool isUniRender)
1464 {
1465     Occlusion::Rect occlusionRect;
1466     if (isUniRender) {
1467         occlusionRect = Occlusion::Rect {GetOldDirtyInSurface()};
1468     } else {
1469         occlusionRect = Occlusion::Rect {GetDstRect()};
1470     }
1471     return occlusionRect;
1472 }
1473 
QueryIfAllHwcChildrenForceDisabledByFilter()1474 bool RSSurfaceRenderNode::QueryIfAllHwcChildrenForceDisabledByFilter()
1475 {
1476     std::shared_ptr<RSSurfaceRenderNode> appWindow;
1477     for (auto& child : *GetSortedChildren()) {
1478         auto node = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(child);
1479         if (node && node->IsAppWindow()) {
1480             appWindow = node;
1481             break;
1482         }
1483     }
1484     if (appWindow) {
1485         auto hardwareEnabledNodes = appWindow->GetChildHardwareEnabledNodes();
1486         for (auto& hardwareEnabledNode : hardwareEnabledNodes) {
1487             auto hardwareEnabledNodePtr = hardwareEnabledNode.lock();
1488             if (hardwareEnabledNodePtr && !hardwareEnabledNodePtr->IsHardwareForcedDisabledByFilter()) {
1489                 return false;
1490             }
1491         }
1492     }
1493     return true;
1494 }
1495 
AccumulateOcclusionRegion(Occlusion::Region & accumulatedRegion,Occlusion::Region & curRegion,bool & hasFilterCacheOcclusion,bool isUniRender,bool filterCacheOcclusionEnabled)1496 void RSSurfaceRenderNode::AccumulateOcclusionRegion(Occlusion::Region& accumulatedRegion,
1497     Occlusion::Region& curRegion,
1498     bool& hasFilterCacheOcclusion,
1499     bool isUniRender,
1500     bool filterCacheOcclusionEnabled)
1501 {
1502     // when surfacenode is in starting window stage, do not occlude other window surfaces
1503     // fix gray block when directly open app (i.e. setting) from notification center
1504     if (IsSurfaceInStartingWindowStage()) {
1505         return;
1506     }
1507     if (!isUniRender) {
1508         bool diff =
1509 #ifndef ROSEN_CROSS_PLATFORM
1510             (GetDstRect().width_ > surfaceHandler_->GetBuffer()->GetWidth() ||
1511                 GetDstRect().height_ > surfaceHandler_->GetBuffer()->GetHeight()) &&
1512 #endif
1513             GetRenderProperties().GetFrameGravity() != Gravity::RESIZE && ROSEN_EQ(GetGlobalAlpha(), 1.0f);
1514         if (!IsTransparent() && !diff) {
1515             accumulatedRegion.OrSelf(curRegion);
1516         }
1517     }
1518 
1519     if (GetName().find("hisearch") != std::string::npos) {
1520         return;
1521     }
1522     SetTreatedAsTransparent(false);
1523     // when a surfacenode is in animation (i.e. 3d animation), its dstrect cannot be trusted, we treated it as a full
1524     // transparent layer.
1525     if ((GetAnimateState() || IsParentLeashWindowInScale()) && !isOcclusionInSpecificScenes_) {
1526         SetTreatedAsTransparent(true);
1527         return;
1528     }
1529 
1530     // full surfacenode valid filter cache can be treated as opaque
1531     if (filterCacheOcclusionEnabled && IsTransparent() && GetFilterCacheValidForOcclusion()) {
1532         accumulatedRegion.OrSelf(curRegion);
1533         hasFilterCacheOcclusion = true;
1534     } else {
1535         accumulatedRegion.OrSelf(GetOpaqueRegion());
1536     }
1537     return;
1538 }
1539 
GetVisibleLevelForWMS(RSVisibleLevel visibleLevel)1540 WINDOW_LAYER_INFO_TYPE RSSurfaceRenderNode::GetVisibleLevelForWMS(RSVisibleLevel visibleLevel)
1541 {
1542     switch (visibleLevel) {
1543         case RSVisibleLevel::RS_INVISIBLE:
1544             return WINDOW_LAYER_INFO_TYPE::INVISIBLE;
1545         case RSVisibleLevel::RS_ALL_VISIBLE:
1546             return WINDOW_LAYER_INFO_TYPE::ALL_VISIBLE;
1547         case RSVisibleLevel::RS_SEMI_NONDEFAULT_VISIBLE:
1548         case RSVisibleLevel::RS_SEMI_DEFAULT_VISIBLE:
1549             return WINDOW_LAYER_INFO_TYPE::SEMI_VISIBLE;
1550         default:
1551             break;
1552     }
1553     return WINDOW_LAYER_INFO_TYPE::SEMI_VISIBLE;
1554 }
1555 
IsSCBNode() const1556 bool RSSurfaceRenderNode::IsSCBNode() const
1557 {
1558     return surfaceWindowType_ != SurfaceWindowType::SYSTEM_SCB_WINDOW;
1559 }
1560 
UpdateHwcNodeLayerInfo(GraphicTransformType transform)1561 void RSSurfaceRenderNode::UpdateHwcNodeLayerInfo(GraphicTransformType transform)
1562 {
1563 #ifndef ROSEN_CROSS_PLATFORM
1564     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1565     auto layer = surfaceParams->GetLayerInfo();
1566     layer.srcRect = {srcRect_.left_, srcRect_.top_, srcRect_.width_, srcRect_.height_};
1567     layer.dstRect = {dstRect_.left_, dstRect_.top_, dstRect_.width_, dstRect_.height_};
1568     const auto& properties = GetRenderProperties();
1569     layer.boundRect = {0, 0,
1570         static_cast<uint32_t>(properties.GetBoundsWidth()),
1571         static_cast<uint32_t>(properties.GetBoundsHeight())};
1572     layer.transformType = transform;
1573     layer.zOrder = surfaceHandler_->GetGlobalZOrder();
1574     layer.gravity = static_cast<int32_t>(properties.GetFrameGravity());
1575     layer.blendType = GetBlendType();
1576     layer.matrix = totalMatrix_;
1577     layer.alpha = GetGlobalAlpha();
1578     layer.arsrTag = GetArsrTag();
1579     isHardwareForcedDisabled_ = isProtectedLayer_ ? false : isHardwareForcedDisabled_;
1580 #ifndef ROSEN_CROSS_PLATFORM
1581     auto buffer = surfaceHandler_->GetBuffer();
1582     RS_LOGD("RSSurfaceRenderNode::UpdateHwcNodeLayerInfo: name:%{public}s id:%{public}" PRIu64 ", bufferFormat:%d,"
1583         " src:%{public}s, dst:%{public}s, bounds:[%{public}d, %{public}d] buffer:[%{public}d, %{public}d]"
1584         " transform:%{public}d, zOrder:%{public}d, cur:%{public}d, last:%{public}d",
1585         GetName().c_str(), GetId(), buffer ? buffer->GetFormat() : -1,
1586         srcRect_.ToString().c_str(),
1587         dstRect_.ToString().c_str(),
1588         layer.boundRect.w, layer.boundRect.h,
1589         buffer ? buffer->GetSurfaceBufferWidth() : 0, buffer ? buffer->GetSurfaceBufferHeight() : 0,
1590         transform, layer.zOrder, !IsHardwareForcedDisabled(), isLastFrameHwcEnabled_);
1591     RS_OPTIONAL_TRACE_NAME_FMT("hwc debug:UpdateHwcNodeLayerInfo: name:%s id:%lu, bufferFormat:%d,"
1592         " src:%s, dst:%s, bounds:[%d, %d], buffer:[%d, %d], transform:%d, zOrder:%d, cur:%d, last:%d",
1593         GetName().c_str(), GetId(), buffer ? buffer->GetFormat() : -1,
1594         srcRect_.ToString().c_str(),
1595         dstRect_.ToString().c_str(),
1596         layer.boundRect.w, layer.boundRect.h,
1597         buffer ? buffer->GetSurfaceBufferWidth() : 0, buffer ? buffer->GetSurfaceBufferHeight() : 0,
1598         transform, layer.zOrder, !IsHardwareForcedDisabled(), isLastFrameHwcEnabled_);
1599 #endif
1600     surfaceParams->SetLayerInfo(layer);
1601     surfaceParams->SetHardwareEnabled(!IsHardwareForcedDisabled());
1602     surfaceParams->SetNeedMakeImage(IsHardwareNeedMakeImage());
1603     surfaceParams->SetLastFrameHardwareEnabled(isLastFrameHwcEnabled_);
1604     surfaceParams->SetInFixedRotation(isInFixedRotation_);
1605     // 1 means need source tuning
1606     if (RsCommonHook::Instance().GetVideoSurfaceFlag() && IsYUVBufferFormat()) {
1607         surfaceParams->SetLayerSourceTuning(1);
1608     }
1609     AddToPendingSyncList();
1610 #endif
1611 }
1612 
UpdateHardwareDisabledState(bool disabled)1613 void RSSurfaceRenderNode::UpdateHardwareDisabledState(bool disabled)
1614 {
1615     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1616     surfaceParams->SetLastFrameHardwareEnabled(!IsHardwareForcedDisabled());
1617     SetHardwareForcedDisabledState(disabled);
1618     surfaceParams->SetHardwareEnabled(!IsHardwareForcedDisabled());
1619     AddToPendingSyncList();
1620 }
1621 
SetVisibleRegionRecursive(const Occlusion::Region & region,VisibleData & visibleVec,std::map<NodeId,RSVisibleLevel> & visMapForVsyncRate,bool needSetVisibleRegion,RSVisibleLevel visibleLevel,bool isSystemAnimatedScenes)1622 void RSSurfaceRenderNode::SetVisibleRegionRecursive(const Occlusion::Region& region,
1623                                                     VisibleData& visibleVec,
1624                                                     std::map<NodeId, RSVisibleLevel>& visMapForVsyncRate,
1625                                                     bool needSetVisibleRegion,
1626                                                     RSVisibleLevel visibleLevel,
1627                                                     bool isSystemAnimatedScenes)
1628 {
1629     if (nodeType_ == RSSurfaceNodeType::SELF_DRAWING_NODE || IsAbilityComponent()) {
1630         SetOcclusionVisible(true);
1631         visibleVec.emplace_back(std::make_pair(GetId(), ALL_VISIBLE));
1632         return;
1633     }
1634 
1635     bool vis = !region.IsEmpty();
1636     if (vis) {
1637         visibleVec.emplace_back(std::make_pair(GetId(), GetVisibleLevelForWMS(visibleLevel)));
1638     }
1639 
1640     // collect visible changed pid
1641     if (qosPidCal_ && GetType() == RSRenderNodeType::SURFACE_NODE && !isSystemAnimatedScenes) {
1642         visMapForVsyncRate[GetId()] = !IsSCBNode() ? RSVisibleLevel::RS_ALL_VISIBLE : visibleLevel;
1643     }
1644 
1645     visibleRegionForCallBack_ = region;
1646     if (needSetVisibleRegion) {
1647         visibleRegion_ = region;
1648         SetOcclusionVisible(vis);
1649     }
1650     // when there is filter cache occlusion, also save occlusion status without filter cache
1651     SetOcclusionVisibleWithoutFilter(vis);
1652 
1653     for (auto& child : *GetChildren()) {
1654         if (auto surfaceChild = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(child)) {
1655             surfaceChild->SetVisibleRegionRecursive(region, visibleVec, visMapForVsyncRate, needSetVisibleRegion,
1656                 visibleLevel, isSystemAnimatedScenes);
1657         }
1658     }
1659 }
1660 
ResetSurfaceOpaqueRegion(const RectI & screeninfo,const RectI & absRect,const ScreenRotation screenRotation,const bool isFocusWindow,const Vector4<int> & cornerRadius)1661 void RSSurfaceRenderNode::ResetSurfaceOpaqueRegion(const RectI& screeninfo, const RectI& absRect,
1662     const ScreenRotation screenRotation, const bool isFocusWindow, const Vector4<int>& cornerRadius)
1663 {
1664     Occlusion::Rect absRectR { absRect };
1665     Occlusion::Region oldOpaqueRegion { opaqueRegion_ };
1666 
1667     // The transparent region of surfaceNode should include shadow area
1668     Occlusion::Rect dirtyRect { GetOldDirty() };
1669     transparentRegion_ = Occlusion::Region{ dirtyRect };
1670 
1671     if (IsTransparent()) {
1672         opaqueRegion_ = Occlusion::Region();
1673     } else {
1674         if (IsAppWindow() && HasContainerWindow()) {
1675             opaqueRegion_ = ResetOpaqueRegion(absRect, screenRotation, isFocusWindow);
1676         } else {
1677             if (!cornerRadius.IsZero()) {
1678                 auto maxRadius = std::max({ cornerRadius.x_, cornerRadius.y_, cornerRadius.z_, cornerRadius.w_ });
1679                 Vector4<int> dstCornerRadius((cornerRadius.x_ > 0 ? maxRadius : 0),
1680                                              (cornerRadius.y_ > 0 ? maxRadius : 0),
1681                                              (cornerRadius.z_ > 0 ? maxRadius : 0),
1682                                              (cornerRadius.w_ > 0 ? maxRadius : 0));
1683                 opaqueRegion_ = SetCornerRadiusOpaqueRegion(absRect, dstCornerRadius);
1684             } else {
1685                 opaqueRegion_ = Occlusion::Region{absRectR};
1686             }
1687         }
1688         transparentRegion_.SubSelf(opaqueRegion_);
1689     }
1690     Occlusion::Rect screen{screeninfo};
1691     Occlusion::Region screenRegion{screen};
1692     transparentRegion_.AndSelf(screenRegion);
1693     opaqueRegion_.AndSelf(screenRegion);
1694     opaqueRegionChanged_ = !oldOpaqueRegion.Xor(opaqueRegion_).IsEmpty();
1695     ResetSurfaceContainerRegion(screeninfo, absRect, screenRotation);
1696 }
1697 
CalcFilterCacheValidForOcclusion()1698 void RSSurfaceRenderNode::CalcFilterCacheValidForOcclusion()
1699 {
1700     isFilterCacheStatusChanged_ = false;
1701     bool currentCacheValidForOcclusion = isFilterCacheFullyCovered_ && dirtyManager_->IsFilterCacheRectValid();
1702     if (isFilterCacheValidForOcclusion_ != currentCacheValidForOcclusion) {
1703         isFilterCacheValidForOcclusion_ = currentCacheValidForOcclusion;
1704         isFilterCacheStatusChanged_ = true;
1705     }
1706 }
1707 
UpdateFilterNodes(const std::shared_ptr<RSRenderNode> & nodePtr)1708 void RSSurfaceRenderNode::UpdateFilterNodes(const std::shared_ptr<RSRenderNode>& nodePtr)
1709 {
1710     if (nodePtr == nullptr) {
1711         return;
1712     }
1713     filterNodes_.emplace_back(nodePtr);
1714 }
1715 
CheckValidFilterCacheFullyCoverTarget(const RSRenderNode & filterNode,const RectI & targetRect)1716 void RSSurfaceRenderNode::CheckValidFilterCacheFullyCoverTarget(const RSRenderNode& filterNode, const RectI& targetRect)
1717 {
1718     if (filterNode.IsInstanceOf<RSEffectRenderNode>()) {
1719         return;
1720     }
1721     if (isFilterCacheFullyCovered_ || !filterNode.IsFilterCacheValid()) {
1722         return;
1723     }
1724     // AbsRect may not update here, so use filterCachedRegion to occlude
1725     isFilterCacheFullyCovered_ = targetRect.IsInsideOf(filterNode.GetFilterCachedRegion());
1726 }
1727 
UpdateOccludedByFilterCache(bool val)1728 void RSSurfaceRenderNode::UpdateOccludedByFilterCache(bool val)
1729 {
1730     isOccludedByFilterCache_ = val;
1731     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1732     surfaceParams->SetOccludedByFilterCache(isOccludedByFilterCache_);
1733 }
1734 
UpdateSurfaceCacheContentStaticFlag()1735 void RSSurfaceRenderNode::UpdateSurfaceCacheContentStaticFlag()
1736 {
1737     auto contentStatic = false;
1738     uifirstContentDirty_ = false;
1739     if (IsLeashWindow()) {
1740         for (auto& child : *GetSortedChildren()) {
1741             if (!child) {
1742                 continue;
1743             }
1744             auto childSurface = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(child);
1745             if (childSurface) {
1746                 continue;
1747             }
1748             if (child->IsDirty() || child->IsSubTreeDirty()) {
1749                 uifirstContentDirty_ = true;
1750             }
1751         }
1752         contentStatic = (!IsSubTreeDirty() || GetForceUpdateByUifirst()) && !HasRemovedChild();
1753     } else if (IsAbilityComponent()) {
1754         contentStatic = (!IsSubTreeDirty() || GetForceUpdateByUifirst()) && !IsContentDirty();
1755     } else {
1756         contentStatic = surfaceCacheContentStatic_;
1757     }
1758     uifirstContentDirty_ = uifirstContentDirty_ || HasRemovedChild();
1759     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1760     if (stagingSurfaceParams) {
1761         stagingSurfaceParams->SetSurfaceCacheContentStatic(contentStatic, lastFrameSynced_);
1762     }
1763     if (stagingRenderParams_->NeedSync()) {
1764         AddToPendingSyncList();
1765     }
1766     RS_OPTIONAL_TRACE_NAME_FMT("RSSurfaceRenderNode::UpdateSurfaceCacheContentStaticFlag: "
1767         "name[%s] Id[%" PRIu64 "], contentStatic[%d] subTreeDirty[%d] contentDirty[%d] forceUpdate[%d] "
1768         "hasRemovedChild[%d], GetChildrenCount[%d], uifirstContentDirty:%d",
1769         GetName().c_str(), GetId(), contentStatic, IsSubTreeDirty(), IsContentDirty(), GetForceUpdateByUifirst(),
1770         HasRemovedChild(), GetChildrenCount(), uifirstContentDirty_);
1771 }
1772 
IsOccludedByFilterCache() const1773 bool RSSurfaceRenderNode::IsOccludedByFilterCache() const
1774 {
1775     return isOccludedByFilterCache_;
1776 }
1777 
UpdateSurfaceSubTreeDirtyFlag()1778 void RSSurfaceRenderNode::UpdateSurfaceSubTreeDirtyFlag()
1779 {
1780     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
1781     if (stagingSurfaceParams) {
1782         stagingSurfaceParams->SetSurfaceSubTreeDirty(IsSubTreeDirty());
1783     }
1784     if (stagingRenderParams_->NeedSync()) {
1785         AddToPendingSyncList();
1786     }
1787 }
1788 
UpdateDrawingCacheNodes(const std::shared_ptr<RSRenderNode> & nodePtr)1789 void RSSurfaceRenderNode::UpdateDrawingCacheNodes(const std::shared_ptr<RSRenderNode>& nodePtr)
1790 {
1791     if (nodePtr == nullptr) {
1792         return;
1793     }
1794     drawingCacheNodes_.emplace(nodePtr->GetId(), nodePtr);
1795 }
1796 
ResetDrawingCacheStatusIfNodeStatic(std::unordered_map<NodeId,std::unordered_set<NodeId>> & allRects)1797 void RSSurfaceRenderNode::ResetDrawingCacheStatusIfNodeStatic(
1798     std::unordered_map<NodeId, std::unordered_set<NodeId>>& allRects)
1799 {
1800     // traversal drawing cache nodes including app window
1801     EraseIf(drawingCacheNodes_, [this, &allRects](const auto& pair) {
1802         auto node = pair.second.lock();
1803         if (node == nullptr || !node->IsOnTheTree()) {
1804             return true;
1805         }
1806         node->SetDrawingCacheChanged(false);
1807         node->GetFilterRectsInCache(allRects);
1808         return false;
1809     });
1810 }
1811 
UpdateFilterCacheStatusWithVisible(bool visible)1812 void RSSurfaceRenderNode::UpdateFilterCacheStatusWithVisible(bool visible)
1813 {
1814     if (visible == prevVisible_) {
1815         return;
1816     }
1817     prevVisible_ = visible;
1818 #if (defined(RS_ENABLE_GL) || defined(RS_ENABLE_VK))
1819     if (!RSUniRenderJudgement::IsUniRender() && !visible && !filterNodes_.empty()
1820         && !isOcclusionVisibleWithoutFilter_) {
1821         for (auto& node : filterNodes_) {
1822             node->GetMutableRenderProperties().ClearFilterCache();
1823         }
1824     }
1825 #endif
1826 }
1827 
UpdateFilterCacheStatusIfNodeStatic(const RectI & clipRect,bool isRotationChanged)1828 void RSSurfaceRenderNode::UpdateFilterCacheStatusIfNodeStatic(const RectI& clipRect, bool isRotationChanged)
1829 {
1830     // traversal filter nodes including app window
1831     for (auto node : filterNodes_) {
1832         if (node == nullptr || !node->IsOnTheTree() || !node->GetRenderProperties().NeedFilter()) {
1833             continue;
1834         }
1835         if (node->IsInstanceOf<RSEffectRenderNode>()) {
1836             if (auto effectNode = node->ReinterpretCastTo<RSEffectRenderNode>()) {
1837                 effectNode->SetRotationChanged(isRotationChanged);
1838             }
1839         }
1840         if (node->GetRenderProperties().GetBackgroundFilter()) {
1841             node->UpdateFilterCacheWithBelowDirty(*dirtyManager_);
1842         }
1843         if (node->GetRenderProperties().GetFilter()) {
1844             node->UpdateFilterCacheWithBelowDirty(*dirtyManager_);
1845         }
1846         node->UpdateFilterCacheWithSelfDirty();
1847     }
1848     SetFilterCacheFullyCovered(false);
1849     if (IsTransparent() && dirtyManager_->IfCacheableFilterRectFullyCover(GetOldDirtyInSurface())) {
1850         SetFilterCacheFullyCovered(true);
1851         RS_LOGD("UpdateFilterCacheStatusIfNodeStatic surfacenode %{public}" PRIu64 " [%{public}s] rectsize %{public}s",
1852             GetId(), GetName().c_str(), GetOldDirtyInSurface().ToString().c_str());
1853     }
1854     CalcFilterCacheValidForOcclusion();
1855 }
1856 
GetWindowCornerRadius()1857 Vector4f RSSurfaceRenderNode::GetWindowCornerRadius()
1858 {
1859     if (!GetRenderProperties().GetCornerRadius().IsZero()) {
1860         return GetRenderProperties().GetCornerRadius();
1861     }
1862     auto parent = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetParent().lock());
1863     if (parent != nullptr && parent->IsLeashWindow()) {
1864         return parent->GetRenderProperties().GetCornerRadius();
1865     }
1866     return Vector4f();
1867 }
1868 
ResetOpaqueRegion(const RectI & absRect,const ScreenRotation screenRotation,const bool isFocusWindow) const1869 Occlusion::Region RSSurfaceRenderNode::ResetOpaqueRegion(const RectI& absRect,
1870     const ScreenRotation screenRotation, const bool isFocusWindow) const
1871 {
1872     if (isFocusWindow) {
1873         return SetFocusedWindowOpaqueRegion(absRect, screenRotation);
1874     } else {
1875         return SetUnfocusedWindowOpaqueRegion(absRect, screenRotation);
1876     }
1877 }
1878 
Update(bool hasContainer,float density)1879 void RSSurfaceRenderNode::ContainerConfig::Update(bool hasContainer, float density)
1880 {
1881     this->hasContainerWindow_ = hasContainer;
1882     this->density = density;
1883 
1884     // px = vp * density
1885     float containerTitleHeight_ = CONTAINER_TITLE_HEIGHT * density;
1886     float containerContentPadding_ = CONTENT_PADDING * density;
1887     float containerBorderWidth_ = CONTAINER_BORDER_WIDTH * density;
1888     float containerOutRadius_ = CONTAINER_OUTER_RADIUS * density;
1889     float containerInnerRadius_ = CONTAINER_INNER_RADIUS * density;
1890 
1891     this->outR = RoundFloor(containerOutRadius_);
1892     this->inR = RoundFloor(containerInnerRadius_);
1893     this->bp = RoundFloor(containerBorderWidth_ + containerContentPadding_);
1894     this->bt = RoundFloor(containerBorderWidth_ + containerTitleHeight_);
1895 }
1896 
1897 /*
1898     If a surfacenode with containerwindow is not focus window, then its opaque
1899 region is absRect minus four roundCorner corresponding small rectangles.
1900 This corners removed region can be assembled with two crossed rectangles.
1901 Furthermore, when the surfacenode is not focus window, the inner content roundrect's
1902 boundingbox rect can be set opaque.
1903 */
SetUnfocusedWindowOpaqueRegion(const RectI & absRect,const ScreenRotation screenRotation) const1904 Occlusion::Region RSSurfaceRenderNode::SetUnfocusedWindowOpaqueRegion(const RectI& absRect,
1905     const ScreenRotation screenRotation) const
1906 {
1907     Occlusion::Rect opaqueRect1{ absRect.left_ + containerConfig_.outR,
1908         absRect.top_,
1909         absRect.GetRight() - containerConfig_.outR,
1910         absRect.GetBottom()};
1911     Occlusion::Rect opaqueRect2{ absRect.left_,
1912         absRect.top_ + containerConfig_.outR,
1913         absRect.GetRight(),
1914         absRect.GetBottom() - containerConfig_.outR};
1915     Occlusion::Region r1{opaqueRect1};
1916     Occlusion::Region r2{opaqueRect2};
1917     Occlusion::Region opaqueRegion = r1.Or(r2);
1918 
1919     switch (screenRotation) {
1920         case ScreenRotation::ROTATION_0: {
1921             Occlusion::Rect opaqueRect3{ absRect.left_ + containerConfig_.bp,
1922                 absRect.top_ + containerConfig_.bt,
1923                 absRect.GetRight() - containerConfig_.bp,
1924                 absRect.GetBottom() - containerConfig_.bp};
1925             Occlusion::Region r3{opaqueRect3};
1926             opaqueRegion.OrSelf(r3);
1927             break;
1928         }
1929         case ScreenRotation::ROTATION_90: {
1930             Occlusion::Rect opaqueRect3{ absRect.left_ + containerConfig_.bt,
1931                 absRect.top_ + containerConfig_.bp,
1932                 absRect.GetRight() - containerConfig_.bp,
1933                 absRect.GetBottom() - containerConfig_.bp};
1934             Occlusion::Region r3{opaqueRect3};
1935             opaqueRegion.OrSelf(r3);
1936             break;
1937         }
1938         case ScreenRotation::ROTATION_180: {
1939             Occlusion::Rect opaqueRect3{ absRect.left_ + containerConfig_.bp,
1940                 absRect.top_ + containerConfig_.bp,
1941                 absRect.GetRight() - containerConfig_.bp,
1942                 absRect.GetBottom() - containerConfig_.bt};
1943             Occlusion::Region r3{opaqueRect3};
1944             opaqueRegion.OrSelf(r3);
1945             break;
1946         }
1947         case ScreenRotation::ROTATION_270: {
1948             Occlusion::Rect opaqueRect3{ absRect.left_ + containerConfig_.bp,
1949                 absRect.top_ + containerConfig_.bp,
1950                 absRect.GetRight() - containerConfig_.bt,
1951                 absRect.GetBottom() - containerConfig_.bp};
1952             Occlusion::Region r3{opaqueRect3};
1953             opaqueRegion.OrSelf(r3);
1954             break;
1955         }
1956         default: {
1957             Occlusion::Rect opaqueRect3{ absRect.left_ + containerConfig_.bp,
1958                 absRect.top_ + containerConfig_.bt,
1959                 absRect.GetRight() - containerConfig_.bp,
1960                 absRect.GetBottom() - containerConfig_.bp};
1961             Occlusion::Region r3{opaqueRect3};
1962             opaqueRegion.OrSelf(r3);
1963             break;
1964         }
1965     }
1966     return opaqueRegion;
1967 }
1968 
1969 /*
1970     If a surfacenode with containerwindow is a focused window, then its containerWindow region
1971 should be set transparent, including: title, content padding area, border, and content corners.
1972 Note this region is not centrosymmetric, hence it should be differentiated under different
1973 screen rotation state as top/left/bottom/right has changed when screen rotated.
1974 */
SetFocusedWindowOpaqueRegion(const RectI & absRect,const ScreenRotation screenRotation) const1975 Occlusion::Region RSSurfaceRenderNode::SetFocusedWindowOpaqueRegion(const RectI& absRect,
1976     const ScreenRotation screenRotation) const
1977 {
1978     Occlusion::Region opaqueRegion;
1979     switch (screenRotation) {
1980         case ScreenRotation::ROTATION_0: {
1981             Occlusion::Rect opaqueRect1{
1982                 absRect.left_ + containerConfig_.bp,
1983                 absRect.top_ + containerConfig_.bt + containerConfig_.inR,
1984                 absRect.GetRight() - containerConfig_.bp,
1985                 absRect.GetBottom() - containerConfig_.bp - containerConfig_.inR};
1986             Occlusion::Rect opaqueRect2{
1987                 absRect.left_ + containerConfig_.bp + containerConfig_.inR,
1988                 absRect.top_ + containerConfig_.bt,
1989                 absRect.GetRight() - containerConfig_.bp - containerConfig_.inR,
1990                 absRect.GetBottom() - containerConfig_.bp};
1991             Occlusion::Region r1{opaqueRect1};
1992             Occlusion::Region r2{opaqueRect2};
1993             opaqueRegion = r1.Or(r2);
1994             break;
1995         }
1996         case ScreenRotation::ROTATION_90: {
1997             Occlusion::Rect opaqueRect1{
1998                 absRect.left_ + containerConfig_.bt + containerConfig_.inR,
1999                 absRect.top_ + containerConfig_.bp,
2000                 absRect.GetRight() - containerConfig_.bp - containerConfig_.inR,
2001                 absRect.GetBottom() - containerConfig_.bp};
2002             Occlusion::Rect opaqueRect2{
2003                 absRect.left_ + containerConfig_.bt,
2004                 absRect.top_ + containerConfig_.bp + containerConfig_.inR,
2005                 absRect.GetRight() - containerConfig_.bp,
2006                 absRect.GetBottom() - containerConfig_.bp - containerConfig_.inR};
2007             Occlusion::Region r1{opaqueRect1};
2008             Occlusion::Region r2{opaqueRect2};
2009             opaqueRegion = r1.Or(r2);
2010             break;
2011         }
2012         case ScreenRotation::ROTATION_180: {
2013             Occlusion::Rect opaqueRect1{
2014                 absRect.left_ + containerConfig_.bp,
2015                 absRect.top_ + containerConfig_.bp + containerConfig_.inR,
2016                 absRect.GetRight() - containerConfig_.bp,
2017                 absRect.GetBottom() - containerConfig_.bt - containerConfig_.inR};
2018             Occlusion::Rect opaqueRect2{
2019                 absRect.left_ + containerConfig_.bp + containerConfig_.inR,
2020                 absRect.top_ + containerConfig_.bp,
2021                 absRect.GetRight() - containerConfig_.bp - containerConfig_.inR,
2022                 absRect.GetBottom() - containerConfig_.bt};
2023             Occlusion::Region r1{opaqueRect1};
2024             Occlusion::Region r2{opaqueRect2};
2025             opaqueRegion = r1.Or(r2);
2026             break;
2027         }
2028         case ScreenRotation::ROTATION_270: {
2029             Occlusion::Rect opaqueRect1{
2030                 absRect.left_ + containerConfig_.bp + containerConfig_.inR,
2031                 absRect.top_ + containerConfig_.bp,
2032                 absRect.GetRight() - containerConfig_.bt - containerConfig_.inR,
2033                 absRect.GetBottom() - containerConfig_.bp};
2034             Occlusion::Rect opaqueRect2{
2035                 absRect.left_ + containerConfig_.bp,
2036                 absRect.top_ + containerConfig_.bp + containerConfig_.inR,
2037                 absRect.GetRight() - containerConfig_.bt,
2038                 absRect.GetBottom() - containerConfig_.bp - containerConfig_.inR};
2039             Occlusion::Region r1{opaqueRect1};
2040             Occlusion::Region r2{opaqueRect2};
2041             opaqueRegion = r1.Or(r2);
2042             break;
2043         }
2044         default: {
2045             Occlusion::Rect opaqueRect1{
2046                 absRect.left_ + containerConfig_.bp,
2047                 absRect.top_ + containerConfig_.bt + containerConfig_.inR,
2048                 absRect.GetRight() - containerConfig_.bp,
2049                 absRect.GetBottom() - containerConfig_.bp - containerConfig_.inR};
2050             Occlusion::Rect opaqueRect2{
2051                 absRect.left_ + containerConfig_.bp + containerConfig_.inR,
2052                 absRect.top_ + containerConfig_.bt,
2053                 absRect.GetRight() - containerConfig_.bp - containerConfig_.inR,
2054                 absRect.GetBottom() - containerConfig_.bp};
2055             Occlusion::Region r1{opaqueRect1};
2056             Occlusion::Region r2{opaqueRect2};
2057             opaqueRegion = r1.Or(r2);
2058             break;
2059         }
2060     }
2061     return opaqueRegion;
2062 }
2063 
SetCornerRadiusOpaqueRegion(const RectI & absRect,const Vector4<int> & cornerRadius) const2064 Occlusion::Region RSSurfaceRenderNode::SetCornerRadiusOpaqueRegion(
2065     const RectI& absRect, const Vector4<int>& cornerRadius) const
2066 {
2067     Occlusion::Rect opaqueRect0{ absRect.GetLeft(), absRect.GetTop(),
2068         absRect.GetRight(), absRect.GetBottom()};
2069     Occlusion::Rect opaqueRect1{ absRect.GetLeft(), absRect.GetTop(),
2070         absRect.GetLeft() + cornerRadius.x_, absRect.GetTop() + cornerRadius.x_};
2071     Occlusion::Rect opaqueRect2{ absRect.GetRight() - cornerRadius.y_, absRect.GetTop(),
2072         absRect.GetRight(), absRect.GetTop() + cornerRadius.y_};
2073     Occlusion::Rect opaqueRect3{ absRect.GetRight() - cornerRadius.z_, absRect.GetBottom() - cornerRadius.z_,
2074         absRect.GetRight(), absRect.GetBottom()};
2075     Occlusion::Rect opaqueRect4{ absRect.GetLeft(), absRect.GetBottom() - cornerRadius.w_,
2076         absRect.GetLeft() + cornerRadius.w_, absRect.GetBottom()};
2077 
2078     Occlusion::Region r0{opaqueRect0};
2079     Occlusion::Region r1{opaqueRect1};
2080     Occlusion::Region r2{opaqueRect2};
2081     Occlusion::Region r3{opaqueRect3};
2082     Occlusion::Region r4{opaqueRect4};
2083     Occlusion::Region opaqueRegion = r0.Sub(r1).Sub(r2).Sub(r3).Sub(r4);
2084     return opaqueRegion;
2085 }
2086 
ResetSurfaceContainerRegion(const RectI & screeninfo,const RectI & absRect,const ScreenRotation screenRotation)2087 void RSSurfaceRenderNode::ResetSurfaceContainerRegion(const RectI& screeninfo, const RectI& absRect,
2088     const ScreenRotation screenRotation)
2089 {
2090     if (!HasContainerWindow()) {
2091         containerRegion_ = Occlusion::Region{};
2092         return;
2093     }
2094     Occlusion::Region absRegion{Occlusion::Rect{absRect}};
2095     Occlusion::Rect innerRect;
2096     switch (screenRotation) {
2097         case ScreenRotation::ROTATION_0: {
2098             innerRect = Occlusion::Rect{ absRect.left_ + containerConfig_.bp,
2099                 absRect.top_ + containerConfig_.bt,
2100                 absRect.GetRight() - containerConfig_.bp,
2101                 absRect.GetBottom() - containerConfig_.bp};
2102             break;
2103         }
2104         case ScreenRotation::ROTATION_90: {
2105             innerRect = Occlusion::Rect{ absRect.left_ + containerConfig_.bt,
2106                 absRect.top_ + containerConfig_.bp,
2107                 absRect.GetRight() - containerConfig_.bp,
2108                 absRect.GetBottom() - containerConfig_.bp};
2109             break;
2110         }
2111         case ScreenRotation::ROTATION_180: {
2112             innerRect = Occlusion::Rect{ absRect.left_ + containerConfig_.bp,
2113                 absRect.top_ + containerConfig_.bp,
2114                 absRect.GetRight() - containerConfig_.bp,
2115                 absRect.GetBottom() - containerConfig_.bt};
2116             break;
2117         }
2118         case ScreenRotation::ROTATION_270: {
2119             innerRect = Occlusion::Rect{ absRect.left_ + containerConfig_.bp,
2120                 absRect.top_ + containerConfig_.bp,
2121                 absRect.GetRight() - containerConfig_.bt,
2122                 absRect.GetBottom() - containerConfig_.bp};
2123             break;
2124         }
2125         default: {
2126             innerRect = Occlusion::Rect{ absRect.left_ + containerConfig_.bp,
2127                 absRect.top_ + containerConfig_.bt,
2128                 absRect.GetRight() - containerConfig_.bp,
2129                 absRect.GetBottom() - containerConfig_.bp};
2130             break;
2131         }
2132     }
2133     Occlusion::Region innerRectRegion{innerRect};
2134     containerRegion_ = absRegion.Sub(innerRectRegion);
2135 }
2136 
OnSync()2137 void RSSurfaceRenderNode::OnSync()
2138 {
2139     RS_OPTIONAL_TRACE_NAME_FMT("RSSurfaceRenderNode::OnSync name[%s] dirty[%s]",
2140         GetName().c_str(), dirtyManager_->GetCurrentFrameDirtyRegion().ToString().c_str());
2141     if (!renderDrawable_) {
2142         return;
2143     }
2144     auto syncDirtyManager = renderDrawable_->GetSyncDirtyManager();
2145     dirtyManager_->OnSync(syncDirtyManager);
2146     if (IsMainWindowType() || IsLeashWindow() || GetLastFrameUifirstFlag() != MultiThreadCacheType::NONE) {
2147         auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2148         if (surfaceParams == nullptr) {
2149             RS_LOGE("RSSurfaceRenderNode::OnSync surfaceParams is null");
2150             return;
2151         }
2152         surfaceParams->SetNeedSync(true);
2153     }
2154 #ifndef ROSEN_CROSS_PLATFORM
2155     renderDrawable_->RegisterDeleteBufferListenerOnSync(GetRSSurfaceHandler()->GetConsumer());
2156 #endif
2157     RSRenderNode::OnSync();
2158 }
2159 
CheckIfOcclusionReusable(std::queue<NodeId> & surfaceNodesIds) const2160 bool RSSurfaceRenderNode::CheckIfOcclusionReusable(std::queue<NodeId>& surfaceNodesIds) const
2161 {
2162     if (surfaceNodesIds.empty()) {
2163         return true;
2164     }
2165     auto lastFrameSurfaceNodeId = surfaceNodesIds.front();
2166     surfaceNodesIds.pop();
2167     if (lastFrameSurfaceNodeId != GetId()) {
2168         return true;
2169     }
2170     return false;
2171 }
2172 
CheckIfOcclusionChanged() const2173 bool RSSurfaceRenderNode::CheckIfOcclusionChanged() const
2174 {
2175     return GetZorderChanged() || GetDstRectChanged() || IsOpaqueRegionChanged() ||
2176         GetDirtyManager()->IsActiveSurfaceRectChanged();
2177 }
2178 
CheckParticipateInOcclusion()2179 bool RSSurfaceRenderNode::CheckParticipateInOcclusion()
2180 {
2181     // planning: Need consider others situation
2182     isParentScaling_ = false;
2183     auto nodeParent = GetParent().lock();
2184     if (nodeParent && nodeParent->IsScale()) {
2185         isParentScaling_ = true;
2186         if (GetDstRectChanged() && !isOcclusionInSpecificScenes_) {
2187             return false;
2188         }
2189     }
2190     if (IsTransparent() || GetAnimateState() || IsRotating() || IsSubSurfaceNode()) {
2191         return false;
2192     }
2193     return true;
2194 }
2195 
RotateCorner(int rotationDegree,Vector4<int> & cornerRadius) const2196 void RSSurfaceRenderNode::RotateCorner(int rotationDegree, Vector4<int>& cornerRadius) const
2197 {
2198     auto begin = cornerRadius.GetData();
2199     auto end = begin + Vector4<int>::V4SIZE;
2200     switch (rotationDegree) {
2201         case RS_ROTATION_90: {
2202             constexpr int moveTime = 1;
2203             std::rotate(begin, end - moveTime, end);
2204             break;
2205         }
2206         case RS_ROTATION_180: {
2207             constexpr int moveTime = 2;
2208             std::rotate(begin, end - moveTime, end);
2209             break;
2210         }
2211         case RS_ROTATION_270: {
2212             constexpr int moveTime = 3;
2213             std::rotate(begin, end - moveTime, end);
2214             break;
2215         }
2216         default:
2217             break;
2218     }
2219 }
2220 
CheckAndUpdateOpaqueRegion(const RectI & screeninfo,const ScreenRotation screenRotation,const bool isFocusWindow)2221 void RSSurfaceRenderNode::CheckAndUpdateOpaqueRegion(const RectI& screeninfo, const ScreenRotation screenRotation,
2222     const bool isFocusWindow)
2223 {
2224     auto absRect = GetOldDirtyInSurface();
2225     auto geoPtr = GetRenderProperties().GetBoundsGeometry();
2226     if (geoPtr) {
2227         absRect = absRect.IntersectRect(geoPtr->GetAbsRect());
2228     }
2229     Vector4f tmpCornerRadius;
2230     Vector4f::Max(GetWindowCornerRadius(), GetGlobalCornerRadius(), tmpCornerRadius);
2231     Vector4<int> cornerRadius(static_cast<int>(std::round(tmpCornerRadius.x_)),
2232                                 static_cast<int>(std::round(tmpCornerRadius.y_)),
2233                                 static_cast<int>(std::round(tmpCornerRadius.z_)),
2234                                 static_cast<int>(std::round(tmpCornerRadius.w_)));
2235     auto boundsGeometry = GetRenderProperties().GetBoundsGeometry();
2236     if (boundsGeometry) {
2237         const auto& absMatrix = boundsGeometry->GetAbsMatrix();
2238         auto rotationDegree = static_cast<int>(-round(atan2(absMatrix.Get(Drawing::Matrix::SKEW_X),
2239             absMatrix.Get(Drawing::Matrix::SCALE_X)) * (RS_ROTATION_180 / PI)));
2240         if (rotationDegree < 0) {
2241             rotationDegree += RS_ROTATION_360;
2242         }
2243         RotateCorner(rotationDegree, cornerRadius);
2244     }
2245 
2246     bool ret = opaqueRegionBaseInfo_.screenRect_ == screeninfo &&
2247         opaqueRegionBaseInfo_.absRect_ == absRect &&
2248         opaqueRegionBaseInfo_.oldDirty_ == GetOldDirty() &&
2249         opaqueRegionBaseInfo_.screenRotation_ == screenRotation &&
2250         opaqueRegionBaseInfo_.isFocusWindow_ == isFocusWindow &&
2251         opaqueRegionBaseInfo_.cornerRadius_ == cornerRadius &&
2252         opaqueRegionBaseInfo_.isTransparent_ == IsTransparent() &&
2253         opaqueRegionBaseInfo_.hasContainerWindow_ == HasContainerWindow();
2254     if (!ret) {
2255         if (absRect.IsEmpty()) {
2256             RS_LOGW("%{public}s absRect is empty, dst rect: %{public}s, old dirty in surface: %{public}s",
2257                 GetName().c_str(), GetDstRect().ToString().c_str(), GetOldDirtyInSurface().ToString().c_str());
2258             RS_TRACE_NAME_FMT("%s absRect is empty, dst rect: %s, old dirty in surface: %s",
2259                 GetName().c_str(), GetDstRect().ToString().c_str(), GetOldDirtyInSurface().ToString().c_str());
2260         }
2261         ResetSurfaceOpaqueRegion(screeninfo, absRect, screenRotation, isFocusWindow, cornerRadius);
2262         SetOpaqueRegionBaseInfo(screeninfo, absRect, screenRotation, isFocusWindow, cornerRadius);
2263     }
2264 }
2265 
CheckOpaqueRegionBaseInfo(const RectI & screeninfo,const RectI & absRect,const ScreenRotation screenRotation,const bool isFocusWindow,const Vector4<int> & cornerRadius)2266 bool RSSurfaceRenderNode::CheckOpaqueRegionBaseInfo(const RectI& screeninfo, const RectI& absRect,
2267     const ScreenRotation screenRotation, const bool isFocusWindow, const Vector4<int>& cornerRadius)
2268 {
2269     return opaqueRegionBaseInfo_.screenRect_ == screeninfo &&
2270         opaqueRegionBaseInfo_.absRect_ == absRect &&
2271         opaqueRegionBaseInfo_.screenRotation_ == screenRotation &&
2272         opaqueRegionBaseInfo_.isFocusWindow_ == isFocusWindow &&
2273         opaqueRegionBaseInfo_.cornerRadius_ == cornerRadius &&
2274         opaqueRegionBaseInfo_.isTransparent_ == IsTransparent() &&
2275         opaqueRegionBaseInfo_.hasContainerWindow_ == HasContainerWindow();
2276 }
2277 
SetOpaqueRegionBaseInfo(const RectI & screeninfo,const RectI & absRect,const ScreenRotation screenRotation,const bool isFocusWindow,const Vector4<int> & cornerRadius)2278 void RSSurfaceRenderNode::SetOpaqueRegionBaseInfo(const RectI& screeninfo, const RectI& absRect,
2279     const ScreenRotation screenRotation, const bool isFocusWindow, const Vector4<int>& cornerRadius)
2280 {
2281     opaqueRegionBaseInfo_.screenRect_ = screeninfo;
2282     opaqueRegionBaseInfo_.absRect_ = absRect;
2283     opaqueRegionBaseInfo_.oldDirty_ = GetOldDirty();
2284     opaqueRegionBaseInfo_.screenRotation_ = screenRotation;
2285     opaqueRegionBaseInfo_.isFocusWindow_ = isFocusWindow;
2286     opaqueRegionBaseInfo_.cornerRadius_ = cornerRadius;
2287     opaqueRegionBaseInfo_.isTransparent_ = IsTransparent();
2288     opaqueRegionBaseInfo_.hasContainerWindow_ = HasContainerWindow();
2289 }
2290 
2291 // [planning] Remove this after skia is upgraded, the clipRegion is supported
ResetChildrenFilterRects()2292 void RSSurfaceRenderNode::ResetChildrenFilterRects()
2293 {
2294     childrenFilterNodes_.clear();
2295     childrenFilterRects_.clear();
2296     childrenFilterRectsCacheValid_.clear();
2297 }
2298 
UpdateChildrenFilterRects(std::shared_ptr<RSRenderNode> filternode,const RectI & rect,bool cacheValid)2299 void RSSurfaceRenderNode::UpdateChildrenFilterRects(std::shared_ptr<RSRenderNode> filternode,
2300     const RectI& rect, bool cacheValid)
2301 {
2302     if (!rect.IsEmpty()) {
2303         childrenFilterNodes_.emplace_back(filternode);
2304         childrenFilterRects_.emplace_back(rect);
2305         childrenFilterRectsCacheValid_.emplace_back(cacheValid);
2306     }
2307 }
2308 
GetChildrenNeedFilterRects() const2309 const std::vector<RectI>& RSSurfaceRenderNode::GetChildrenNeedFilterRects() const
2310 {
2311     return childrenFilterRects_;
2312 }
2313 
GetChildrenNeedFilterRectsCacheValid() const2314 const std::vector<bool>& RSSurfaceRenderNode::GetChildrenNeedFilterRectsCacheValid() const
2315 {
2316     return childrenFilterRectsCacheValid_;
2317 }
2318 
GetChildrenFilterNodes() const2319 const std::vector<std::shared_ptr<RSRenderNode>>& RSSurfaceRenderNode::GetChildrenFilterNodes() const
2320 {
2321     return childrenFilterNodes_;
2322 }
2323 
GetChildrenNeedFilterRectsWithoutCacheValid()2324 std::vector<RectI> RSSurfaceRenderNode::GetChildrenNeedFilterRectsWithoutCacheValid()
2325 {
2326     std::vector<RectI> childrenFilterRectsWithoutCacheValid;
2327     auto maxSize = std::min(childrenFilterRects_.size(), childrenFilterRectsCacheValid_.size());
2328     for (size_t i = 0; i < maxSize; i++) {
2329         if (!childrenFilterRectsCacheValid_[i]) {
2330             childrenFilterRectsWithoutCacheValid.emplace_back(childrenFilterRects_[i]);
2331         }
2332     }
2333     return childrenFilterRectsWithoutCacheValid;
2334 }
2335 
2336 // manage abilities' nodeid info
UpdateAbilityNodeIds(NodeId id,bool isAdded)2337 void RSSurfaceRenderNode::UpdateAbilityNodeIds(NodeId id, bool isAdded)
2338 {
2339     if (isAdded) {
2340         abilityNodeIds_.emplace(id);
2341     } else {
2342         abilityNodeIds_.erase(id);
2343     }
2344 }
2345 
AddAbilityComponentNodeIds(const std::unordered_set<NodeId> & nodeIds)2346 void RSSurfaceRenderNode::AddAbilityComponentNodeIds(const std::unordered_set<NodeId>& nodeIds)
2347 {
2348     abilityNodeIds_.insert(nodeIds.begin(), nodeIds.end());
2349 }
2350 
ResetAbilityNodeIds()2351 void RSSurfaceRenderNode::ResetAbilityNodeIds()
2352 {
2353     abilityNodeIds_.clear();
2354 }
2355 
UpdateSurfaceCacheContentStatic()2356 void RSSurfaceRenderNode::UpdateSurfaceCacheContentStatic()
2357 {
2358     dirtyContentNodeNum_ = 0;
2359     dirtyGeoNodeNum_ = 0;
2360     dirtynodeNum_ = 0;
2361     surfaceCacheContentStatic_ = IsOnlyBasicGeoTransform();
2362 }
2363 
UpdateSurfaceCacheContentStatic(const std::unordered_map<NodeId,std::weak_ptr<RSRenderNode>> & activeNodeIds)2364 void RSSurfaceRenderNode::UpdateSurfaceCacheContentStatic(
2365     const std::unordered_map<NodeId, std::weak_ptr<RSRenderNode>>& activeNodeIds)
2366 {
2367     dirtyContentNodeNum_ = 0;
2368     dirtyGeoNodeNum_ = 0;
2369     dirtynodeNum_ = activeNodeIds.size();
2370     surfaceCacheContentStatic_ = IsOnlyBasicGeoTransform() || GetForceUpdateByUifirst();
2371     if (dirtynodeNum_ == 0) {
2372         RS_LOGD("Clear surface %{public}" PRIu64 " dirtynodes surfaceCacheContentStatic_:%{public}d",
2373             GetId(), surfaceCacheContentStatic_);
2374         return;
2375     }
2376     for (auto [id, subNode] : activeNodeIds) {
2377         auto node = subNode.lock();
2378         if (node == nullptr || (id == GetId() && surfaceCacheContentStatic_)) {
2379             continue;
2380         }
2381         // classify active nodes except instance surface itself
2382         if (node->IsContentDirty() && !node->IsNewOnTree() && !node->GetRenderProperties().IsGeoDirty()) {
2383             dirtyContentNodeNum_++;
2384         } else {
2385             dirtyGeoNodeNum_++;
2386         }
2387     }
2388     RS_OPTIONAL_TRACE_NAME_FMT("UpdateSurfaceCacheContentStatic [%s-%lu] contentStatic: %d, dirtyContentNode: %d, "
2389         "dirtyGeoNode: %d", GetName().c_str(), GetId(),
2390         surfaceCacheContentStatic_, dirtyContentNodeNum_, dirtyGeoNodeNum_);
2391     // if mainwindow node only basicGeoTransform and no subnode dirty, it is marked as CacheContentStatic_
2392     surfaceCacheContentStatic_ = surfaceCacheContentStatic_ && dirtyContentNodeNum_ == 0 && dirtyGeoNodeNum_ == 0;
2393 }
2394 
GetAbilityNodeIds() const2395 const std::unordered_set<NodeId>& RSSurfaceRenderNode::GetAbilityNodeIds() const
2396 {
2397     return abilityNodeIds_;
2398 }
2399 
ResetChildHardwareEnabledNodes()2400 void RSSurfaceRenderNode::ResetChildHardwareEnabledNodes()
2401 {
2402     childHardwareEnabledNodes_.clear();
2403 }
2404 
AddChildHardwareEnabledNode(std::weak_ptr<RSSurfaceRenderNode> childNode)2405 void RSSurfaceRenderNode::AddChildHardwareEnabledNode(std::weak_ptr<RSSurfaceRenderNode> childNode)
2406 {
2407     childHardwareEnabledNodes_.erase(std::remove_if(childHardwareEnabledNodes_.begin(),
2408         childHardwareEnabledNodes_.end(),
2409         [&childNode](const auto& iter) {
2410             auto node = iter.lock();
2411             auto childNodePtr = childNode.lock();
2412             return node && childNodePtr && node == childNodePtr;
2413         }), childHardwareEnabledNodes_.end());
2414     childHardwareEnabledNodes_.emplace_back(childNode);
2415 }
2416 
UpdateChildHardwareEnabledNode(NodeId id,bool isOnTree)2417 void RSSurfaceRenderNode::UpdateChildHardwareEnabledNode(NodeId id, bool isOnTree)
2418 {
2419     if (isOnTree) {
2420         needCollectHwcNode_ = true;
2421     } else {
2422         childHardwareEnabledNodes_.erase(std::remove_if(childHardwareEnabledNodes_.begin(),
2423             childHardwareEnabledNodes_.end(),
2424             [&id](std::weak_ptr<RSSurfaceRenderNode> item) {
2425                 std::shared_ptr<RSSurfaceRenderNode> hwcNodePtr = item.lock();
2426                 if (!hwcNodePtr) {
2427                     return false;
2428                 }
2429                 return hwcNodePtr->GetId() == id;
2430             }), childHardwareEnabledNodes_.end());
2431     }
2432 }
2433 
GetChildHardwareEnabledNodes() const2434 const std::vector<std::weak_ptr<RSSurfaceRenderNode>>& RSSurfaceRenderNode::GetChildHardwareEnabledNodes() const
2435 {
2436     return childHardwareEnabledNodes_;
2437 }
2438 
SetHwcChildrenDisabledStateByUifirst()2439 void RSSurfaceRenderNode::SetHwcChildrenDisabledStateByUifirst()
2440 {
2441     if (IsAppWindow()) {
2442         auto hwcNodes = GetChildHardwareEnabledNodes();
2443         if (hwcNodes.empty()) {
2444             return;
2445         }
2446         for (auto hwcNode : hwcNodes) {
2447             auto hwcNodePtr = hwcNode.lock();
2448             if (!hwcNodePtr || hwcNodePtr->IsHardwareForcedDisabled()) {
2449                 continue;
2450             }
2451             hwcNodePtr->SetHardwareForcedDisabledState(true);
2452         }
2453     } else if (IsLeashWindow()) {
2454         for (auto& child : *GetChildren()) {
2455             auto surfaceNode = child->ReinterpretCastTo<RSSurfaceRenderNode>();
2456             if (surfaceNode == nullptr) {
2457                 continue;
2458             }
2459             surfaceNode->SetHwcChildrenDisabledStateByUifirst();
2460         }
2461     }
2462 }
2463 
SetLocalZOrder(float localZOrder)2464 void RSSurfaceRenderNode::SetLocalZOrder(float localZOrder)
2465 {
2466     localZOrder_ = localZOrder;
2467 }
2468 
GetLocalZOrder() const2469 float RSSurfaceRenderNode::GetLocalZOrder() const
2470 {
2471     return localZOrder_;
2472 }
2473 
OnApplyModifiers()2474 void RSSurfaceRenderNode::OnApplyModifiers()
2475 {
2476     auto& properties = GetMutableRenderProperties();
2477     auto& geoPtr = (properties.GetBoundsGeometry());
2478 
2479     // Multiply context alpha into alpha
2480     properties.SetAlpha(properties.GetAlpha() * contextAlpha_);
2481 
2482     // Apply the context matrix into the bounds geometry
2483     geoPtr->SetContextMatrix(contextMatrix_);
2484     if (!ShouldPaint()) {
2485         UpdateFilterCacheStatusWithVisible(false);
2486     }
2487 }
2488 
SetTotalMatrix(const Drawing::Matrix & totalMatrix)2489 void RSSurfaceRenderNode::SetTotalMatrix(const Drawing::Matrix& totalMatrix)
2490 {
2491     totalMatrix_ = totalMatrix;
2492     stagingRenderParams_->SetTotalMatrix(totalMatrix);
2493 }
2494 
GetContextClipRegion() const2495 std::optional<Drawing::Rect> RSSurfaceRenderNode::GetContextClipRegion() const
2496 {
2497     return contextClipRect_;
2498 }
2499 
LeashWindowRelatedAppWindowOccluded(std::vector<std::shared_ptr<RSSurfaceRenderNode>> & appNodes)2500 bool RSSurfaceRenderNode::LeashWindowRelatedAppWindowOccluded(
2501     std::vector<std::shared_ptr<RSSurfaceRenderNode>>& appNodes)
2502 {
2503     if (!IsLeashWindow()) {
2504         return false;
2505     }
2506     for (auto& childNode : *GetChildren()) {
2507         const auto& childNodeSurface = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(childNode);
2508         if (childNodeSurface && childNodeSurface->GetVisibleRegion().IsEmpty()) {
2509             appNodes.emplace_back(childNodeSurface);
2510         } else {
2511             return false;
2512         }
2513     }
2514     return true;
2515 }
2516 
GetLeashWindowNestedSurfaces()2517 std::vector<std::shared_ptr<RSSurfaceRenderNode>> RSSurfaceRenderNode::GetLeashWindowNestedSurfaces()
2518 {
2519     std::vector<std::shared_ptr<RSSurfaceRenderNode>> res;
2520     if (!IsLeashWindow()) {
2521         return res;
2522     }
2523     for (auto& childNode : *GetSortedChildren()) {
2524         if (auto childNodeSurface = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(childNode)) {
2525                 res.emplace_back(childNodeSurface);
2526         }
2527     }
2528     return res;
2529 }
2530 
IsHistoryOccludedDirtyRegionNeedSubmit()2531 bool RSSurfaceRenderNode::IsHistoryOccludedDirtyRegionNeedSubmit()
2532 {
2533     return (hasUnSubmittedOccludedDirtyRegion_ &&
2534         !historyUnSubmittedOccludedDirtyRegion_.IsEmpty() &&
2535         !visibleRegion_.IsEmpty() &&
2536         visibleRegion_.IsIntersectWith(historyUnSubmittedOccludedDirtyRegion_));
2537 }
2538 
ClearHistoryUnSubmittedDirtyInfo()2539 void RSSurfaceRenderNode::ClearHistoryUnSubmittedDirtyInfo()
2540 {
2541     hasUnSubmittedOccludedDirtyRegion_ = false;
2542     historyUnSubmittedOccludedDirtyRegion_.Clear();
2543 }
2544 
UpdateHistoryUnsubmittedDirtyInfo()2545 void RSSurfaceRenderNode::UpdateHistoryUnsubmittedDirtyInfo()
2546 {
2547     hasUnSubmittedOccludedDirtyRegion_ = true;
2548     historyUnSubmittedOccludedDirtyRegion_ = dirtyManager_->GetCurrentFrameDirtyRegion().JoinRect(
2549         historyUnSubmittedOccludedDirtyRegion_);
2550 }
2551 
IsUIFirstSelfDrawCheck()2552 bool RSSurfaceRenderNode::IsUIFirstSelfDrawCheck()
2553 {
2554     if (IsAppWindow()) {
2555         auto hardwareEnabledNodes = GetChildHardwareEnabledNodes();
2556         for (auto& hardwareEnabledNode : hardwareEnabledNodes) {
2557             auto hardwareEnabledNodePtr = hardwareEnabledNode.lock();
2558             if (hardwareEnabledNodePtr && hardwareEnabledNodePtr->surfaceHandler_->IsCurrentFrameBufferConsumed()) {
2559                 return false;
2560             }
2561         }
2562     }
2563     if (IsMainWindowType()) {
2564         return true;
2565     } else if (IsLeashWindow()) {
2566         auto nestedSurfaceNodes = GetLeashWindowNestedSurfaces();
2567         // leashwindow subthread cache considered static if and only if all nested surfacenode static
2568         // (include appwindow and starting window)
2569         for (auto& nestedSurface: nestedSurfaceNodes) {
2570             if (nestedSurface && !nestedSurface->IsUIFirstSelfDrawCheck()) {
2571                 return false;
2572             }
2573         }
2574         return true;
2575     } else if (IsSelfDrawingType()) {
2576         return !surfaceHandler_->IsCurrentFrameBufferConsumed();
2577     } else {
2578         return false;
2579     }
2580 }
2581 
IsCurFrameStatic(DeviceType deviceType)2582 bool RSSurfaceRenderNode::IsCurFrameStatic(DeviceType deviceType)
2583 {
2584     bool isDirty = deviceType == DeviceType::PC ? !surfaceCacheContentStatic_ :
2585         !dirtyManager_->GetCurrentFrameDirtyRegion().IsEmpty();
2586     if (isDirty) {
2587         return false;
2588     }
2589     if (IsMainWindowType()) {
2590         return true;
2591     } else if (IsLeashWindow()) {
2592         auto nestedSurfaceNodes = GetLeashWindowNestedSurfaces();
2593         // leashwindow children changed or has other type node except surfacenode
2594         if (deviceType == DeviceType::PC && lastFrameChildrenCnt_ != GetChildren()->size()) {
2595             return false;
2596         }
2597         for (auto& nestedSurface: nestedSurfaceNodes) {
2598             if (nestedSurface && !nestedSurface->IsCurFrameStatic(deviceType)) {
2599                 return false;
2600             }
2601         }
2602         return true;
2603     } else {
2604         return false;
2605     }
2606 }
2607 
IsVisibleDirtyEmpty(DeviceType deviceType)2608 bool RSSurfaceRenderNode::IsVisibleDirtyEmpty(DeviceType deviceType)
2609 {
2610     bool isStaticUnderVisibleRegion = false;
2611     if (!dirtyManager_->GetCurrentFrameDirtyRegion().IsEmpty()) {
2612         if (deviceType != DeviceType::PC) {
2613             return false;
2614         }
2615         // Visible dirty region optimization takes effecct only in PC or TABLET scenarios
2616         Occlusion::Rect currentFrameDirty(dirtyManager_->GetCurrentFrameDirtyRegion());
2617         if (!visibleRegion_.IsEmpty() && visibleRegion_.IsIntersectWith(currentFrameDirty)) {
2618             ClearHistoryUnSubmittedDirtyInfo();
2619             return false;
2620         }
2621         isStaticUnderVisibleRegion = true;
2622     }
2623     if (IsMainWindowType()) {
2624         if (deviceType == DeviceType::PC) {
2625             if (IsHistoryOccludedDirtyRegionNeedSubmit()) {
2626                 ClearHistoryUnSubmittedDirtyInfo();
2627                 return false;
2628             }
2629             if (isStaticUnderVisibleRegion) {
2630                 UpdateHistoryUnsubmittedDirtyInfo();
2631             }
2632         }
2633         return true;
2634     } else if (IsLeashWindow()) {
2635         auto nestedSurfaceNodes = GetLeashWindowNestedSurfaces();
2636         if (nestedSurfaceNodes.empty()) {
2637             return false;
2638         }
2639         for (auto& nestedSurface: nestedSurfaceNodes) {
2640             if (nestedSurface && !nestedSurface->IsVisibleDirtyEmpty(deviceType)) {
2641                 return false;
2642             }
2643         }
2644         return true;
2645     } else {
2646         return false;
2647     }
2648 }
2649 
IsUIFirstCacheReusable(DeviceType deviceType)2650 bool RSSurfaceRenderNode::IsUIFirstCacheReusable(DeviceType deviceType)
2651 {
2652     return GetCacheSurfaceProcessedStatus() == CacheProcessStatus::DONE &&
2653         HasCachedTexture() && IsUIFirstSelfDrawCheck() && IsCurFrameStatic(deviceType);
2654 }
2655 
UpdateCacheSurfaceDirtyManager(int bufferAge)2656 void RSSurfaceRenderNode::UpdateCacheSurfaceDirtyManager(int bufferAge)
2657 {
2658     if (!cacheSurfaceDirtyManager_ || !dirtyManager_) {
2659         return;
2660     }
2661     cacheSurfaceDirtyManager_->Clear();
2662     cacheSurfaceDirtyManager_->MergeDirtyRect(dirtyManager_->GetLatestDirtyRegion());
2663     cacheSurfaceDirtyManager_->SetBufferAge(bufferAge);
2664     cacheSurfaceDirtyManager_->UpdateDirty(false);
2665     // for leashwindow type, nested app surfacenode's cacheSurfaceDirtyManager update is required
2666     auto nestedSurfaceNodes = GetLeashWindowNestedSurfaces();
2667     for (auto& nestedSurface : nestedSurfaceNodes) {
2668         if (nestedSurface) {
2669             nestedSurface->UpdateCacheSurfaceDirtyManager(bufferAge);
2670         }
2671     }
2672 }
2673 
SetIsOnTheTree(bool onTree,NodeId instanceRootNodeId,NodeId firstLevelNodeId,NodeId cacheNodeId,NodeId uifirstRootNodeId,NodeId displayNodeId)2674 void RSSurfaceRenderNode::SetIsOnTheTree(bool onTree, NodeId instanceRootNodeId, NodeId firstLevelNodeId,
2675     NodeId cacheNodeId, NodeId uifirstRootNodeId, NodeId displayNodeId)
2676 {
2677     std::string uniqueIdStr = "null";
2678 #ifndef ROSEN_CROSS_PLATFORM
2679     uniqueIdStr = GetRSSurfaceHandler() != nullptr && GetRSSurfaceHandler()->GetConsumer() != nullptr ?
2680         std::to_string(GetRSSurfaceHandler()->GetConsumer()->GetUniqueId()) : "null";
2681 #endif
2682     RS_LOGI("RSSurfaceRenderNode:SetIsOnTheTree, node:[name: %{public}s, id: %{public}" PRIu64 "], "
2683         "on tree: %{public}d, nodeType: %{public}d, uniqueId: %{public}s", GetName().c_str(), GetId(), onTree,
2684         static_cast<int>(nodeType_), uniqueIdStr.c_str());
2685     RS_TRACE_NAME_FMT("RSSurfaceRenderNode:SetIsOnTheTree, node:[name: %s, id: %" PRIu64 "], "
2686         "on tree: %d, nodeType: %d", GetName().c_str(), GetId(), onTree, static_cast<int>(nodeType_));
2687     instanceRootNodeId = IsLeashOrMainWindow() ? GetId() : instanceRootNodeId;
2688     if (IsLeashWindow()) {
2689         firstLevelNodeId = GetId();
2690     } else if (IsAppWindow()) {
2691         firstLevelNodeId = GetId();
2692         auto parentNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(GetParent().lock());
2693         if (parentNode && parentNode->GetFirstLevelNodeId() != INVALID_NODEID) {
2694             firstLevelNodeId = parentNode->GetFirstLevelNodeId();
2695         }
2696     }
2697     if (IsSecureUIExtension() || IsUnobscuredUIExtensionNode()) {
2698         if (onTree) {
2699             secUIExtensionNodes_.insert(std::pair<NodeId, NodeId>(GetId(), instanceRootNodeId));
2700         } else {
2701             secUIExtensionNodes_.erase(GetId());
2702         }
2703         if (auto parent = GetParent().lock()) {
2704             parent->SetChildrenHasUIExtension(onTree);
2705         }
2706     }
2707     // if node is marked as cacheRoot, update subtree status when update surface
2708     // in case prepare stage upper cacheRoot cannot specify dirty subnode
2709     RSBaseRenderNode::SetIsOnTheTree(onTree, instanceRootNodeId, firstLevelNodeId, cacheNodeId,
2710         INVALID_NODEID, displayNodeId);
2711 }
2712 
SetUIExtensionUnobscured(bool obscured)2713 void RSSurfaceRenderNode::SetUIExtensionUnobscured(bool obscured)
2714 {
2715     UIExtensionUnobscured_ = obscured;
2716 }
2717 
GetUIExtensionUnobscured() const2718 bool RSSurfaceRenderNode::GetUIExtensionUnobscured() const
2719 {
2720     return UIExtensionUnobscured_;
2721 }
2722 
GetCacheSurfaceProcessedStatus() const2723 CacheProcessStatus RSSurfaceRenderNode::GetCacheSurfaceProcessedStatus() const
2724 {
2725     return cacheProcessStatus_.load();
2726 }
2727 
SetCacheSurfaceProcessedStatus(CacheProcessStatus cacheProcessStatus)2728 void RSSurfaceRenderNode::SetCacheSurfaceProcessedStatus(CacheProcessStatus cacheProcessStatus)
2729 {
2730     cacheProcessStatus_.store(cacheProcessStatus);
2731 }
2732 
HasOnlyOneRootNode() const2733 bool RSSurfaceRenderNode::HasOnlyOneRootNode() const
2734 {
2735     if (GetChildrenCount() != 1) {
2736         return false;
2737     }
2738 
2739     const auto child = GetFirstChild();
2740     if (!child || child->GetType() != RSRenderNodeType::ROOT_NODE || child->GetChildrenCount() > 0) {
2741         return false;
2742     }
2743 
2744     return true;
2745 }
2746 
GetNodeIsSingleFrameComposer() const2747 bool RSSurfaceRenderNode::GetNodeIsSingleFrameComposer() const
2748 {
2749     bool flag = false;
2750     if (RSSystemProperties::GetSingleFrameComposerCanvasNodeEnabled()) {
2751         auto idx = GetName().find("hwstylusfeature");
2752         if (idx != std::string::npos) {
2753             flag = true;
2754         }
2755     }
2756     return isNodeSingleFrameComposer_ || flag;
2757 }
2758 
QuerySubAssignable(bool isRotation)2759 bool RSSurfaceRenderNode::QuerySubAssignable(bool isRotation)
2760 {
2761     if (!IsFirstLevelNode()) {
2762         return false;
2763     }
2764     UpdateTransparentSurface();
2765     RS_TRACE_NAME_FMT("SubThreadAssignable node[%lld] hasTransparent: %d, childHasVisibleFilter: %d, hasFilter: %d, "
2766         "isRotation: %d", GetId(), hasTransparentSurface_, ChildHasVisibleFilter(), HasFilter(), isRotation);
2767     return !(hasTransparentSurface_ && ChildHasVisibleFilter()) && !HasFilter() && !isRotation;
2768 }
2769 
UpdateTransparentSurface()2770 void RSSurfaceRenderNode::UpdateTransparentSurface()
2771 {
2772     hasTransparentSurface_ = IsTransparent();
2773     if (IsLeashWindow() && !hasTransparentSurface_) {
2774         for (auto &child : *GetSortedChildren()) {
2775             auto childSurfaceNode = RSBaseRenderNode::ReinterpretCast<RSSurfaceRenderNode>(child);
2776             if (childSurfaceNode && childSurfaceNode->IsTransparent()) {
2777                 hasTransparentSurface_ = true;
2778                 break;
2779             }
2780         }
2781     }
2782 }
2783 
GetHasTransparentSurface() const2784 bool RSSurfaceRenderNode::GetHasTransparentSurface() const
2785 {
2786     return hasTransparentSurface_;
2787 }
2788 
GetHasSharedTransitionNode() const2789 bool RSSurfaceRenderNode::GetHasSharedTransitionNode() const
2790 {
2791     return hasSharedTransitionNode_;
2792 }
2793 
SetHasSharedTransitionNode(bool hasSharedTransitionNode)2794 void RSSurfaceRenderNode::SetHasSharedTransitionNode(bool hasSharedTransitionNode)
2795 {
2796     hasSharedTransitionNode_ = hasSharedTransitionNode;
2797 }
2798 
GetGravityTranslate(float imgWidth,float imgHeight)2799 Vector2f RSSurfaceRenderNode::GetGravityTranslate(float imgWidth, float imgHeight)
2800 {
2801     Gravity gravity = GetRenderProperties().GetFrameGravity();
2802     if (IsLeashWindow()) {
2803         for (auto child : *GetSortedChildren()) {
2804             auto childSurfaceNode = child ? child->ReinterpretCastTo<RSSurfaceRenderNode>() : nullptr;
2805             if (childSurfaceNode) {
2806                 gravity = childSurfaceNode->GetRenderProperties().GetFrameGravity();
2807                 break;
2808             }
2809         }
2810     }
2811 
2812     float boundsWidth = GetRenderProperties().GetBoundsWidth();
2813     float boundsHeight = GetRenderProperties().GetBoundsHeight();
2814     Drawing::Matrix gravityMatrix;
2815     RSPropertiesPainter::GetGravityMatrix(gravity, RectF {0.0f, 0.0f, boundsWidth, boundsHeight},
2816         imgWidth, imgHeight, gravityMatrix);
2817     return {gravityMatrix.Get(Drawing::Matrix::TRANS_X), gravityMatrix.Get(Drawing::Matrix::TRANS_Y)};
2818 }
2819 
UpdateUIFirstFrameGravity()2820 void RSSurfaceRenderNode::UpdateUIFirstFrameGravity()
2821 {
2822     Gravity gravity = GetRenderProperties().GetFrameGravity();
2823     if (IsLeashWindow()) {
2824         std::vector<Gravity> subGravity{};
2825         for (const auto& child : *GetSortedChildren()) {
2826             auto childSurfaceNode = child ? child->ReinterpretCastTo<RSSurfaceRenderNode>() : nullptr;
2827             if (childSurfaceNode) {
2828                 subGravity.push_back(childSurfaceNode->GetRenderProperties().GetFrameGravity());
2829             }
2830         }
2831         // planning: how to handle gravity while leashwindow has multiple subAppWindows is not clear yet
2832         if (subGravity.size() == 1) {
2833             gravity = subGravity.front();
2834         }
2835     }
2836     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2837     if (!stagingSurfaceParams) {
2838         RS_LOGE("RSSurfaceRenderNode::UpdateUIFirstFrameGravity staingSurfaceParams is null");
2839         return;
2840     }
2841     stagingSurfaceParams->SetUIFirstFrameGravity(gravity);
2842     AddToPendingSyncList();
2843 }
2844 
SetOcclusionVisible(bool visible)2845 void RSSurfaceRenderNode::SetOcclusionVisible(bool visible)
2846 {
2847     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2848     if (stagingSurfaceParams) {
2849         stagingSurfaceParams->SetOcclusionVisible(visible);
2850         AddToPendingSyncList();
2851     } else {
2852         RS_LOGE("RSSurfaceRenderNode::SetOcclusionVisible stagingSurfaceParams is null");
2853     }
2854 
2855     isOcclusionVisible_ = visible;
2856 }
2857 
UpdatePartialRenderParams()2858 void RSSurfaceRenderNode::UpdatePartialRenderParams()
2859 {
2860     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2861     if (surfaceParams == nullptr) {
2862         RS_LOGE("RSSurfaceRenderNode::UpdatePartialRenderParams surfaceParams is null");
2863         return;
2864     }
2865     if (IsMainWindowType()) {
2866         surfaceParams->SetVisibleRegionInVirtual(visibleRegionInVirtual_);
2867         surfaceParams->SetIsParentScaling(isParentScaling_);
2868     }
2869     surfaceParams->absDrawRect_ = GetAbsDrawRect();
2870     surfaceParams->SetOldDirtyInSurface(GetOldDirtyInSurface());
2871     surfaceParams->SetTransparentRegion(GetTransparentRegion());
2872     surfaceParams->SetOpaqueRegion(GetOpaqueRegion());
2873 }
2874 
UpdateExtendVisibleRegion(Occlusion::Region & region)2875 void RSSurfaceRenderNode::UpdateExtendVisibleRegion(Occlusion::Region& region)
2876 {
2877     extendVisibleRegion_.Reset();
2878     extendVisibleRegion_ = region.Or(visibleRegion_);
2879     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2880     if (surfaceParams == nullptr) {
2881         RS_LOGE("RSSurfaceRenderNode::UpdateExtendVisibleRegion surfaceParams is nullptr");
2882         return;
2883     }
2884     surfaceParams->SetVisibleRegion(extendVisibleRegion_);
2885 }
2886 
InitRenderParams()2887 void RSSurfaceRenderNode::InitRenderParams()
2888 {
2889     stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(GetId());
2890     DrawableV2::RSRenderNodeDrawableAdapter::OnGenerate(shared_from_this());
2891     if (renderDrawable_ == nullptr) {
2892         RS_LOGE("RSSurfaceRenderNode::InitRenderParams failed");
2893         return;
2894     }
2895 }
2896 
UpdateRenderParams()2897 void RSSurfaceRenderNode::UpdateRenderParams()
2898 {
2899     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2900     if (surfaceParams == nullptr) {
2901         RS_LOGE("RSSurfaceRenderNode::UpdateRenderParams surfaceParams is null");
2902         return;
2903     }
2904     auto& properties = GetRenderProperties();
2905     surfaceParams->alpha_ = properties.GetAlpha();
2906     surfaceParams->isSpherizeValid_ = properties.IsSpherizeValid();
2907     surfaceParams->isAttractionValid_ = properties.IsAttractionValid();
2908     surfaceParams->rsSurfaceNodeType_ = GetSurfaceNodeType();
2909     surfaceParams->backgroundColor_ = properties.GetBackgroundColor();
2910     surfaceParams->rrect_ = properties.GetRRect();
2911     surfaceParams->selfDrawingType_ = GetSelfDrawingNodeType();
2912     surfaceParams->needBilinearInterpolation_ = NeedBilinearInterpolation();
2913     surfaceParams->SetWindowInfo(IsMainWindowType(), IsLeashWindow(), IsAppWindow());
2914     surfaceParams->SetAncestorDisplayNode(ancestorDisplayNode_);
2915     surfaceParams->isSecurityLayer_ = isSecurityLayer_;
2916     surfaceParams->isSkipLayer_ = isSkipLayer_;
2917     surfaceParams->isSnapshotSkipLayer_ = isSnapshotSkipLayer_;
2918     surfaceParams->isProtectedLayer_ = isProtectedLayer_;
2919     surfaceParams->animateState_ = animateState_;
2920     surfaceParams->skipLayerIds_= skipLayerIds_;
2921     surfaceParams->snapshotSkipLayerIds_= snapshotSkipLayerIds_;
2922     surfaceParams->securityLayerIds_= securityLayerIds_;
2923     surfaceParams->protectedLayerIds_= protectedLayerIds_;
2924     surfaceParams->privacyContentLayerIds_ = privacyContentLayerIds_;
2925     surfaceParams->name_= name_;
2926     surfaceParams->positionZ_ = properties.GetPositionZ();
2927     surfaceParams->SetVisibleRegion(visibleRegion_);
2928     surfaceParams->SetOldDirtyInSurface(GetOldDirtyInSurface());
2929     surfaceParams->dstRect_ = dstRect_;
2930     surfaceParams->overDrawBufferNodeCornerRadius_ = GetOverDrawBufferNodeCornerRadius();
2931     surfaceParams->isGpuOverDrawBufferOptimizeNode_ = isGpuOverDrawBufferOptimizeNode_;
2932     surfaceParams->SetSkipDraw(isSkipDraw_);
2933     surfaceParams->SetHidePrivacyContent(needHidePrivacyContent_);
2934     surfaceParams->visibleFilterChild_ = GetVisibleFilterChild();
2935     surfaceParams->isTransparent_ = IsTransparent();
2936     surfaceParams->leashPersistentId_ = leashPersistentId_;
2937     surfaceParams->hasSubSurfaceNodes_ = HasSubSurfaceNodes();
2938     surfaceParams->allSubSurfaceNodeIds_ = GetAllSubSurfaceNodeIds();
2939     surfaceParams->SetNeedSync(true);
2940 
2941     RSRenderNode::UpdateRenderParams();
2942 }
2943 
SetNeedOffscreen(bool needOffscreen)2944 void RSSurfaceRenderNode::SetNeedOffscreen(bool needOffscreen)
2945 {
2946     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2947     if (stagingSurfaceParams) {
2948         stagingSurfaceParams->SetNeedOffscreen(needOffscreen);
2949         stagingSurfaceParams->SetFingerprint(GetFingerprint());
2950         AddToPendingSyncList();
2951     } else {
2952         RS_LOGE("RSSurfaceRenderNode::SetNeedOffscreen stagingSurfaceParams is null");
2953     }
2954 }
2955 
UpdateAncestorDisplayNodeInRenderParams()2956 void RSSurfaceRenderNode::UpdateAncestorDisplayNodeInRenderParams()
2957 {
2958     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2959     if (surfaceParams == nullptr) {
2960         RS_LOGE("RSSurfaceRenderNode::UpdateAncestorDisplayNodeInRenderParams surfaceParams is null");
2961         return;
2962     }
2963     surfaceParams->SetAncestorDisplayNode(ancestorDisplayNode_);
2964     surfaceParams->SetNeedSync(true);
2965 }
2966 
SetUifirstChildrenDirtyRectParam(RectI rect)2967 void RSSurfaceRenderNode::SetUifirstChildrenDirtyRectParam(RectI rect)
2968 {
2969     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2970     if (stagingSurfaceParams) {
2971         stagingSurfaceParams->SetUifirstChildrenDirtyRectParam(rect);
2972         AddToPendingSyncList();
2973     }
2974 }
2975 
SetLeashWindowVisibleRegionEmptyParam()2976 void RSSurfaceRenderNode::SetLeashWindowVisibleRegionEmptyParam()
2977 {
2978     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2979     if (!stagingSurfaceParams) {
2980         RS_LOGE("RSSurfaceRenderNode::SetLeashWindowVisibleRegionEmptyParam staingSurfaceParams is null");
2981         return;
2982     }
2983     stagingSurfaceParams->SetLeashWindowVisibleRegionEmptyParam(isLeashWindowVisibleRegionEmpty_);
2984 }
2985 
SetUifirstNodeEnableParam(MultiThreadCacheType b)2986 void RSSurfaceRenderNode::SetUifirstNodeEnableParam(MultiThreadCacheType b)
2987 {
2988     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2989     if (stagingSurfaceParams) {
2990         stagingSurfaceParams->SetUifirstNodeEnableParam(b);
2991         AddToPendingSyncList();
2992     }
2993 }
2994 
SetIsParentUifirstNodeEnableParam(bool b)2995 void RSSurfaceRenderNode::SetIsParentUifirstNodeEnableParam(bool b)
2996 {
2997     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
2998     if (stagingSurfaceParams) {
2999         stagingSurfaceParams->SetIsParentUifirstNodeEnableParam(b);
3000         AddToPendingSyncList();
3001     }
3002 }
3003 
SetUifirstUseStarting(NodeId id)3004 void RSSurfaceRenderNode::SetUifirstUseStarting(NodeId id)
3005 {
3006     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3007     if (stagingSurfaceParams) {
3008         stagingSurfaceParams->SetUifirstUseStarting(id);
3009         AddToPendingSyncList();
3010     }
3011 }
3012 
SetCornerRadiusInfoForDRM(const std::vector<float> & drmCornerRadiusInfo)3013 void RSSurfaceRenderNode::SetCornerRadiusInfoForDRM(const std::vector<float>& drmCornerRadiusInfo)
3014 {
3015     if (drmCornerRadiusInfo_ != drmCornerRadiusInfo) {
3016         auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3017         if (surfaceParams) {
3018             surfaceParams->SetCornerRadiusInfoForDRM(drmCornerRadiusInfo);
3019             drmCornerRadiusInfo_ = drmCornerRadiusInfo;
3020         }
3021         AddToPendingSyncList();
3022     }
3023 }
3024 
SetSkipDraw(bool skip)3025 void RSSurfaceRenderNode::SetSkipDraw(bool skip)
3026 {
3027     isSkipDraw_ = skip;
3028     SetDirty();
3029 }
3030 
GetSkipDraw() const3031 bool RSSurfaceRenderNode::GetSkipDraw() const
3032 {
3033     return isSkipDraw_;
3034 }
3035 
GetSecUIExtensionNodes()3036 const std::unordered_map<NodeId, NodeId>& RSSurfaceRenderNode::GetSecUIExtensionNodes()
3037 {
3038     return secUIExtensionNodes_;
3039 }
3040 
SetSdrNit(float sdrNit)3041 void RSSurfaceRenderNode::SetSdrNit(float sdrNit)
3042 {
3043     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3044     if (stagingSurfaceParams) {
3045         stagingSurfaceParams->SetSdrNit(sdrNit);
3046     }
3047     if (stagingRenderParams_->NeedSync()) {
3048         AddToPendingSyncList();
3049     }
3050 }
3051 
SetDisplayNit(float displayNit)3052 void RSSurfaceRenderNode::SetDisplayNit(float displayNit)
3053 {
3054     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3055     if (stagingSurfaceParams) {
3056         stagingSurfaceParams->SetDisplayNit(displayNit);
3057     }
3058     if (stagingRenderParams_->NeedSync()) {
3059         AddToPendingSyncList();
3060     }
3061 }
3062 
SetBrightnessRatio(float brightnessRatio)3063 void RSSurfaceRenderNode::SetBrightnessRatio(float brightnessRatio)
3064 {
3065     auto stagingSurfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3066     if (stagingSurfaceParams) {
3067         stagingSurfaceParams->SetBrightnessRatio(brightnessRatio);
3068     }
3069     if (stagingRenderParams_->NeedSync()) {
3070         AddToPendingSyncList();
3071     }
3072 }
3073 
SetAbilityState(RSSurfaceNodeAbilityState abilityState)3074 void RSSurfaceRenderNode::SetAbilityState(RSSurfaceNodeAbilityState abilityState)
3075 {
3076     if (abilityState_ == abilityState) {
3077         ROSEN_LOGD("RSSurfaceRenderNode::SetAbilityState, surfaceNodeId:[%{public}" PRIu64 "], "
3078             "ability state same with before: %{public}s",
3079             GetId(), abilityState == RSSurfaceNodeAbilityState::FOREGROUND ? "foreground" : "background");
3080         return;
3081     }
3082 
3083     abilityState_ = abilityState;
3084     ROSEN_LOGI("RSSurfaceRenderNode::SetAbilityState, surfaceNodeId:[%{public}" PRIu64 "] ability state: %{public}s",
3085         GetId(), abilityState_ == RSSurfaceNodeAbilityState::FOREGROUND ? "foreground" : "background");
3086 }
3087 
GetAbilityState() const3088 RSSurfaceNodeAbilityState RSSurfaceRenderNode::GetAbilityState() const
3089 {
3090     return abilityState_;
3091 }
3092 
SetApiCompatibleVersion(uint32_t apiCompatibleVersion)3093 void RSSurfaceRenderNode::SetApiCompatibleVersion(uint32_t apiCompatibleVersion)
3094 {
3095     if (stagingRenderParams_ == nullptr) {
3096         RS_LOGE("RSSurfaceRenderNode::SetApiCompatibleVersion: stagingRenderPrams is nullptr");
3097         return;
3098     }
3099     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3100     if (surfaceParams == nullptr) {
3101         RS_LOGE("RSSurfaceRenderNode::SetApiCompatibleVersion: surfaceParams is nullptr");
3102         return;
3103     }
3104     surfaceParams->SetApiCompatibleVersion(apiCompatibleVersion);
3105     AddToPendingSyncList();
3106 
3107     apiCompatibleVersion_ = apiCompatibleVersion;
3108 }
3109 
NeedUpdateDrawableBehindWindow()3110 bool RSSurfaceRenderNode::NeedUpdateDrawableBehindWindow()
3111 {
3112     bool needDrawBehindWindow = !childrenBlurBehindWindow_.empty();
3113     GetMutableRenderProperties().SetNeedDrawBehindWindow(needDrawBehindWindow);
3114     return needDrawBehindWindow != oldNeedDrawBehindWindow_;
3115 }
3116 
SetOldNeedDrawBehindWindow(bool val)3117 void RSSurfaceRenderNode::SetOldNeedDrawBehindWindow(bool val)
3118 {
3119     oldNeedDrawBehindWindow_ = val;
3120 }
3121 
NeedDrawBehindWindow() const3122 bool RSSurfaceRenderNode::NeedDrawBehindWindow() const
3123 {
3124     return !childrenBlurBehindWindow_.empty();
3125 }
3126 
AddChildBlurBehindWindow(NodeId id)3127 void RSSurfaceRenderNode::AddChildBlurBehindWindow(NodeId id)
3128 {
3129     childrenBlurBehindWindow_.emplace(id);
3130 }
3131 
RemoveChildBlurBehindWindow(NodeId id)3132 void RSSurfaceRenderNode::RemoveChildBlurBehindWindow(NodeId id)
3133 {
3134     childrenBlurBehindWindow_.erase(id);
3135 }
3136 
SetNeedCacheSurface(bool needCacheSurface)3137 void RSSurfaceRenderNode::SetNeedCacheSurface(bool needCacheSurface)
3138 {
3139     auto surfaceParams = static_cast<RSSurfaceRenderParams*>(stagingRenderParams_.get());
3140     if (surfaceParams) {
3141         surfaceParams->SetNeedCacheSurface(needCacheSurface);
3142     }
3143     AddToPendingSyncList();
3144 }
3145 } // namespace Rosen
3146 } // namespace OHOS
3147