• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include "ClipArea.h"
20 #include "Rect.h"
21 #include "utils/Macros.h"
22 
23 #include <vector>
24 #include <unordered_map>
25 
26 struct SkRect;
27 
28 namespace android {
29 namespace uirenderer {
30 
31 class BakedOpState;
32 struct BeginLayerOp;
33 class BatchBase;
34 class LinearAllocator;
35 struct MergedBakedOpList;
36 class MergingOpBatch;
37 class OffscreenBuffer;
38 class OpBatch;
39 class RenderNode;
40 
41 typedef int batchid_t;
42 typedef const void* mergeid_t;
43 
44 namespace OpBatchType {
45     enum {
46         Bitmap,
47         MergedPatch,
48         AlphaVertices,
49         Vertices,
50         AlphaMaskTexture,
51         Text,
52         ColorText,
53         Shadow,
54         TextureLayer,
55         Functor,
56         CopyToLayer,
57         CopyFromLayer,
58 
59         Count // must be last
60     };
61 }
62 
63 typedef void (*BakedOpReceiver)(void*, const BakedOpState&);
64 typedef void (*MergedOpReceiver)(void*, const MergedBakedOpList& opList);
65 
66 /**
67  * Stores the deferred render operations and state used to compute ordering
68  * for a single FBO/layer.
69  */
70 class LayerBuilder {
71 // Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip
72 PREVENT_COPY_AND_ASSIGN(LayerBuilder);
73 public:
74     // Create LayerBuilder for Fbo0
LayerBuilder(uint32_t width,uint32_t height,const Rect & repaintRect)75     LayerBuilder(uint32_t width, uint32_t height, const Rect& repaintRect)
76             : LayerBuilder(width, height, repaintRect, nullptr, nullptr) {};
77 
78     // Create LayerBuilder for an offscreen layer, where beginLayerOp is present for a
79     // saveLayer, renderNode is present for a HW layer.
80     LayerBuilder(uint32_t width, uint32_t height,
81             const Rect& repaintRect, const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
82 
83     // iterate back toward target to see if anything drawn since should overlap the new op
84     // if no target, merging ops still iterate to find similar batch to insert after
85     void locateInsertIndex(int batchId, const Rect& clippedBounds,
86             BatchBase** targetBatch, size_t* insertBatchIndex) const;
87 
88     void deferUnmergeableOp(LinearAllocator& allocator, BakedOpState* op, batchid_t batchId);
89 
90     // insertion point of a new batch, will hopefully be immediately after similar batch
91     // (generally, should be similar shader)
92     void deferMergeableOp(LinearAllocator& allocator,
93             BakedOpState* op, batchid_t batchId, mergeid_t mergeId);
94 
95     void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers, MergedOpReceiver*) const;
96 
97     void deferLayerClear(const Rect& dstRect);
98 
empty()99     bool empty() const {
100         return mBatches.empty();
101     }
102 
103     void clear();
104 
105     void dump() const;
106 
107     const uint32_t width;
108     const uint32_t height;
109     const Rect repaintRect;
110     const ClipRect repaintClip;
111     OffscreenBuffer* offscreenBuffer;
112     const BeginLayerOp* beginLayerOp;
113     const RenderNode* renderNode;
114 
115     // list of deferred CopyFromLayer ops, to be deferred upon encountering EndUnclippedLayerOps
116     std::vector<BakedOpState*> activeUnclippedSaveLayers;
117 private:
118     void onDeferOp(LinearAllocator& allocator, const BakedOpState* bakedState);
119     void flushLayerClears(LinearAllocator& allocator);
120 
121     std::vector<BatchBase*> mBatches;
122 
123     /**
124      * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen
125      * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not
126      * collide, which avoids the need to resolve mergeid collisions.
127      */
128     std::unordered_map<mergeid_t, MergingOpBatch*> mMergingBatchLookup[OpBatchType::Count];
129 
130     // Maps batch ids to the most recent *non-merging* batch of that id
131     OpBatch* mBatchLookup[OpBatchType::Count] = { nullptr };
132 
133     std::vector<Rect> mClearRects;
134 };
135 
136 }; // namespace uirenderer
137 }; // namespace android
138