RenderNode.h revision 34bf49e4de4c1994b5d9c19166606bc9b7ad1b9c
1113e0824d6bddf4376240681f9cf6a2deded9498John Reck/*
2113e0824d6bddf4376240681f9cf6a2deded9498John Reck * Copyright (C) 2014 The Android Open Source Project
3113e0824d6bddf4376240681f9cf6a2deded9498John Reck *
4113e0824d6bddf4376240681f9cf6a2deded9498John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5113e0824d6bddf4376240681f9cf6a2deded9498John Reck * you may not use this file except in compliance with the License.
6113e0824d6bddf4376240681f9cf6a2deded9498John Reck * You may obtain a copy of the License at
7113e0824d6bddf4376240681f9cf6a2deded9498John Reck *
8113e0824d6bddf4376240681f9cf6a2deded9498John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9113e0824d6bddf4376240681f9cf6a2deded9498John Reck *
10113e0824d6bddf4376240681f9cf6a2deded9498John Reck * Unless required by applicable law or agreed to in writing, software
11113e0824d6bddf4376240681f9cf6a2deded9498John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12113e0824d6bddf4376240681f9cf6a2deded9498John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13113e0824d6bddf4376240681f9cf6a2deded9498John Reck * See the License for the specific language governing permissions and
14113e0824d6bddf4376240681f9cf6a2deded9498John Reck * limitations under the License.
15113e0824d6bddf4376240681f9cf6a2deded9498John Reck */
16113e0824d6bddf4376240681f9cf6a2deded9498John Reck#ifndef RENDERNODE_H
17113e0824d6bddf4376240681f9cf6a2deded9498John Reck#define RENDERNODE_H
18113e0824d6bddf4376240681f9cf6a2deded9498John Reck
19113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <SkCamera.h>
20113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <SkMatrix.h>
21113e0824d6bddf4376240681f9cf6a2deded9498John Reck
22113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <utils/LinearAllocator.h>
23113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <utils/RefBase.h>
24113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <utils/String8.h>
25113e0824d6bddf4376240681f9cf6a2deded9498John Reck
26113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <cutils/compiler.h>
27113e0824d6bddf4376240681f9cf6a2deded9498John Reck
28113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <androidfw/ResourceTypes.h>
29113e0824d6bddf4376240681f9cf6a2deded9498John Reck
3068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck#include "AnimatorManager.h"
31113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "Debug.h"
32113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "DisplayList.h"
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
34113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderProperties.h"
35113e0824d6bddf4376240681f9cf6a2deded9498John Reck
36272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector>
37272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck
38113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SkBitmap;
39113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SkPaint;
40113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SkPath;
41113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SkRegion;
42113e0824d6bddf4376240681f9cf6a2deded9498John Reck
43113e0824d6bddf4376240681f9cf6a2deded9498John Recknamespace android {
44113e0824d6bddf4376240681f9cf6a2deded9498John Recknamespace uirenderer {
45113e0824d6bddf4376240681f9cf6a2deded9498John Reck
46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass CanvasState;
47db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikclass DisplayListCanvas;
480b7e8245db728d127ada698be63d78b33fc6e4daChris Craikclass DisplayListOp;
49113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass OpenGLRenderer;
50113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass Rect;
51113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SkiaShader;
52113e0824d6bddf4376240681f9cf6a2deded9498John Reck
530b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#if HWUI_NEW_OPS
54f158b49c888f722194afe5a80539a2b020c130bcChris Craikclass FrameBuilder;
550b7e8245db728d127ada698be63d78b33fc6e4daChris Craikclass OffscreenBuffer;
568d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craikstruct RenderNodeOp;
570b7e8245db728d127ada698be63d78b33fc6e4daChris Craiktypedef OffscreenBuffer layer_t;
588d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craiktypedef RenderNodeOp renderNodeOp_t;
590b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#else
600b7e8245db728d127ada698be63d78b33fc6e4daChris Craikclass Layer;
610b7e8245db728d127ada698be63d78b33fc6e4daChris Craiktypedef Layer layer_t;
628d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craiktypedef DrawRenderNodeOp renderNodeOp_t;
630b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#endif
640b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
65113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass ClipRectOp;
668d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craikclass DrawRenderNodeOp;
67113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SaveLayerOp;
68113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass SaveOp;
69113e0824d6bddf4376240681f9cf6a2deded9498John Reckclass RestoreToCountOp;
702dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass TreeInfo;
7144b49f070aafe8ad44efae87341121cce49ff11cJohn Reckclass TreeObserver;
72113e0824d6bddf4376240681f9cf6a2deded9498John Reck
73e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Recknamespace proto {
74e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckclass RenderNode;
75e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck}
76e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck
77113e0824d6bddf4376240681f9cf6a2deded9498John Reck/**
78113e0824d6bddf4376240681f9cf6a2deded9498John Reck * Primary class for storing recorded canvas commands, as well as per-View/ViewGroup display properties.
79113e0824d6bddf4376240681f9cf6a2deded9498John Reck *
80113e0824d6bddf4376240681f9cf6a2deded9498John Reck * Recording of canvas commands is somewhat similar to SkPicture, except the canvas-recording
81003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik * functionality is split between DisplayListCanvas (which manages the recording), DisplayList
82113e0824d6bddf4376240681f9cf6a2deded9498John Reck * (which holds the actual data), and DisplayList (which holds properties and performs playback onto
83113e0824d6bddf4376240681f9cf6a2deded9498John Reck * a renderer).
84113e0824d6bddf4376240681f9cf6a2deded9498John Reck *
85003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik * Note that DisplayList is swapped out from beneath an individual RenderNode when a view's
86003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik * recorded stream of canvas operations is refreshed. The RenderNode (and its properties) stay
87113e0824d6bddf4376240681f9cf6a2deded9498John Reck * attached.
88113e0824d6bddf4376240681f9cf6a2deded9498John Reck */
89087bc0c14bdccf7c258dce0cdef46a69a839b427John Reckclass RenderNode : public VirtualLightRefBase {
90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikfriend class TestUtils; // allow TestUtils to access syncDisplayList / syncProperties
91f158b49c888f722194afe5a80539a2b020c130bcChris Craikfriend class FrameBuilder;
92113e0824d6bddf4376240681f9cf6a2deded9498John Reckpublic:
93ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    enum DirtyPropertyMask {
94ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        GENERIC         = 1 << 1,
95ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        TRANSLATION_X   = 1 << 2,
96ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        TRANSLATION_Y   = 1 << 3,
97ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        TRANSLATION_Z   = 1 << 4,
98ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        SCALE_X         = 1 << 5,
99ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        SCALE_Y         = 1 << 6,
100ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        ROTATION        = 1 << 7,
101ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        ROTATION_X      = 1 << 8,
102ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        ROTATION_Y      = 1 << 9,
103ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        X               = 1 << 10,
104ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        Y               = 1 << 11,
105ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        Z               = 1 << 12,
106ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        ALPHA           = 1 << 13,
107a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck        DISPLAY_LIST    = 1 << 14,
108ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    };
109ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
110113e0824d6bddf4376240681f9cf6a2deded9498John Reck    ANDROID_API RenderNode();
111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ANDROID_API virtual ~RenderNode();
112113e0824d6bddf4376240681f9cf6a2deded9498John Reck
113113e0824d6bddf4376240681f9cf6a2deded9498John Reck    // See flags defined in DisplayList.java
114113e0824d6bddf4376240681f9cf6a2deded9498John Reck    enum ReplayFlag {
115113e0824d6bddf4376240681f9cf6a2deded9498John Reck        kReplayFlag_ClipChildren = 0x1
116113e0824d6bddf4376240681f9cf6a2deded9498John Reck    };
117113e0824d6bddf4376240681f9cf6a2deded9498John Reck
118443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck    void debugDumpLayers(const char* prefix);
119113e0824d6bddf4376240681f9cf6a2deded9498John Reck
12051f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck    ANDROID_API void setStagingDisplayList(DisplayList* newData, TreeObserver* observer);
121113e0824d6bddf4376240681f9cf6a2deded9498John Reck
122113e0824d6bddf4376240681f9cf6a2deded9498John Reck    void computeOrdering();
123b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik
12480d4902196899d1325cd9f52c06ae0174cf9bd4cChris Craik    void defer(DeferStateStruct& deferStruct, const int level);
12580d4902196899d1325cd9f52c06ae0174cf9bd4cChris Craik    void replay(ReplayStateStruct& replayStruct, const int level);
126113e0824d6bddf4376240681f9cf6a2deded9498John Reck
12791eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#if HWUI_NEW_OPS
12891eff22b5d7f8fe551bae01331948858ce932a96Chris Craik    ANDROID_API void output(uint32_t level = 0, const char* label = "Root");
12991eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#else
130113e0824d6bddf4376240681f9cf6a2deded9498John Reck    ANDROID_API void output(uint32_t level = 1);
13191eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#endif
132fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    ANDROID_API int getDebugSize();
133e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck    void copyTo(proto::RenderNode* node);
134113e0824d6bddf4376240681f9cf6a2deded9498John Reck
135113e0824d6bddf4376240681f9cf6a2deded9498John Reck    bool isRenderable() const {
136003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        return mDisplayList && !mDisplayList->isEmpty();
137113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
138113e0824d6bddf4376240681f9cf6a2deded9498John Reck
139a447d29c65fb811cd184775a3476101a1cede929John Reck    bool hasProjectionReceiver() const {
140003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        return mDisplayList && mDisplayList->projectionReceiveIndex >= 0;
141a447d29c65fb811cd184775a3476101a1cede929John Reck    }
142a447d29c65fb811cd184775a3476101a1cede929John Reck
143defb7f37fe67ef2389666f7adc5da1260df87017Chris Craik    const char* getName() const {
144defb7f37fe67ef2389666f7adc5da1260df87017Chris Craik        return mName.string();
145defb7f37fe67ef2389666f7adc5da1260df87017Chris Craik    }
146defb7f37fe67ef2389666f7adc5da1260df87017Chris Craik
147113e0824d6bddf4376240681f9cf6a2deded9498John Reck    void setName(const char* name) {
148113e0824d6bddf4376240681f9cf6a2deded9498John Reck        if (name) {
149113e0824d6bddf4376240681f9cf6a2deded9498John Reck            char* lastPeriod = strrchr(name, '.');
150113e0824d6bddf4376240681f9cf6a2deded9498John Reck            if (lastPeriod) {
151113e0824d6bddf4376240681f9cf6a2deded9498John Reck                mName.setTo(lastPeriod + 1);
152113e0824d6bddf4376240681f9cf6a2deded9498John Reck            } else {
153113e0824d6bddf4376240681f9cf6a2deded9498John Reck                mName.setTo(name);
154113e0824d6bddf4376240681f9cf6a2deded9498John Reck            }
155113e0824d6bddf4376240681f9cf6a2deded9498John Reck        }
156113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
157113e0824d6bddf4376240681f9cf6a2deded9498John Reck
15844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    VirtualLightRefBase* getUserContext() const {
15944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        return mUserContext.get();
16044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    }
16144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck
16244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    void setUserContext(VirtualLightRefBase* context) {
16344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        mUserContext = context;
16444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    }
16544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck
166ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    bool isPropertyFieldDirty(DirtyPropertyMask field) const {
167ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        return mDirtyPropertyFields & field;
168ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    }
169ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
170ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    void setPropertyFieldsDirty(uint32_t fields) {
171ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        mDirtyPropertyFields |= fields;
172ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    }
173ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
174e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    const RenderProperties& properties() const {
175113e0824d6bddf4376240681f9cf6a2deded9498John Reck        return mProperties;
176113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
177113e0824d6bddf4376240681f9cf6a2deded9498John Reck
17852244fff29042926e21fa897ef5ab11148e35299John Reck    RenderProperties& animatorProperties() {
17952244fff29042926e21fa897ef5ab11148e35299John Reck        return mProperties;
18052244fff29042926e21fa897ef5ab11148e35299John Reck    }
18152244fff29042926e21fa897ef5ab11148e35299John Reck
182d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const RenderProperties& stagingProperties() {
183d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mStagingProperties;
184d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
185d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
186d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties& mutateStagingProperties() {
187d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mStagingProperties;
188d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
189d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
19076caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik    int getWidth() const {
191113e0824d6bddf4376240681f9cf6a2deded9498John Reck        return properties().getWidth();
192113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
193113e0824d6bddf4376240681f9cf6a2deded9498John Reck
19476caecf421b42e9b8294a65f62ff2d90b55a337bChris Craik    int getHeight() const {
195113e0824d6bddf4376240681f9cf6a2deded9498John Reck        return properties().getHeight();
196113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
197113e0824d6bddf4376240681f9cf6a2deded9498John Reck
198e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ANDROID_API virtual void prepareTree(TreeInfo& info);
19934bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    void destroyHardwareResources(TreeObserver* observer, TreeInfo* info = nullptr);
200e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
201e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // UI thread only!
20268bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    ANDROID_API void addAnimator(const sp<BaseRenderNodeAnimator>& animator);
2038b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    void removeAnimator(const sp<BaseRenderNodeAnimator>& animator);
2048b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu
2058b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    // This can only happen during pushStaging()
2068b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    void onAnimatorTargetChanged(BaseRenderNodeAnimator* animator) {
2078b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu        mAnimatorManager.onAnimatorTargetChanged(animator);
2088b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    }
209668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
210119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    AnimatorManager& animators() { return mAnimatorManager; }
211119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
21269e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik    void applyViewPropertyTransforms(mat4& matrix, bool true3dTransform = false) const;
21369e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik
214b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    bool nothingToDraw() const {
215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        const Outline& outline = properties().getOutline();
216003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        return mDisplayList == nullptr
217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik                || properties().getAlpha() <= 0
218b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik                || (outline.getShouldClip() && outline.isEmpty())
219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik                || properties().getScaleX() == 0
220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik                || properties().getScaleY() == 0;
221b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    }
222b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
2230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const DisplayList* getDisplayList() const {
2240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        return mDisplayList;
225b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    }
2260b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#if HWUI_NEW_OPS
2270b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    OffscreenBuffer* getLayer() const { return mLayer; }
2280b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    OffscreenBuffer** getLayerHandle() { return &mLayer; } // ugh...
2290b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#endif
230b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
23134bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    // Note: The position callbacks are relying on the listener using
23234bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    // the frameNumber to appropriately batch/synchronize these transactions.
23334bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    // There is no other filtering/batching to ensure that only the "final"
23434bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    // state called once per frame.
235f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    class ANDROID_API PositionListener {
236f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    public:
237f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        virtual ~PositionListener() {}
23834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck        // Called when the RenderNode's position changes
239f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        virtual void onPositionUpdated(RenderNode& node, const TreeInfo& info) = 0;
24034bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck        // Called when the RenderNode no longer has a position. As in, it's
24134bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck        // no longer being drawn.
24234bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck        // Note, tree info might be null
24334bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck        virtual void onPositionLost(RenderNode& node, const TreeInfo* info) = 0;
244f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    };
245f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
246f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    // Note this is not thread safe, this needs to be called
247f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    // before the RenderNode is used for drawing.
248f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    // RenderNode takes ownership of the pointer
249f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    ANDROID_API void setPositionListener(PositionListener* listener) {
250f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        mPositionListener.reset(listener);
251f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    }
252f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
25344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    // This is only modified in MODE_FULL, so it can be safely accessed
25444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    // on the UI thread.
25544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    ANDROID_API bool hasParents() {
25644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        return mParentCount;
25744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    }
25844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck
259113e0824d6bddf4376240681f9cf6a2deded9498John Reckprivate:
260a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    typedef key_value_pair_t<float, DrawRenderNodeOp*> ZDrawRenderNodeOpPair;
261113e0824d6bddf4376240681f9cf6a2deded9498John Reck
262272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck    static size_t findNonNegativeIndex(const std::vector<ZDrawRenderNodeOpPair>& nodes) {
263113e0824d6bddf4376240681f9cf6a2deded9498John Reck        for (size_t i = 0; i < nodes.size(); i++) {
264113e0824d6bddf4376240681f9cf6a2deded9498John Reck            if (nodes[i].key >= 0.0f) return i;
265113e0824d6bddf4376240681f9cf6a2deded9498John Reck        }
266113e0824d6bddf4376240681f9cf6a2deded9498John Reck        return nodes.size();
267113e0824d6bddf4376240681f9cf6a2deded9498John Reck    }
268113e0824d6bddf4376240681f9cf6a2deded9498John Reck
269b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    enum class ChildrenSelectMode {
270b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        NegativeZChildren,
271b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        PositiveZChildren
272113e0824d6bddf4376240681f9cf6a2deded9498John Reck    };
273113e0824d6bddf4376240681f9cf6a2deded9498John Reck
2748d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    void computeOrderingImpl(renderNodeOp_t* opState,
2758d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik            std::vector<renderNodeOp_t*>* compositedChildrenOfProjectionSurface,
276113e0824d6bddf4376240681f9cf6a2deded9498John Reck            const mat4* transformFromProjectionSurface);
277113e0824d6bddf4376240681f9cf6a2deded9498John Reck
278113e0824d6bddf4376240681f9cf6a2deded9498John Reck    template <class T>
279b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    inline void setViewProperties(OpenGLRenderer& renderer, T& handler);
280113e0824d6bddf4376240681f9cf6a2deded9498John Reck
281003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    void buildZSortedChildList(const DisplayList::Chunk& chunk,
282272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck            std::vector<ZDrawRenderNodeOpPair>& zTranslatedNodes);
283113e0824d6bddf4376240681f9cf6a2deded9498John Reck
284b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    template<class T>
285b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    inline void issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler);
286b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik
287113e0824d6bddf4376240681f9cf6a2deded9498John Reck    template <class T>
288c3e75f9d54b3629b3fd27afafa2e07bd07dad9b3Chris Craik    inline void issueOperationsOf3dChildren(ChildrenSelectMode mode,
289272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck            const Matrix4& initialTransform, const std::vector<ZDrawRenderNodeOpPair>& zTranslatedNodes,
29080d4902196899d1325cd9f52c06ae0174cf9bd4cChris Craik            OpenGLRenderer& renderer, T& handler);
291113e0824d6bddf4376240681f9cf6a2deded9498John Reck
292113e0824d6bddf4376240681f9cf6a2deded9498John Reck    template <class T>
293b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    inline void issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T& handler);
294113e0824d6bddf4376240681f9cf6a2deded9498John Reck
295b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    /**
296b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik     * Issue the RenderNode's operations into a handler, recursing for subtrees through
297a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik     * DrawRenderNodeOp's defer() or replay() methods
298b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik     */
299113e0824d6bddf4376240681f9cf6a2deded9498John Reck    template <class T>
300b265e2ca50b6ceb2fd2987ef1f7d063b1bde19aeChris Craik    inline void issueOperations(OpenGLRenderer& renderer, T& handler);
301113e0824d6bddf4376240681f9cf6a2deded9498John Reck
302113e0824d6bddf4376240681f9cf6a2deded9498John Reck    class TextContainer {
303113e0824d6bddf4376240681f9cf6a2deded9498John Reck    public:
304113e0824d6bddf4376240681f9cf6a2deded9498John Reck        size_t length() const {
305113e0824d6bddf4376240681f9cf6a2deded9498John Reck            return mByteLength;
306113e0824d6bddf4376240681f9cf6a2deded9498John Reck        }
307113e0824d6bddf4376240681f9cf6a2deded9498John Reck
308113e0824d6bddf4376240681f9cf6a2deded9498John Reck        const char* text() const {
309113e0824d6bddf4376240681f9cf6a2deded9498John Reck            return (const char*) mText;
310113e0824d6bddf4376240681f9cf6a2deded9498John Reck        }
311113e0824d6bddf4376240681f9cf6a2deded9498John Reck
312113e0824d6bddf4376240681f9cf6a2deded9498John Reck        size_t mByteLength;
313113e0824d6bddf4376240681f9cf6a2deded9498John Reck        const char* mText;
314113e0824d6bddf4376240681f9cf6a2deded9498John Reck    };
315113e0824d6bddf4376240681f9cf6a2deded9498John Reck
316b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
317b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    void syncProperties();
31834bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    void syncDisplayList(TreeInfo* info);
319b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
320a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik    void prepareTreeImpl(TreeInfo& info, bool functorsNeedLayer);
32125fbb3fa1138675379102a44405852555cefccbdJohn Reck    void pushStagingPropertiesChanges(TreeInfo& info);
32225fbb3fa1138675379102a44405852555cefccbdJohn Reck    void pushStagingDisplayListChanges(TreeInfo& info);
323003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    void prepareSubTree(TreeInfo& info, bool functorsNeedLayer, DisplayList* subtree);
3240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#if !HWUI_NEW_OPS
32525fbb3fa1138675379102a44405852555cefccbdJohn Reck    void applyLayerPropertiesToLayer(TreeInfo& info);
3260b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#endif
327a7c2ea20c43ab797bef5801530687e22e83def8fJohn Reck    void prepareLayer(TreeInfo& info, uint32_t dirtyMask);
32825fbb3fa1138675379102a44405852555cefccbdJohn Reck    void pushLayerUpdate(TreeInfo& info);
32934bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    void deleteDisplayList(TreeObserver* observer, TreeInfo* info = nullptr);
3300a97330b98dd633b58dcfff405d94476c89e867dJohn Reck    void damageSelf(TreeInfo& info);
331dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck
332dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    void incParentRefCount() { mParentCount++; }
33334bf49e4de4c1994b5d9c19166606bc9b7ad1b9cJohn Reck    void decParentRefCount(TreeObserver* observer, TreeInfo* info = nullptr);
3348de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck
335113e0824d6bddf4376240681f9cf6a2deded9498John Reck    String8 mName;
33644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    sp<VirtualLightRefBase> mUserContext;
337113e0824d6bddf4376240681f9cf6a2deded9498John Reck
338ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    uint32_t mDirtyPropertyFields;
339113e0824d6bddf4376240681f9cf6a2deded9498John Reck    RenderProperties mProperties;
340d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties mStagingProperties;
341d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
342003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    bool mNeedsDisplayListSync;
343003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    // WARNING: Do not delete this directly, you must go through deleteDisplayList()!
344003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    DisplayList* mDisplayList;
345003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    DisplayList* mStagingDisplayList;
346113e0824d6bddf4376240681f9cf6a2deded9498John Reck
34768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    friend class AnimatorManager;
34868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    AnimatorManager mAnimatorManager;
349e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
35025fbb3fa1138675379102a44405852555cefccbdJohn Reck    // Owned by RT. Lifecycle is managed by prepareTree(), with the exception
35125fbb3fa1138675379102a44405852555cefccbdJohn Reck    // being in ~RenderNode() which may happen on any thread.
3520b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    layer_t* mLayer = nullptr;
35325fbb3fa1138675379102a44405852555cefccbdJohn Reck
354113e0824d6bddf4376240681f9cf6a2deded9498John Reck    /**
355113e0824d6bddf4376240681f9cf6a2deded9498John Reck     * Draw time state - these properties are only set and used during rendering
356113e0824d6bddf4376240681f9cf6a2deded9498John Reck     */
357113e0824d6bddf4376240681f9cf6a2deded9498John Reck
358113e0824d6bddf4376240681f9cf6a2deded9498John Reck    // for projection surfaces, contains a list of all children items
3598d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    std::vector<renderNodeOp_t*> mProjectedNodes;
360dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck
361dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    // How many references our parent(s) have to us. Typically this should alternate
362dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    // between 2 and 1 (when a staging push happens we inc first then dec)
363dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    // When this hits 0 we are no longer in the tree, so any hardware resources
364dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    // (specifically Layers) should be released.
365dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    // This is *NOT* thread-safe, and should therefore only be tracking
366003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    // mDisplayList, not mStagingDisplayList.
367dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck    uint32_t mParentCount;
368f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
369f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    std::unique_ptr<PositionListener> mPositionListener;
370113e0824d6bddf4376240681f9cf6a2deded9498John Reck}; // class RenderNode
371113e0824d6bddf4376240681f9cf6a2deded9498John Reck
372113e0824d6bddf4376240681f9cf6a2deded9498John Reck} /* namespace uirenderer */
373113e0824d6bddf4376240681f9cf6a2deded9498John Reck} /* namespace android */
374113e0824d6bddf4376240681f9cf6a2deded9498John Reck
375113e0824d6bddf4376240681f9cf6a2deded9498John Reck#endif /* RENDERNODE_H */
376