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; PrepareDisplayRenderNode(RSDisplayRenderNode & node)45 void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {} PrepareProxyRenderNode(RSProxyRenderNode & node)46 void PrepareProxyRenderNode(RSProxyRenderNode& node) override {} 47 void PrepareRootRenderNode(RSRootRenderNode& node) override; 48 void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override; 49 void PrepareEffectRenderNode(RSEffectRenderNode& node) override; 50 51 void ProcessChildren(RSRenderNode& node) override; 52 void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override; ProcessDisplayRenderNode(RSDisplayRenderNode & node)53 void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override {} 54 void ProcessProxyRenderNode(RSProxyRenderNode& node) override; 55 void ProcessRootRenderNode(RSRootRenderNode& node) override; 56 void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override; 57 void ProcessEffectRenderNode(RSEffectRenderNode& node) override; 58 59 void AddSurfaceChangedCallBack(uint64_t id, 60 const std::function<void(float, float, float, float)>& callback) override; 61 void RemoveSurfaceChangedCallBack(uint64_t id) override; 62 63 // Partial render status and renderForce flag should be updated by rt thread 64 void SetPartialRenderStatus(PartialRenderType status, bool isRenderForced); 65 66 NodeId GetActiveSubtreeRootId(); 67 private: 68 enum class RSPaintStyle { 69 FILL, 70 STROKE 71 }; 72 void DrawRectOnCanvas(const RectI& dirtyRect, const Drawing::ColorQuad color, RSPaintStyle fillType, float alpha, 73 int strokeWidth = 6); 74 void DrawDirtyRegion(); 75 // Update damageRegion based on buffer age, and then set it through egl api 76 #ifdef NEW_RENDER_CONTEXT 77 void UpdateDirtyAndSetEGLDamageRegion(std::shared_ptr<RSRenderSurface>& surface); 78 #else 79 void UpdateDirtyAndSetEGLDamageRegion(std::unique_ptr<RSSurfaceFrame>& surfaceFrame); 80 #endif 81 // Reset and update children node's info like outOfParent and isRemoveChild 82 void ResetAndPrepareChildrenNode(RSRenderNode& node, std::shared_ptr<RSBaseRenderNode> nodeParent); 83 void ProcessSurfaceViewInRT(RSSurfaceRenderNode& node); 84 Drawing::Matrix CacRotationFromTransformType(GraphicTransformType transform, RectF& bounds); 85 GraphicTransformType GetFlipTransform(GraphicTransformType transform); 86 void FlipMatrix(GraphicTransformType transform, Drawing::Matrix& matrix, const RectF& bounds); 87 88 bool UpdateAnimatePropertyCacheSurface(RSRenderNode& node); 89 void ProcessShadowFirst(RSRenderNode& node); 90 91 std::shared_ptr<RSDirtyRegionManager> curDirtyManager_; 92 bool isRenderForced_ = false; 93 bool isEglSetDamageRegion_ = false; 94 bool isOpDropped_ = false; 95 DirtyRegionDebugType dfxDirtyType_ = DirtyRegionDebugType::DISABLED; 96 PartialRenderType partialRenderStatus_ = PartialRenderType::DISABLED; 97 RectI curDirtyRegion_ = RectI(); 98 bool dirtyFlag_ = false; 99 bool isIdle_ = true; 100 std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr; 101 uint32_t queueSize_ = 0; 102 uint64_t uiTimestamp_ = 0; 103 NodeId activeSubtreeRootId_ = INVALID_NODEID; 104 105 void ClipHoleForSurfaceNode(RSSurfaceRenderNode& node); 106 107 RectF surfaceNodeParentBoundsRect_; 108 std::vector<NodeId> childSurfaceNodeIds_; 109 Drawing::Matrix parentSurfaceNodeMatrix_; 110 std::optional<Drawing::RectI> effectRegion_ = std::nullopt; 111 std::vector<std::shared_ptr<Drawing::DrawCmdList>> drawCmdListVector_; 112 113 std::map<NodeId, std::function<void(float, float, float, float)>> surfaceCallbacks_; 114 115 static void SendCommandFromRT(std::unique_ptr<RSCommand>& command, NodeId nodeId, FollowType followType); 116 static bool IsValidRootRenderNode(RSRootRenderNode& node); 117 private: 118 void ProcessTextureSurfaceRenderNode(RSSurfaceRenderNode& node); 119 void ProcessOtherSurfaceRenderNode(RSSurfaceRenderNode& node); 120 }; 121 } // namespace Rosen 122 } // namespace OHOS 123 124 #endif // RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H 125