TreeInfo.h revision 25fbb3fa1138675379102a44405852555cefccbd
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16#ifndef TREEINFO_H 17#define TREEINFO_H 18 19#include <utils/Timers.h> 20 21#include "DamageAccumulator.h" 22#include "utils/Macros.h" 23 24namespace android { 25namespace uirenderer { 26 27class BaseRenderNodeAnimator; 28class AnimationListener; 29class OpenGLRenderer; 30 31class AnimationHook { 32public: 33 virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) = 0; 34protected: 35 ~AnimationHook() {} 36}; 37 38// This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN 39class TreeInfo { 40 PREVENT_COPY_AND_ASSIGN(TreeInfo); 41public: 42 enum TraversalMode { 43 // The full monty - sync, push, run animators, etc... Used by DrawFrameTask 44 // May only be used if both the UI thread and RT thread are blocked on the 45 // prepare 46 MODE_FULL, 47 // Run only what can be done safely on RT thread. Currently this only means 48 // animators, but potentially things like SurfaceTexture updates 49 // could be handled by this as well if there are no listeners 50 MODE_RT_ONLY, 51 // The subtree is being detached. Maybe. If the RenderNode is present 52 // in both the old and new display list's children then it will get a 53 // MODE_MAYBE_DETACHING followed shortly by a MODE_FULL. 54 // Push any pending display list changes in case it is detached, 55 // but don't evaluate animators and such as if it isn't detached as a 56 // MODE_FULL will follow shortly. 57 MODE_MAYBE_DETACHING, 58 // TODO: TRIM_MEMORY? 59 }; 60 61 explicit TreeInfo(TraversalMode mode) 62 : mode(mode) 63 , frameTimeMs(0) 64 , animationHook(NULL) 65 , prepareTextures(mode == MODE_FULL) 66 , damageAccumulator(NullDamageAccumulator::instance()) 67 , renderer(0) 68 {} 69 70 const TraversalMode mode; 71 nsecs_t frameTimeMs; 72 AnimationHook* animationHook; 73 // TODO: Remove this? Currently this is used to signal to stop preparing 74 // textures if we run out of cache space. 75 bool prepareTextures; 76 // Must not be null 77 IDamageAccumulator* damageAccumulator; 78 // The renderer that will be drawing the next frame. Use this to push any 79 // layer updates or similar. May be NULL. 80 OpenGLRenderer* renderer; 81 82 struct Out { 83 Out() 84 : hasFunctors(false) 85 , hasAnimations(false) 86 , requiresUiRedraw(false) 87 , canDrawThisFrame(true) 88 {} 89 bool hasFunctors; 90 // This is only updated if evaluateAnimations is true 91 bool hasAnimations; 92 // This is set to true if there is an animation that RenderThread cannot 93 // animate itself, such as if hasFunctors is true 94 // This is only set if hasAnimations is true 95 bool requiresUiRedraw; 96 // This is set to true if draw() can be called this frame 97 // false means that we must delay until the next vsync pulse as frame 98 // production is outrunning consumption 99 // NOTE that if this is false CanvasContext will set either requiresUiRedraw 100 // *OR* will post itself for the next vsync automatically, use this 101 // only to avoid calling draw() 102 bool canDrawThisFrame; 103 } out; 104 105 // TODO: Damage calculations 106}; 107 108} /* namespace uirenderer */ 109} /* namespace android */ 110 111#endif /* TREEINFO_H */ 112