TreeInfo.h revision 9eb9f6f8cbbbd87d45da8071aa54cb066a797723
1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/* 2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2014 The Android Open Source Project 3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License. 6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at 7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software 11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and 14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License. 15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */ 16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#ifndef TREEINFO_H 17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define TREEINFO_H 18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 19c25e506f7fc08790c0532f927f31310a2ca778b7John Reck#include <string> 20c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <utils/Timers.h> 22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 23a447d29c65fb811cd184775a3476101a1cede929John Reck#include "DamageAccumulator.h" 24e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include "utils/Macros.h" 25e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android { 27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer { 28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 29ff941dcd815021bb20d6504eb486acb1e50592c3John Reckclass BaseRenderNodeAnimator; 3052244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListener; 3125fbb3fa1138675379102a44405852555cefccbdJohn Reckclass OpenGLRenderer; 323b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState; 33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 3452244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationHook { 35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 36ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) = 0; 37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 3852244fff29042926e21fa897ef5ab11148e35299John Reck ~AnimationHook() {} 39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 41c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass ErrorHandler { 42c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic: 43c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void onError(const std::string& message) = 0; 44c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprotected: 45c25e506f7fc08790c0532f927f31310a2ca778b7John Reck ~ErrorHandler() {} 46c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}; 47c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 48e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck// This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN 49e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckclass TreeInfo { 50e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck PREVENT_COPY_AND_ASSIGN(TreeInfo); 51e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic: 52e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck enum TraversalMode { 53e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // The full monty - sync, push, run animators, etc... Used by DrawFrameTask 54e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // May only be used if both the UI thread and RT thread are blocked on the 55e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // prepare 56e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck MODE_FULL, 57e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // Run only what can be done safely on RT thread. Currently this only means 58e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // animators, but potentially things like SurfaceTexture updates 59e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // could be handled by this as well if there are no listeners 60e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck MODE_RT_ONLY, 61e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck }; 62e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 633b20251a355c88193c439f928a84ae69483fb488John Reck explicit TreeInfo(TraversalMode mode, RenderState& renderState) 64e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck : mode(mode) 65e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck , frameTimeMs(0) 66f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck , animationHook(NULL) 67e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck , prepareTextures(mode == MODE_FULL) 689eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck , runAnimations(true) 6969e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik , damageAccumulator(NULL) 703b20251a355c88193c439f928a84ae69483fb488John Reck , renderState(renderState) 713b20251a355c88193c439f928a84ae69483fb488John Reck , renderer(NULL) 723b20251a355c88193c439f928a84ae69483fb488John Reck , errorHandler(NULL) 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {} 74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 7568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck explicit TreeInfo(TraversalMode mode, const TreeInfo& clone) 7668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck : mode(mode) 7768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , frameTimeMs(clone.frameTimeMs) 7868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , animationHook(clone.animationHook) 7968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , prepareTextures(mode == MODE_FULL) 809eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck , runAnimations(clone.runAnimations) 8168bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , damageAccumulator(clone.damageAccumulator) 8268bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , renderState(clone.renderState) 8368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , renderer(clone.renderer) 8468bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck , errorHandler(clone.errorHandler) 8568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck {} 8668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck 87e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck const TraversalMode mode; 88f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck nsecs_t frameTimeMs; 89f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck AnimationHook* animationHook; 90e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // TODO: Remove this? Currently this is used to signal to stop preparing 91e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // textures if we run out of cache space. 92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool prepareTextures; 939eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // TODO: buildLayer uses this to suppress running any animations, but this 949eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // should probably be refactored somehow. The reason this is done is 959eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // because buildLayer is not setup for injecting the animationHook, as well 969eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // as this being otherwise wasted work as all the animators will be 979eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // re-evaluated when the frame is actually drawn 989eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck bool runAnimations; 9969e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik 10069e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik // Must not be null during actual usage 10169e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik DamageAccumulator* damageAccumulator; 1023b20251a355c88193c439f928a84ae69483fb488John Reck RenderState& renderState; 10325fbb3fa1138675379102a44405852555cefccbdJohn Reck // The renderer that will be drawing the next frame. Use this to push any 10425fbb3fa1138675379102a44405852555cefccbdJohn Reck // layer updates or similar. May be NULL. 10525fbb3fa1138675379102a44405852555cefccbdJohn Reck OpenGLRenderer* renderer; 106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck ErrorHandler* errorHandler; 107f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 108f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck struct Out { 109f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck Out() 110f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck : hasFunctors(false) 111f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck , hasAnimations(false) 112f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck , requiresUiRedraw(false) 113a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck , canDrawThisFrame(true) 114f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck {} 115f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck bool hasFunctors; 116f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // This is only updated if evaluateAnimations is true 117f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck bool hasAnimations; 118f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // This is set to true if there is an animation that RenderThread cannot 119f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // animate itself, such as if hasFunctors is true 120f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // This is only set if hasAnimations is true 121f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck bool requiresUiRedraw; 122a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // This is set to true if draw() can be called this frame 123a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // false means that we must delay until the next vsync pulse as frame 124a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // production is outrunning consumption 125a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // NOTE that if this is false CanvasContext will set either requiresUiRedraw 126a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // *OR* will post itself for the next vsync automatically, use this 127a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // only to avoid calling draw() 128a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck bool canDrawThisFrame; 129f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck } out; 130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 131e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // TODO: Damage calculations 132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */ 135e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */ 136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#endif /* TREEINFO_H */ 138