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