• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <set>
21 
22 #include "pipeline/rs_dirty_region_manager.h"
23 #include "pipeline/rs_paint_filter_canvas.h"
24 #include "transaction/rs_transaction_proxy.h"
25 #include "visitor/rs_node_visitor.h"
26 
27 namespace OHOS {
28 namespace Rosen {
29 class RSDirtyRegionManager;
30 class RSProperties;
31 class RSRenderNode;
32 
33 class RSRenderThreadVisitor : public RSNodeVisitor {
34 public:
35     RSRenderThreadVisitor();
36     virtual ~RSRenderThreadVisitor();
37 
38     void PrepareBaseRenderNode(RSBaseRenderNode& node) override;
39     void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override;
PrepareDisplayRenderNode(RSDisplayRenderNode & node)40     void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {}
PrepareProxyRenderNode(RSProxyRenderNode & node)41     void PrepareProxyRenderNode(RSProxyRenderNode& node) override {}
42     void PrepareRootRenderNode(RSRootRenderNode& node) override;
43     void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override;
44 
45     void ProcessBaseRenderNode(RSBaseRenderNode& node) override;
46     void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override;
ProcessDisplayRenderNode(RSDisplayRenderNode & node)47     void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override {}
48     void ProcessProxyRenderNode(RSProxyRenderNode& node) override;
49     void ProcessRootRenderNode(RSRootRenderNode& node) override;
50     void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override;
51 
52     // Partial render status and renderForce flag should be updated by rt thread
53     void SetPartialRenderStatus(PartialRenderType status, bool isRenderForced);
54 private:
55     void DrawRectOnCanvas(const RectI& dirtyRect, const SkColor color, const SkPaint::Style fillType, float alpha);
56     void DrawDirtyRegion();
57     // Update damageRegion based on buffer age, and then set it through egl api
58     void UpdateDirtyAndSetEGLDamageRegion(std::unique_ptr<RSSurfaceFrame>& surfaceFrame);
59 
60     std::shared_ptr<RSDirtyRegionManager> curDirtyManager_;
61     bool isRenderForced_ = false;
62     bool isEglSetDamageRegion_ = false;
63     bool isOpDropped_ = false;
64     PartialRenderType partialRenderStatus_ = PartialRenderType::DISABLED;
65     RectI curDirtyRegion_ = RectI();
66     bool dirtyFlag_ = false;
67     bool isIdle_ = true;
68     std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr;
69     uint32_t queueSize_ = 0;
70     uint64_t uiTimestamp_ = 0;
71 
72     void ClipHoleForSurfaceNode(RSSurfaceRenderNode& node);
73 
74     std::vector<NodeId> childSurfaceNodeIds_;
75     SkMatrix parentSurfaceNodeMatrix_;
76     bool needUpdateSurfaceNode_ = false;
77 
78     static void SendCommandFromRT(std::unique_ptr<RSCommand>& command, NodeId nodeId, FollowType followType);
79     static bool IsValidRootRenderNode(RSRootRenderNode& node);
80 };
81 } // namespace Rosen
82 } // namespace OHOS
83 
84 #endif // RENDER_SERVICE_CLIENT_CORE_RENDER_RS_RENDER_THREAD_VISITOR_H
85