/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HWUI_DISPLAY_LIST_H #define ANDROID_HWUI_DISPLAY_LIST_H #ifndef LOG_TAG #define LOG_TAG "OpenGLRenderer" #endif #include #include #include #include #include #include #include #include #include #include #include #include "Debug.h" #include "CanvasProperty.h" #include "DeferredDisplayList.h" #include "Matrix.h" #include "RenderProperties.h" class SkBitmap; class SkPaint; class SkPath; class SkRegion; namespace android { namespace uirenderer { class DeferredDisplayList; class DisplayListOp; class DisplayListCanvas; class OpenGLRenderer; class Rect; class Layer; class ClipRectOp; class SaveLayerOp; class SaveOp; class RestoreToCountOp; class DrawRenderNodeOp; /** * Holds data used in the playback a tree of DisplayLists. */ struct PlaybackStateStruct { protected: PlaybackStateStruct(OpenGLRenderer& renderer, int replayFlags, LinearAllocator* allocator) : mRenderer(renderer) , mReplayFlags(replayFlags) , mAllocator(allocator) {} public: OpenGLRenderer& mRenderer; const int mReplayFlags; // Allocator with the lifetime of a single frame. replay uses an Allocator owned by the struct, // while defer shares the DeferredDisplayList's Allocator // TODO: move this allocator to be owned by object with clear frame lifecycle LinearAllocator * const mAllocator; SkPath* allocPathForFrame() { return mRenderer.allocPathForFrame(); } }; struct DeferStateStruct : public PlaybackStateStruct { DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags) : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), mDeferredList(deferredList) {} DeferredDisplayList& mDeferredList; }; struct ReplayStateStruct : public PlaybackStateStruct { ReplayStateStruct(OpenGLRenderer& renderer, Rect& dirty, int replayFlags) : PlaybackStateStruct(renderer, replayFlags, &mReplayAllocator), mDirty(dirty) {} Rect& mDirty; LinearAllocator mReplayAllocator; }; /** * Data structure that holds the list of commands used in display list stream */ class DisplayListData { friend class DisplayListCanvas; public: struct Chunk { // range of included ops in DLD::displayListOps size_t beginOpIndex; size_t endOpIndex; // range of included children in DLD::mChildren size_t beginChildIndex; size_t endChildIndex; // whether children with non-zero Z in the chunk should be reordered bool reorderChildren; }; DisplayListData(); ~DisplayListData(); // pointers to all ops within display list, pointing into allocator data Vector displayListOps; // index of DisplayListOp restore, after which projected descendents should be drawn int projectionReceiveIndex; Vector bitmapResources; Vector pathResources; Vector patchResources; std::vector> paints; std::vector> regions; Vector functors; const Vector& getChunks() const { return chunks; } size_t addChild(DrawRenderNodeOp* childOp); const Vector& children() { return mChildren; } void ref(VirtualLightRefBase* prop) { mReferenceHolders.push(prop); } size_t getUsedSize() { return allocator.usedSize(); } bool isEmpty() { return !hasDrawOps; } private: Vector< sp > mReferenceHolders; // list of children display lists for quick, non-drawing traversal Vector mChildren; Vector chunks; // allocator into which all ops were allocated LinearAllocator allocator; bool hasDrawOps; void cleanupResources(); }; }; // namespace uirenderer }; // namespace android #endif // ANDROID_HWUI_OPENGL_RENDERER_H