TreeInfo.h revision e4267ea4f20740c37c01bfb6aefcf61fddc4566a
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
19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <utils/Timers.h>
20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
21e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include "utils/Macros.h"
22e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck
23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer {
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
26ff941dcd815021bb20d6504eb486acb1e50592c3John Reckclass BaseRenderNodeAnimator;
2752244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListener;
28e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckclass DamageAccumulator;
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
3052244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationHook {
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
32ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) = 0;
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
3452244fff29042926e21fa897ef5ab11148e35299John Reck    ~AnimationHook() {}
35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
37e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck// This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN
38e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckclass TreeInfo {
39e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    PREVENT_COPY_AND_ASSIGN(TreeInfo);
40e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic:
41e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    enum TraversalMode {
42e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // The full monty - sync, push, run animators, etc... Used by DrawFrameTask
43e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // May only be used if both the UI thread and RT thread are blocked on the
44e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // prepare
45e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        MODE_FULL,
46e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // Run only what can be done safely on RT thread. Currently this only means
47e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // animators, but potentially things like SurfaceTexture updates
48e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // could be handled by this as well if there are no listeners
49e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        MODE_RT_ONLY,
50e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // The subtree is being detached. Maybe. If the RenderNode is present
51e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // in both the old and new display list's children then it will get a
52e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // MODE_MAYBE_DETACHING followed shortly by a MODE_FULL.
53e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // Push any pending display list changes in case it is detached,
54e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // but don't evaluate animators and such as if it isn't detached as a
55e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // MODE_FULL will follow shortly.
56e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        MODE_MAYBE_DETACHING,
57e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        // TODO: TRIM_MEMORY?
58e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    };
59e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck
60e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    explicit TreeInfo(TraversalMode mode)
61e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        : mode(mode)
62e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        , frameTimeMs(0)
63f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        , animationHook(NULL)
64e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        , prepareTextures(mode == MODE_FULL)
65e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        , damageAccumulator(0)
66e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    {}
67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
68e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    const TraversalMode mode;
69f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    nsecs_t frameTimeMs;
70f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    AnimationHook* animationHook;
71e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    // TODO: Remove this? Currently this is used to signal to stop preparing
72e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    // textures if we run out of cache space.
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool prepareTextures;
74e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    DamageAccumulator* damageAccumulator;
75f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck
76f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    struct Out {
77f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        Out()
78f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck            : hasFunctors(false)
79f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck            , hasAnimations(false)
80f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck            , requiresUiRedraw(false)
81a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck            , canDrawThisFrame(true)
82f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        {}
83f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        bool hasFunctors;
84f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        // This is only updated if evaluateAnimations is true
85f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        bool hasAnimations;
86f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        // This is set to true if there is an animation that RenderThread cannot
87f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        // animate itself, such as if hasFunctors is true
88f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        // This is only set if hasAnimations is true
89f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck        bool requiresUiRedraw;
90a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // This is set to true if draw() can be called this frame
91a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // false means that we must delay until the next vsync pulse as frame
92a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // production is outrunning consumption
93a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // NOTE that if this is false CanvasContext will set either requiresUiRedraw
94a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // *OR* will post itself for the next vsync automatically, use this
95a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        // only to avoid calling draw()
96a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        bool canDrawThisFrame;
97f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    } out;
98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // TODO: Damage calculations
100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */
104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#endif /* TREEINFO_H */
106