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_DISPLAY_LIST_H 18 #define ANDROID_HWUI_DISPLAY_LIST_H 19 20 #include <SkCamera.h> 21 #include <SkMatrix.h> 22 23 #include <private/hwui/DrawGlInfo.h> 24 25 #include <utils/KeyedVector.h> 26 #include <utils/LinearAllocator.h> 27 #include <utils/RefBase.h> 28 #include <utils/SortedVector.h> 29 #include <utils/String8.h> 30 31 #include <cutils/compiler.h> 32 33 #include <androidfw/ResourceTypes.h> 34 35 #include "Debug.h" 36 #include "CanvasProperty.h" 37 #include "DeferredDisplayList.h" 38 #include "GlFunctorLifecycleListener.h" 39 #include "Matrix.h" 40 #include "RenderProperties.h" 41 42 #include <vector> 43 44 class SkBitmap; 45 class SkPaint; 46 class SkPath; 47 class SkRegion; 48 49 namespace android { 50 namespace uirenderer { 51 52 class DeferredDisplayList; 53 class DisplayListOp; 54 class DisplayListCanvas; 55 class OpenGLRenderer; 56 class Rect; 57 class Layer; 58 59 #if HWUI_NEW_OPS 60 struct RecordedOp; 61 struct RenderNodeOp; 62 63 typedef RecordedOp BaseOpType; 64 typedef RenderNodeOp NodeOpType; 65 #else 66 class DrawRenderNodeOp; 67 68 typedef DisplayListOp BaseOpType; 69 typedef DrawRenderNodeOp NodeOpType; 70 #endif 71 72 namespace VectorDrawable { 73 class Tree; 74 }; 75 typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot; 76 77 /** 78 * Holds data used in the playback a tree of DisplayLists. 79 */ 80 struct PlaybackStateStruct { 81 protected: 82 PlaybackStateStruct(OpenGLRenderer& renderer, int replayFlags, LinearAllocator* allocator) 83 : mRenderer(renderer) 84 , mReplayFlags(replayFlags) 85 , mAllocator(allocator) {} 86 87 public: 88 OpenGLRenderer& mRenderer; 89 const int mReplayFlags; 90 91 // Allocator with the lifetime of a single frame. replay uses an Allocator owned by the struct, 92 // while defer shares the DeferredDisplayList's Allocator 93 // TODO: move this allocator to be owned by object with clear frame lifecycle 94 LinearAllocator * const mAllocator; 95 96 SkPath* allocPathForFrame() { 97 return mRenderer.allocPathForFrame(); 98 } 99 }; 100 101 struct DeferStateStruct : public PlaybackStateStruct { 102 DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags) 103 : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), 104 mDeferredList(deferredList) {} 105 106 DeferredDisplayList& mDeferredList; 107 }; 108 109 struct ReplayStateStruct : public PlaybackStateStruct { 110 ReplayStateStruct(OpenGLRenderer& renderer, Rect& dirty, int replayFlags) 111 : PlaybackStateStruct(renderer, replayFlags, &mReplayAllocator), 112 mDirty(dirty) {} 113 114 Rect& mDirty; 115 LinearAllocator mReplayAllocator; 116 }; 117 118 struct FunctorContainer { 119 Functor* functor; 120 GlFunctorLifecycleListener* listener; 121 }; 122 123 /** 124 * Data structure that holds the list of commands used in display list stream 125 */ 126 class DisplayList { 127 friend class DisplayListCanvas; 128 friend class RecordingCanvas; 129 public: 130 struct Chunk { 131 // range of included ops in DisplayList::ops() 132 size_t beginOpIndex; 133 size_t endOpIndex; 134 135 // range of included children in DisplayList::children() 136 size_t beginChildIndex; 137 size_t endChildIndex; 138 139 // whether children with non-zero Z in the chunk should be reordered 140 bool reorderChildren; 141 #if HWUI_NEW_OPS 142 const ClipBase* reorderClip; 143 #endif 144 }; 145 146 DisplayList(); 147 ~DisplayList(); 148 149 // index of DisplayListOp restore, after which projected descendants should be drawn 150 int projectionReceiveIndex; 151 152 const LsaVector<Chunk>& getChunks() const { return chunks; } 153 const LsaVector<BaseOpType*>& getOps() const { return ops; } 154 155 const LsaVector<NodeOpType*>& getChildren() const { return children; } 156 157 const LsaVector<const SkBitmap*>& getBitmapResources() const { return bitmapResources; } 158 const LsaVector<FunctorContainer>& getFunctors() const { return functors; } 159 const LsaVector<VectorDrawableRoot*>& getVectorDrawables() { return vectorDrawables; } 160 161 size_t addChild(NodeOpType* childOp); 162 163 164 void ref(VirtualLightRefBase* prop) { 165 referenceHolders.push_back(prop); 166 } 167 168 size_t getUsedSize() { 169 return allocator.usedSize(); 170 } 171 bool isEmpty() { 172 #if HWUI_NEW_OPS 173 return ops.empty(); 174 #else 175 return !hasDrawOps; 176 #endif 177 } 178 179 private: 180 // allocator into which all ops and LsaVector arrays allocated 181 LinearAllocator allocator; 182 LinearStdAllocator<void*> stdAllocator; 183 184 LsaVector<Chunk> chunks; 185 LsaVector<BaseOpType*> ops; 186 187 // list of Ops referring to RenderNode children for quick, non-drawing traversal 188 LsaVector<NodeOpType*> children; 189 190 // Resources - Skia objects + 9 patches referred to by this DisplayList 191 LsaVector<const SkBitmap*> bitmapResources; 192 LsaVector<const SkPath*> pathResources; 193 LsaVector<const Res_png_9patch*> patchResources; 194 LsaVector<std::unique_ptr<const SkPaint>> paints; 195 LsaVector<std::unique_ptr<const SkRegion>> regions; 196 LsaVector< sp<VirtualLightRefBase> > referenceHolders; 197 198 // List of functors 199 LsaVector<FunctorContainer> functors; 200 201 // List of VectorDrawables that need to be notified of pushStaging. Note that this list gets nothing 202 // but a callback during sync DisplayList, unlike the list of functors defined above, which 203 // gets special treatment exclusive for webview. 204 LsaVector<VectorDrawableRoot*> vectorDrawables; 205 206 bool hasDrawOps; // only used if !HWUI_NEW_OPS 207 208 void cleanupResources(); 209 }; 210 211 }; // namespace uirenderer 212 }; // namespace android 213 214 #endif // ANDROID_HWUI_OPENGL_RENDERER_H 215