DisplayList.h revision 10ed692118552a01ff97b095295852b631e51bee
1c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik/* 2c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Copyright (C) 2013 The Android Open Source Project 3c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 4c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * you may not use this file except in compliance with the License. 6c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * You may obtain a copy of the License at 7c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 8c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 9c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * 10c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * Unless required by applicable law or agreed to in writing, software 11c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * See the License for the specific language governing permissions and 14c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik * limitations under the License. 15c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik */ 16c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 17c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#ifndef ANDROID_HWUI_DISPLAY_LIST_H 18c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#define ANDROID_HWUI_DISPLAY_LIST_H 19c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 20c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <SkCamera.h> 21c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <SkMatrix.h> 22c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 23c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <private/hwui/DrawGlInfo.h> 24c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 25c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/KeyedVector.h> 26c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/LinearAllocator.h> 27c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/RefBase.h> 28c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <utils/SortedVector.h> 29ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik#include <utils/String8.h> 30c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 31ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik#include <cutils/compiler.h> 32ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 33ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik#include <androidfw/ResourceTypes.h> 34c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 35c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "Debug.h" 36c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "CanvasProperty.h" 37c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h" 38c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "Matrix.h" 39c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "RenderProperties.h" 40c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 41c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include <vector> 42c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 43c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass SkBitmap; 44c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass SkPaint; 45c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass SkPath; 46c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass SkRegion; 47c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 48c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace android { 49c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiknamespace uirenderer { 50c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 51c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList; 52c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DisplayListOp; 53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DisplayListCanvas; 54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass OpenGLRenderer; 55c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass Rect; 56c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass Layer; 57c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 58c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#if HWUI_NEW_OPS 59c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct RecordedOp; 60c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct RenderNodeOp; 61ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 62ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craiktypedef RecordedOp BaseOpType; 63ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craiktypedef RenderNodeOp NodeOpType; 64ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik#else 65ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass DrawRenderNodeOp; 66ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 67c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiktypedef DisplayListOp BaseOpType; 68c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craiktypedef DrawRenderNodeOp NodeOpType; 69c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#endif 70c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 71c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik/** 72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik * Holds data used in the playback a tree of DisplayLists. 73c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik */ 74c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct PlaybackStateStruct { 75ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikprotected: 76ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik PlaybackStateStruct(OpenGLRenderer& renderer, int replayFlags, LinearAllocator* allocator) 77ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik : mRenderer(renderer) 78ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik , mReplayFlags(replayFlags) 79ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik , mAllocator(allocator) {} 80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 81c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikpublic: 82c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik OpenGLRenderer& mRenderer; 83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik const int mReplayFlags; 84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 85ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik // Allocator with the lifetime of a single frame. replay uses an Allocator owned by the struct, 86ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik // while defer shares the DeferredDisplayList's Allocator 87ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik // TODO: move this allocator to be owned by object with clear frame lifecycle 88ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik LinearAllocator * const mAllocator; 89ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 90ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik SkPath* allocPathForFrame() { 91ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik return mRenderer.allocPathForFrame(); 92ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik } 93ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik}; 94ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 95ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstruct DeferStateStruct : public PlaybackStateStruct { 96ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags) 97c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), 98c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik mDeferredList(deferredList) {} 99c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 100c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik DeferredDisplayList& mDeferredList; 101c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; 102c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 103c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct ReplayStateStruct : public PlaybackStateStruct { 104c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik ReplayStateStruct(OpenGLRenderer& renderer, Rect& dirty, int replayFlags) 105c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik : PlaybackStateStruct(renderer, replayFlags, &mReplayAllocator), 106 mDirty(dirty) {} 107 108 Rect& mDirty; 109 LinearAllocator mReplayAllocator; 110}; 111 112/** 113 * Data structure that holds the list of commands used in display list stream 114 */ 115class DisplayListData { 116 friend class DisplayListCanvas; 117 friend class RecordingCanvas; 118public: 119 struct Chunk { 120 // range of included ops in DLD::displayListOps 121 size_t beginOpIndex; 122 size_t endOpIndex; 123 124 // range of included children in DLD::mChildren 125 size_t beginChildIndex; 126 size_t endChildIndex; 127 128 // whether children with non-zero Z in the chunk should be reordered 129 bool reorderChildren; 130 }; 131 132 DisplayListData(); 133 ~DisplayListData(); 134 135 // pointers to all ops within display list, pointing into allocator data 136 std::vector<DisplayListOp*> displayListOps; 137 138 // index of DisplayListOp restore, after which projected descendents should be drawn 139 int projectionReceiveIndex; 140 141 std::vector<const SkBitmap*> bitmapResources; 142 std::vector<const SkPath*> pathResources; 143 std::vector<const Res_png_9patch*> patchResources; 144 145 std::vector<std::unique_ptr<const SkPaint>> paints; 146 std::vector<std::unique_ptr<const SkRegion>> regions; 147 Vector<Functor*> functors; 148 149 const std::vector<Chunk>& getChunks() const { 150 return chunks; 151 } 152 const std::vector<BaseOpType*>& getOps() const { 153 return ops; 154 } 155 156 size_t addChild(NodeOpType* childOp); 157 const std::vector<NodeOpType*>& children() { return mChildren; } 158 159 void ref(VirtualLightRefBase* prop) { 160 mReferenceHolders.push_back(prop); 161 } 162 163 size_t getUsedSize() { 164 return allocator.usedSize(); 165 } 166 bool isEmpty() { 167 return !hasDrawOps; 168 } 169 170private: 171 std::vector<BaseOpType*> ops; 172 173 std::vector< sp<VirtualLightRefBase> > mReferenceHolders; 174 175 // list of children display lists for quick, non-drawing traversal 176 std::vector<NodeOpType*> mChildren; 177 178 std::vector<Chunk> chunks; 179 180 // allocator into which all ops were allocated 181 LinearAllocator allocator; 182 bool hasDrawOps; 183 184 void cleanupResources(); 185}; 186 187}; // namespace uirenderer 188}; // namespace android 189 190#endif // ANDROID_HWUI_OPENGL_RENDERER_H 191