RenderNode.h revision d0a0b2a3140bfb1819a116413ce9d81886697a07
1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2014 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#ifndef RENDERNODE_H
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#define RENDERNODE_H
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#ifndef LOG_TAG
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    #define LOG_TAG "OpenGLRenderer"
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#endif
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <SkCamera.h>
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <SkMatrix.h>
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <private/hwui/DrawGlInfo.h>
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/KeyedVector.h>
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/LinearAllocator.h>
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/RefBase.h>
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/SortedVector.h>
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/String8.h>
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/Vector.h>
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <cutils/compiler.h>
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <androidfw/ResourceTypes.h>
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "Debug.h"
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "Matrix.h"
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "DeferredDisplayList.h"
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "DisplayList.h"
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "RenderProperties.h"
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkBitmap;
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkPaint;
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkPath;
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkRegion;
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksnamespace android {
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksnamespace uirenderer {
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DeferredDisplayList;
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DisplayListOp;
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DisplayListRenderer;
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass OpenGLRenderer;
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass Rect;
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass Layer;
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkiaShader;
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass ClipRectOp;
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SaveLayerOp;
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SaveOp;
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass RestoreToCountOp;
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DrawDisplayListOp;
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/**
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Primary class for storing recorded canvas commands, as well as per-View/ViewGroup display properties.
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Recording of canvas commands is somewhat similar to SkPicture, except the canvas-recording
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * functionality is split between DisplayListRenderer (which manages the recording), DisplayListData
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * (which holds the actual data), and DisplayList (which holds properties and performs playback onto
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * a renderer).
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Note that DisplayListData is swapped out from beneath an individual DisplayList when a view's
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * recorded stream of canvas operations is refreshed. The DisplayList (and its properties) stay
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * attached.
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass RenderNode {
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic:
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API RenderNode();
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API ~RenderNode();
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // See flags defined in DisplayList.java
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    enum ReplayFlag {
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        kReplayFlag_ClipChildren = 0x1
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    };
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API static void destroyDisplayListDeferred(RenderNode* displayList);
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API static void outputLogBuffer(int fd);
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API void setData(DisplayListData* newData);
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void computeOrdering();
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void defer(DeferStateStruct& deferStruct, const int level);
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void replay(ReplayStateStruct& replayStruct, const int level);
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    ANDROID_API void output(uint32_t level = 1);
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    bool isRenderable() const {
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mDisplayListData && mDisplayListData->hasDrawOps;
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void setName(const char* name) {
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (name) {
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            char* lastPeriod = strrchr(name, '.');
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (lastPeriod) {
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mName.setTo(lastPeriod + 1);
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mName.setTo(name);
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    const RenderProperties& properties() {
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mProperties;
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    const RenderProperties& stagingProperties() {
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mStagingProperties;
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    RenderProperties& mutateStagingProperties() {
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mNeedsPropertiesSync = true;
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mStagingProperties;
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    bool isProjectionReceiver() {
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return properties().isProjectionReceiver();
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    int getWidth() {
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return properties().getWidth();
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    int getHeight() {
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return properties().getHeight();
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void updateProperties();
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksprivate:
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    typedef key_value_pair_t<float, DrawDisplayListOp*> ZDrawDisplayListOpPair;
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    static size_t findNonNegativeIndex(const Vector<ZDrawDisplayListOpPair>& nodes) {
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        for (size_t i = 0; i < nodes.size(); i++) {
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (nodes[i].key >= 0.0f) return i;
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return nodes.size();
150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    enum ChildrenSelectMode {
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        kNegativeZChildren,
154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        kPositiveZChildren
155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    };
156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void applyViewPropertyTransforms(mat4& matrix, bool true3dTransform = false);
158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void computeOrderingImpl(DrawDisplayListOp* opState,
160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Vector<DrawDisplayListOp*>* compositedChildrenOfProjectionSurface,
161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            const mat4* transformFromProjectionSurface);
162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    template <class T>
164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    inline void setViewProperties(OpenGLRenderer& renderer, T& handler, const int level);
165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    void buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslatedNodes);
167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    template <class T>
169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    inline void iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes,
170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler);
171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    template <class T>
173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    inline void iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, const int level);
174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
175    template <class T>
176    inline void iterate(OpenGLRenderer& renderer, T& handler, const int level);
177
178    class TextContainer {
179    public:
180        size_t length() const {
181            return mByteLength;
182        }
183
184        const char* text() const {
185            return (const char*) mText;
186        }
187
188        size_t mByteLength;
189        const char* mText;
190    };
191
192    String8 mName;
193    bool mDestroyed; // used for debugging crash, TODO: remove once invalid state crash fixed
194
195    bool mNeedsPropertiesSync;
196    RenderProperties mProperties;
197    RenderProperties mStagingProperties;
198
199    DisplayListData* mDisplayListData;
200
201    /**
202     * Draw time state - these properties are only set and used during rendering
203     */
204
205    // for projection surfaces, contains a list of all children items
206    Vector<DrawDisplayListOp*> mProjectedNodes;
207}; // class RenderNode
208
209} /* namespace uirenderer */
210} /* namespace android */
211
212#endif /* RENDERNODE_H */
213