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