TreeInfo.h revision c25e506f7fc08790c0532f927f31310a2ca778b7
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 25ea1724be4d3b6039818f91fc087e1216c1463d5Chris Craik * Copyright (C) 2014 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef TREEINFO_H 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define TREEINFO_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include <string> 20d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 21f158b49c888f722194afe5a80539a2b020c130bcChris Craik#include <utils/Timers.h> 228ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik 23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "DamageAccumulator.h" 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "utils/Macros.h" 258160f20b0aca8c6595d4b385d673f59b6bcd16a4Chris Craik 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass BaseRenderNodeAnimator; 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass AnimationListener; 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass OpenGLRenderer; 326e068c0182f6f85bccb855a647510724d1c65a13Chris Craik 336e068c0182f6f85bccb855a647510724d1c65a13Chris Craikclass AnimationHook { 346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikpublic: 355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) = 0; 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikprotected: 376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik ~AnimationHook() {} 385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik}; 395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik 406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikclass ErrorHandler { 416fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikpublic: 42d3daa3198e2212c985c634821682d5819346b653Chris Craik virtual void onError(const std::string& message) = 0; 436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikprotected: 446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik ~ErrorHandler() {} 455854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik}; 466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 475854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik// This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN 48d3daa3198e2212c985c634821682d5819346b653Chris Craikclass TreeInfo { 4974af6e282f8a8f75928a071e8200039517cf5c12Chris Craik PREVENT_COPY_AND_ASSIGN(TreeInfo); 50a6ac95e5772c5df441b49189af3a0df79a22679dChris Craikpublic: 51a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik enum TraversalMode { 5274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // The full monty - sync, push, run animators, etc... Used by DrawFrameTask 5374af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // May only be used if both the UI thread and RT thread are blocked on the 5474af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // prepare 5598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik MODE_FULL, 56a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik // Run only what can be done safely on RT thread. Currently this only means 57a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik // animators, but potentially things like SurfaceTexture updates 58a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik // could be handled by this as well if there are no listeners 59a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik MODE_RT_ONLY, 60a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik // The subtree is being detached. Maybe. If the RenderNode is present 6198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik // in both the old and new display list's children then it will get a 62e4db79de127cfe961195f52907af8451026eaa20Chris Craik // MODE_MAYBE_DETACHING followed shortly by a MODE_FULL. 635854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // Push any pending display list changes in case it is detached, 6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik // but don't evaluate animators and such as if it isn't detached as a 6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik // MODE_FULL will follow shortly. 66a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik MODE_MAYBE_DETACHING, 67a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik // TODO: TRIM_MEMORY? 68a6ac95e5772c5df441b49189af3a0df79a22679dChris Craik }; 697cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik explicit TreeInfo(TraversalMode mode) 7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik : mode(mode) 7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , frameTimeMs(0) 7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , animationHook(NULL) 7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , prepareTextures(mode == MODE_FULL) 7515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , damageAccumulator(NullDamageAccumulator::instance()) 7615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , renderer(0) 777cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik , errorHandler(0) 7815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik {} 7915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 805854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik const TraversalMode mode; 815854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik nsecs_t frameTimeMs; 825854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik AnimationHook* animationHook; 835854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // TODO: Remove this? Currently this is used to signal to stop preparing 845854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // textures if we run out of cache space. 856fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik bool prepareTextures; 865854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // Must not be null 875854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik IDamageAccumulator* damageAccumulator; 888ecf41c61a5185207a21d64681e8ebc2502b7b2aChris Craik // The renderer that will be drawing the next frame. Use this to push any 895854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // layer updates or similar. May be NULL. 905854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OpenGLRenderer* renderer; 915854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik ErrorHandler* errorHandler; 9215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 9315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik struct Out { 945854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik Out() 955854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik : hasFunctors(false) 966fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik , hasAnimations(false) 977cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik , requiresUiRedraw(false) 9815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik , canDrawThisFrame(true) 9915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik {} 10015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik bool hasFunctors; 10115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik // This is only updated if evaluateAnimations is true 10215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik bool hasAnimations; 10315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik // This is set to true if there is an animation that RenderThread cannot 10415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik // animate itself, such as if hasFunctors is true 1057cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik // This is only set if hasAnimations is true 10615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik bool requiresUiRedraw; 1076fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik // This is set to true if draw() can be called this frame 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // false means that we must delay until the next vsync pulse as frame 1095854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik // production is outrunning consumption 1106fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik // NOTE that if this is false CanvasContext will set either requiresUiRedraw 1113a5811b50157e7ba50854caf957e806aee794d39Chris Craik // *OR* will post itself for the next vsync automatically, use this 112d3daa3198e2212c985c634821682d5819346b653Chris Craik // only to avoid calling draw() 113d3daa3198e2212c985c634821682d5819346b653Chris Craik bool canDrawThisFrame; 11498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik } out; 115d3daa3198e2212c985c634821682d5819346b653Chris Craik 116d3daa3198e2212c985c634821682d5819346b653Chris Craik // TODO: Damage calculations 117d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 118d3daa3198e2212c985c634821682d5819346b653Chris Craik 119d3daa3198e2212c985c634821682d5819346b653Chris Craik} /* namespace uirenderer */ 120d3daa3198e2212c985c634821682d5819346b653Chris Craik} /* namespace android */ 121d3daa3198e2212c985c634821682d5819346b653Chris Craik 122d3daa3198e2212c985c634821682d5819346b653Chris Craik#endif /* TREEINFO_H */ 123d3daa3198e2212c985c634821682d5819346b653Chris Craik