xref: /aosp_15_r20/frameworks/base/libs/hwui/TreeInfo.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #pragma once
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <utils/Timers.h>
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <optional>
22*d57664e9SAndroid Build Coastguard Worker #include <string>
23*d57664e9SAndroid Build Coastguard Worker 
24*d57664e9SAndroid Build Coastguard Worker #include "Properties.h"
25*d57664e9SAndroid Build Coastguard Worker #include "SkSize.h"
26*d57664e9SAndroid Build Coastguard Worker #include "SkippedFrameInfo.h"
27*d57664e9SAndroid Build Coastguard Worker #include "utils/ForceDark.h"
28*d57664e9SAndroid Build Coastguard Worker #include "utils/Macros.h"
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker namespace android {
31*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker namespace renderthread {
34*d57664e9SAndroid Build Coastguard Worker class CanvasContext;
35*d57664e9SAndroid Build Coastguard Worker }
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker class DamageAccumulator;
38*d57664e9SAndroid Build Coastguard Worker class LayerUpdateQueue;
39*d57664e9SAndroid Build Coastguard Worker class RenderNode;
40*d57664e9SAndroid Build Coastguard Worker class RenderState;
41*d57664e9SAndroid Build Coastguard Worker 
42*d57664e9SAndroid Build Coastguard Worker class ErrorHandler {
43*d57664e9SAndroid Build Coastguard Worker public:
44*d57664e9SAndroid Build Coastguard Worker     virtual void onError(const std::string& message) = 0;
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker     virtual ~ErrorHandler() = default;
47*d57664e9SAndroid Build Coastguard Worker };
48*d57664e9SAndroid Build Coastguard Worker 
49*d57664e9SAndroid Build Coastguard Worker class TreeObserver {
50*d57664e9SAndroid Build Coastguard Worker public:
51*d57664e9SAndroid Build Coastguard Worker     // Called when a RenderNode's parent count hits 0.
52*d57664e9SAndroid Build Coastguard Worker     // Due to the unordered nature of tree pushes, once prepareTree
53*d57664e9SAndroid Build Coastguard Worker     // is finished it is possible that the node was "resurrected" and has
54*d57664e9SAndroid Build Coastguard Worker     // a non-zero parent count.
55*d57664e9SAndroid Build Coastguard Worker     virtual void onMaybeRemovedFromTree(RenderNode* node) = 0;
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker protected:
58*d57664e9SAndroid Build Coastguard Worker     virtual ~TreeObserver() = default;
59*d57664e9SAndroid Build Coastguard Worker };
60*d57664e9SAndroid Build Coastguard Worker 
61*d57664e9SAndroid Build Coastguard Worker // This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN
62*d57664e9SAndroid Build Coastguard Worker class TreeInfo {
63*d57664e9SAndroid Build Coastguard Worker     PREVENT_COPY_AND_ASSIGN(TreeInfo);
64*d57664e9SAndroid Build Coastguard Worker 
65*d57664e9SAndroid Build Coastguard Worker public:
66*d57664e9SAndroid Build Coastguard Worker     enum TraversalMode {
67*d57664e9SAndroid Build Coastguard Worker         // The full monty - sync, push, run animators, etc... Used by DrawFrameTask
68*d57664e9SAndroid Build Coastguard Worker         // May only be used if both the UI thread and RT thread are blocked on the
69*d57664e9SAndroid Build Coastguard Worker         // prepare
70*d57664e9SAndroid Build Coastguard Worker         MODE_FULL,
71*d57664e9SAndroid Build Coastguard Worker         // Run only what can be done safely on RT thread. Currently this only means
72*d57664e9SAndroid Build Coastguard Worker         // animators, but potentially things like SurfaceTexture updates
73*d57664e9SAndroid Build Coastguard Worker         // could be handled by this as well if there are no listeners
74*d57664e9SAndroid Build Coastguard Worker         MODE_RT_ONLY,
75*d57664e9SAndroid Build Coastguard Worker     };
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContext);
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker     TraversalMode mode;
80*d57664e9SAndroid Build Coastguard Worker     // TODO: Remove this? Currently this is used to signal to stop preparing
81*d57664e9SAndroid Build Coastguard Worker     // textures if we run out of cache space.
82*d57664e9SAndroid Build Coastguard Worker     bool prepareTextures;
83*d57664e9SAndroid Build Coastguard Worker     renderthread::CanvasContext& canvasContext;
84*d57664e9SAndroid Build Coastguard Worker     // TODO: buildLayer uses this to suppress running any animations, but this
85*d57664e9SAndroid Build Coastguard Worker     // should probably be refactored somehow. The reason this is done is
86*d57664e9SAndroid Build Coastguard Worker     // because buildLayer is not setup for injecting the animationHook, as well
87*d57664e9SAndroid Build Coastguard Worker     // as this being otherwise wasted work as all the animators will be
88*d57664e9SAndroid Build Coastguard Worker     // re-evaluated when the frame is actually drawn
89*d57664e9SAndroid Build Coastguard Worker     bool runAnimations = true;
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker     // Must not be null during actual usage
92*d57664e9SAndroid Build Coastguard Worker     DamageAccumulator* damageAccumulator = nullptr;
93*d57664e9SAndroid Build Coastguard Worker     int64_t damageGenerationId = 0;
94*d57664e9SAndroid Build Coastguard Worker 
95*d57664e9SAndroid Build Coastguard Worker     LayerUpdateQueue* layerUpdateQueue = nullptr;
96*d57664e9SAndroid Build Coastguard Worker     ErrorHandler* errorHandler = nullptr;
97*d57664e9SAndroid Build Coastguard Worker 
98*d57664e9SAndroid Build Coastguard Worker     bool updateWindowPositions = false;
99*d57664e9SAndroid Build Coastguard Worker 
100*d57664e9SAndroid Build Coastguard Worker     int disableForceDark;
101*d57664e9SAndroid Build Coastguard Worker     ForceDarkType forceDarkType = ForceDarkType::NONE;
102*d57664e9SAndroid Build Coastguard Worker 
103*d57664e9SAndroid Build Coastguard Worker     const SkISize screenSize;
104*d57664e9SAndroid Build Coastguard Worker 
105*d57664e9SAndroid Build Coastguard Worker     int stretchEffectCount = 0;
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     bool forceDrawFrame = false;
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     struct Out {
110*d57664e9SAndroid Build Coastguard Worker         bool hasFunctors = false;
111*d57664e9SAndroid Build Coastguard Worker         // This is only updated if evaluateAnimations is true
112*d57664e9SAndroid Build Coastguard Worker         bool hasAnimations = false;
113*d57664e9SAndroid Build Coastguard Worker         // This is set to true if there is an animation that RenderThread cannot
114*d57664e9SAndroid Build Coastguard Worker         // animate itself, such as if hasFunctors is true
115*d57664e9SAndroid Build Coastguard Worker         // This is only set if hasAnimations is true
116*d57664e9SAndroid Build Coastguard Worker         bool requiresUiRedraw = false;
117*d57664e9SAndroid Build Coastguard Worker         // This is set to nullopt if draw() can be called this frame
118*d57664e9SAndroid Build Coastguard Worker         // A value means that we must delay until the next vsync pulse as frame
119*d57664e9SAndroid Build Coastguard Worker         // production is outrunning consumption
120*d57664e9SAndroid Build Coastguard Worker         // NOTE that if this has a value CanvasContext will set either requiresUiRedraw
121*d57664e9SAndroid Build Coastguard Worker         // *OR* will post itself for the next vsync automatically, use this
122*d57664e9SAndroid Build Coastguard Worker         // only to avoid calling draw()
123*d57664e9SAndroid Build Coastguard Worker         std::optional<SkippedFrameReason> skippedFrameReason;
124*d57664e9SAndroid Build Coastguard Worker         // Sentinel for animatedImageDelay meaning there is no need to post such
125*d57664e9SAndroid Build Coastguard Worker         // a message.
126*d57664e9SAndroid Build Coastguard Worker         static constexpr nsecs_t kNoAnimatedImageDelay = -1;
127*d57664e9SAndroid Build Coastguard Worker         // This is used to post a message to redraw when it is time to draw the
128*d57664e9SAndroid Build Coastguard Worker         // next frame of an AnimatedImageDrawable.
129*d57664e9SAndroid Build Coastguard Worker         nsecs_t animatedImageDelay = kNoAnimatedImageDelay;
130*d57664e9SAndroid Build Coastguard Worker         // This is used to determine if there were only TextureView updates in this frame.
131*d57664e9SAndroid Build Coastguard Worker         // This info is passed to SurfaceFlinger to determine whether it should use vsyncIds
132*d57664e9SAndroid Build Coastguard Worker         // for refresh rate selection.
133*d57664e9SAndroid Build Coastguard Worker         bool solelyTextureViewUpdates = true;
134*d57664e9SAndroid Build Coastguard Worker     } out;
135*d57664e9SAndroid Build Coastguard Worker 
136*d57664e9SAndroid Build Coastguard Worker     // This flag helps to disable projection for receiver nodes that do not have any backward
137*d57664e9SAndroid Build Coastguard Worker     // projected children.
138*d57664e9SAndroid Build Coastguard Worker     bool hasBackwardProjectedNodes = false;
139*d57664e9SAndroid Build Coastguard Worker     // TODO: Damage calculations
140*d57664e9SAndroid Build Coastguard Worker };
141*d57664e9SAndroid Build Coastguard Worker 
142*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
143*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
144