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