• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 #ifndef ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H
18 #define ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H
19 
20 #include <utils/Errors.h>
21 #include <utils/Vector.h>
22 
23 #include "Matrix.h"
24 #include "Rect.h"
25 #include "utils/TinyHashMap.h"
26 
27 class SkBitmap;
28 
29 namespace android {
30 namespace uirenderer {
31 
32 class ClipOp;
33 class DrawOp;
34 class SaveOp;
35 class SaveLayerOp;
36 class StateOp;
37 class OpenGLRenderer;
38 
39 class Batch;
40 class DrawBatch;
41 class MergingDrawBatch;
42 
43 typedef void* mergeid_t;
44 
45 class DeferredDisplayList {
46 public:
DeferredDisplayList()47     DeferredDisplayList() { clear(); }
~DeferredDisplayList()48     ~DeferredDisplayList() { clear(); }
49 
50     enum OpBatchId {
51         kOpBatch_None = 0, // Don't batch
52         kOpBatch_Bitmap,
53         kOpBatch_Patch,
54         kOpBatch_AlphaVertices,
55         kOpBatch_Vertices,
56         kOpBatch_AlphaMaskTexture,
57         kOpBatch_Text,
58         kOpBatch_ColorText,
59 
60         kOpBatch_Count, // Add other batch ids before this
61     };
62 
isEmpty()63     bool isEmpty() { return mBatches.isEmpty(); }
64 
65     /**
66      * Plays back all of the draw ops recorded into batches to the renderer.
67      * Adjusts the state of the renderer as necessary, and restores it when complete
68      */
69     status_t flush(OpenGLRenderer& renderer, Rect& dirty);
70 
71     void addClip(OpenGLRenderer& renderer, ClipOp* op);
72     void addSaveLayer(OpenGLRenderer& renderer, SaveLayerOp* op, int newSaveCount);
73     void addSave(OpenGLRenderer& renderer, SaveOp* op, int newSaveCount);
74     void addRestoreToCount(OpenGLRenderer& renderer, StateOp* op, int newSaveCount);
75 
76     /**
77      * Add a draw op into the DeferredDisplayList, reordering as needed (for performance) if
78      * disallowReorder is false, respecting draw order when overlaps occur
79      */
80     void addDrawOp(OpenGLRenderer& renderer, DrawOp* op);
81 
82 private:
83     /**
84      * Resets the batching back-pointers, creating a barrier in the operation stream so that no ops
85      * added in the future will be inserted into a batch that already exist.
86      */
87     void resetBatchingState();
88 
89     void clear();
90 
91     void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op);
92     void storeRestoreToCountBarrier(OpenGLRenderer& renderer, StateOp* op, int newSaveCount);
93 
recordingComplexClip()94     bool recordingComplexClip() const { return mComplexClipStackStart >= 0; }
95 
96     int getStateOpDeferFlags() const;
97     int getDrawOpDeferFlags() const;
98 
99     /**
100      * At defer time, stores the *defer time* savecount of save/saveLayer ops that were deferred, so
101      * that when an associated restoreToCount is deferred, it can be recorded as a
102      * RestoreToCountBatch
103      */
104     Vector<int> mSaveStack;
105     int mComplexClipStackStart;
106 
107     Vector<Batch*> mBatches;
108 
109     // Maps batch ids to the most recent *non-merging* batch of that id
110     Batch* mBatchLookup[kOpBatch_Count];
111 
112     // Points to the index after the most recent barrier
113     int mEarliestBatchIndex;
114 
115     /**
116      * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen
117      * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not
118      * collide, which avoids the need to resolve mergeid collisions.
119      */
120     TinyHashMap<mergeid_t, DrawBatch*> mMergingBatches[kOpBatch_Count];
121 };
122 
123 }; // namespace uirenderer
124 }; // namespace android
125 
126 #endif // ANDROID_HWUI_DEFERRED_DISPLAY_LIST_H
127