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