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 private: 66 enum class RSPaintStyle { 67 FILL, 68 STROKE 69 }; 70 void DrawRectOnCanvas(const RectI& dirtyRect, const Drawing::ColorQuad color, RSPaintStyle fillType, float alpha, 71 int strokeWidth = 6); 72 void DrawDirtyRegion(); 73 // Update damageRegion based on buffer age, and then set it through egl api 74 #ifdef NEW_RENDER_CONTEXT 75 void UpdateDirtyAndSetEGLDamageRegion(std::shared_ptr<RSRenderSurface>& surface); 76 #else 77 void UpdateDirtyAndSetEGLDamageRegion(std::unique_ptr<RSSurfaceFrame>& surfaceFrame); 78 #endif 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 bool UpdateAnimatePropertyCacheSurface(RSRenderNode& node); 87 void ProcessShadowFirst(RSRenderNode& node); 88 89 std::shared_ptr<RSDirtyRegionManager> curDirtyManager_; 90 bool isRenderForced_ = false; 91 bool isEglSetDamageRegion_ = false; 92 bool isOpDropped_ = false; 93 DirtyRegionDebugType dfxDirtyType_ = DirtyRegionDebugType::DISABLED; 94 PartialRenderType partialRenderStatus_ = PartialRenderType::DISABLED; 95 RectI curDirtyRegion_ = RectI(); 96 bool dirtyFlag_ = false; 97 bool isIdle_ = true; 98 std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr; 99 uint32_t queueSize_ = 0; 100 uint64_t uiTimestamp_ = 0; 101 102 void ClipHoleForSurfaceNode(RSSurfaceRenderNode& node); 103 104 RectF surfaceNodeParentBoundsRect_; 105 std::vector<NodeId> childSurfaceNodeIds_; 106 Drawing::Matrix parentSurfaceNodeMatrix_; 107 std::optional<Drawing::RectI> effectRegion_ = std::nullopt; 108 std::vector<std::shared_ptr<Drawing::DrawCmdList>> drawCmdListVector_; 109 110 std::map<NodeId, std::function<void(float, float, float, float)>> surfaceCallbacks_; 111 112 static void SendCommandFromRT(std::unique_ptr<RSCommand>& command, NodeId nodeId, FollowType followType); 113 static bool IsValidRootRenderNode(RSRootRenderNode& node); 114 private: 115 void ProcessTextureSurfaceRenderNode(RSSurfaceRenderNode& node); 116 void ProcessOtherSurfaceRenderNode(RSSurfaceRenderNode& node); 117 }; 118 } // namespace Rosen 119 } // namespace OHOS 120 121 #endif // RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H 122