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