1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H 17 #define RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H 18 19 #include <memory> 20 #include <map> 21 #include <set> 22 23 #include "pipeline/rs_dirty_region_manager.h" 24 #include "pipeline/rs_paint_filter_canvas.h" 25 #include "transaction/rs_transaction_proxy.h" 26 #include "visitor/rs_node_visitor.h" 27 28 #include "draw/brush.h" 29 #include "draw/color.h" 30 #include "draw/pen.h" 31 32 namespace OHOS { 33 namespace Rosen { 34 class RSDirtyRegionManager; 35 class RSProperties; 36 class RSRenderNode; 37 38 class RSRenderThreadVisitor : public RSNodeVisitor { 39 public: 40 RSRenderThreadVisitor(); 41 virtual ~RSRenderThreadVisitor(); 42 43 void PrepareChildren(RSRenderNode& node) override; 44 void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override; PrepareScreenRenderNode(RSScreenRenderNode & node)45 void PrepareScreenRenderNode(RSScreenRenderNode& node) override {} PrepareLogicalDisplayRenderNode(RSLogicalDisplayRenderNode & node)46 void PrepareLogicalDisplayRenderNode(RSLogicalDisplayRenderNode& node) override {} PrepareProxyRenderNode(RSProxyRenderNode & node)47 void PrepareProxyRenderNode(RSProxyRenderNode& node) override {} 48 void PrepareRootRenderNode(RSRootRenderNode& node) override; 49 void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override; 50 void PrepareEffectRenderNode(RSEffectRenderNode& node) override; 51 52 void ProcessChildren(RSRenderNode& node) override; 53 void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override; ProcessScreenRenderNode(RSScreenRenderNode & node)54 void ProcessScreenRenderNode(RSScreenRenderNode& node) override {} ProcessLogicalDisplayRenderNode(RSLogicalDisplayRenderNode & node)55 void ProcessLogicalDisplayRenderNode(RSLogicalDisplayRenderNode& node) override {} 56 void ProcessProxyRenderNode(RSProxyRenderNode& node) override; 57 void ProcessRootRenderNode(RSRootRenderNode& node) override; 58 void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override; 59 void ProcessEffectRenderNode(RSEffectRenderNode& node) override; 60 61 void AddSurfaceChangedCallBack(uint64_t id, 62 const std::function<void(float, float, float, float)>& callback) override; 63 void RemoveSurfaceChangedCallBack(uint64_t id) override; 64 65 // Partial render status and renderForce flag should be updated by rt thread 66 void SetPartialRenderStatus(PartialRenderType status, bool isRenderForced); 67 68 NodeId GetActiveSubtreeRootId(); 69 private: 70 enum class RSPaintStyle { 71 FILL, 72 STROKE 73 }; 74 void DrawRectOnCanvas(const RectI& dirtyRect, const Drawing::ColorQuad color, RSPaintStyle fillType, float alpha, 75 int strokeWidth = 6); 76 void DrawDirtyRegion(); 77 // Update damageRegion based on buffer age, and then set it through egl api 78 void UpdateDirtyAndSetEGLDamageRegion(std::unique_ptr<RSSurfaceFrame>& surfaceFrame); 79 // Reset and update children node's info like outOfParent and isRemoveChild 80 void ResetAndPrepareChildrenNode(RSRenderNode& node, std::shared_ptr<RSBaseRenderNode> nodeParent); 81 void ProcessSurfaceViewInRT(RSSurfaceRenderNode& node); 82 Drawing::Matrix CacRotationFromTransformType(GraphicTransformType transform, RectF& bounds); 83 GraphicTransformType GetFlipTransform(GraphicTransformType transform); 84 void FlipMatrix(GraphicTransformType transform, Drawing::Matrix& matrix, const RectF& bounds); 85 86 void ProcessShadowFirst(RSRenderNode& node); 87 88 std::shared_ptr<RSDirtyRegionManager> curDirtyManager_; 89 bool isRenderForced_ = false; 90 bool isEglSetDamageRegion_ = false; 91 bool isOpDropped_ = false; 92 DirtyRegionDebugType dfxDirtyType_ = DirtyRegionDebugType::DISABLED; 93 PartialRenderType partialRenderStatus_ = PartialRenderType::DISABLED; 94 RectI curDirtyRegion_ = RectI(); 95 bool dirtyFlag_ = false; 96 bool isIdle_ = true; 97 std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr; 98 uint32_t queueSize_ = 0; 99 uint64_t uiTimestamp_ = 0; 100 NodeId activeSubtreeRootId_ = INVALID_NODEID; 101 102 void ClipHoleForSurfaceNode(RSSurfaceRenderNode& node); 103 104 RectF surfaceNodeParentBoundsRect_; 105 std::vector<NodeId> childSurfaceNodeIds_; 106 Drawing::Matrix parentSurfaceNodeMatrix_; 107 // record parent surfaceNode to update absMatrix 108 std::shared_ptr<RSRenderNode> parentSurfaceNode_ = nullptr; 109 std::optional<Drawing::RectI> effectRegion_ = std::nullopt; 110 std::vector<std::shared_ptr<Drawing::DrawCmdList>> drawCmdListVector_; 111 112 std::map<NodeId, std::function<void(float, float, float, float)>> surfaceCallbacks_; 113 114 static void SendCommandFromRT(std::unique_ptr<RSCommand>& command, NodeId nodeId, FollowType followType); 115 static bool IsValidRootRenderNode(RSRootRenderNode& node); 116 private: 117 void ProcessTextureSurfaceRenderNode(RSSurfaceRenderNode& node); 118 void ProcessOtherSurfaceRenderNode(RSSurfaceRenderNode& node); 119 }; 120 } // namespace Rosen 121 } // namespace OHOS 122 123 #endif // RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H 124