xref: /aosp_15_r20/frameworks/base/libs/hwui/renderthread/CanvasContext.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 <SkBitmap.h>
20*d57664e9SAndroid Build Coastguard Worker #include <SkRect.h>
21*d57664e9SAndroid Build Coastguard Worker #include <SkSize.h>
22*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/Functor.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/Mutex.h>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include <functional>
27*d57664e9SAndroid Build Coastguard Worker #include <future>
28*d57664e9SAndroid Build Coastguard Worker #include <set>
29*d57664e9SAndroid Build Coastguard Worker #include <string>
30*d57664e9SAndroid Build Coastguard Worker #include <utility>
31*d57664e9SAndroid Build Coastguard Worker #include <vector>
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker #include "ColorMode.h"
34*d57664e9SAndroid Build Coastguard Worker #include "DamageAccumulator.h"
35*d57664e9SAndroid Build Coastguard Worker #include "FrameInfo.h"
36*d57664e9SAndroid Build Coastguard Worker #include "FrameInfoVisualizer.h"
37*d57664e9SAndroid Build Coastguard Worker #include "FrameMetricsReporter.h"
38*d57664e9SAndroid Build Coastguard Worker #include "HintSessionWrapper.h"
39*d57664e9SAndroid Build Coastguard Worker #include "IContextFactory.h"
40*d57664e9SAndroid Build Coastguard Worker #include "IRenderPipeline.h"
41*d57664e9SAndroid Build Coastguard Worker #include "JankTracker.h"
42*d57664e9SAndroid Build Coastguard Worker #include "LayerUpdateQueue.h"
43*d57664e9SAndroid Build Coastguard Worker #include "Lighting.h"
44*d57664e9SAndroid Build Coastguard Worker #include "ReliableSurface.h"
45*d57664e9SAndroid Build Coastguard Worker #include "RenderNode.h"
46*d57664e9SAndroid Build Coastguard Worker #include "renderstate/RenderState.h"
47*d57664e9SAndroid Build Coastguard Worker #include "renderthread/RenderTask.h"
48*d57664e9SAndroid Build Coastguard Worker #include "renderthread/RenderThread.h"
49*d57664e9SAndroid Build Coastguard Worker #include "utils/ForceDark.h"
50*d57664e9SAndroid Build Coastguard Worker #include "utils/RingBuffer.h"
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker namespace android {
53*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker class AnimationContext;
56*d57664e9SAndroid Build Coastguard Worker class DeferredLayerUpdater;
57*d57664e9SAndroid Build Coastguard Worker class ErrorHandler;
58*d57664e9SAndroid Build Coastguard Worker class Layer;
59*d57664e9SAndroid Build Coastguard Worker class Rect;
60*d57664e9SAndroid Build Coastguard Worker class RenderState;
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker namespace renderthread {
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker class Frame;
65*d57664e9SAndroid Build Coastguard Worker 
66*d57664e9SAndroid Build Coastguard Worker // This per-renderer class manages the bridge between the global EGL context
67*d57664e9SAndroid Build Coastguard Worker // and the render surface.
68*d57664e9SAndroid Build Coastguard Worker // TODO: Rename to Renderer or some other per-window, top-level manager
69*d57664e9SAndroid Build Coastguard Worker class CanvasContext : public IFrameCallback, public IGpuContextCallback {
70*d57664e9SAndroid Build Coastguard Worker public:
71*d57664e9SAndroid Build Coastguard Worker     static CanvasContext* create(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
72*d57664e9SAndroid Build Coastguard Worker                                  IContextFactory* contextFactory, pid_t uiThreadId,
73*d57664e9SAndroid Build Coastguard Worker                                  pid_t renderThreadId);
74*d57664e9SAndroid Build Coastguard Worker     virtual ~CanvasContext();
75*d57664e9SAndroid Build Coastguard Worker 
76*d57664e9SAndroid Build Coastguard Worker     /**
77*d57664e9SAndroid Build Coastguard Worker      * Update or create a layer specific for the provided RenderNode. The layer
78*d57664e9SAndroid Build Coastguard Worker      * attached to the node will be specific to the RenderPipeline used by this
79*d57664e9SAndroid Build Coastguard Worker      * context
80*d57664e9SAndroid Build Coastguard Worker      *
81*d57664e9SAndroid Build Coastguard Worker      *  @return true if the layer has been created or updated
82*d57664e9SAndroid Build Coastguard Worker      */
createOrUpdateLayer(RenderNode * node,const DamageAccumulator & dmgAccumulator,ErrorHandler * errorHandler)83*d57664e9SAndroid Build Coastguard Worker     bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator,
84*d57664e9SAndroid Build Coastguard Worker                              ErrorHandler* errorHandler) {
85*d57664e9SAndroid Build Coastguard Worker         return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, errorHandler);
86*d57664e9SAndroid Build Coastguard Worker     }
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     /**
89*d57664e9SAndroid Build Coastguard Worker      * Pin any mutable images to the GPU cache. A pinned images is guaranteed to
90*d57664e9SAndroid Build Coastguard Worker      * remain in the cache until it has been unpinned. We leverage this feature
91*d57664e9SAndroid Build Coastguard Worker      * to avoid making a CPU copy of the pixels.
92*d57664e9SAndroid Build Coastguard Worker      *
93*d57664e9SAndroid Build Coastguard Worker      * @return true if all images have been successfully pinned to the GPU cache
94*d57664e9SAndroid Build Coastguard Worker      *         and false otherwise (e.g. cache limits have been exceeded).
95*d57664e9SAndroid Build Coastguard Worker      */
pinImages(std::vector<SkImage * > & mutableImages)96*d57664e9SAndroid Build Coastguard Worker     bool pinImages(std::vector<SkImage*>& mutableImages) {
97*d57664e9SAndroid Build Coastguard Worker         if (!Properties::isDrawingEnabled()) {
98*d57664e9SAndroid Build Coastguard Worker             return true;
99*d57664e9SAndroid Build Coastguard Worker         }
100*d57664e9SAndroid Build Coastguard Worker         return mRenderPipeline->pinImages(mutableImages);
101*d57664e9SAndroid Build Coastguard Worker     }
pinImages(LsaVector<sk_sp<Bitmap>> & images)102*d57664e9SAndroid Build Coastguard Worker     bool pinImages(LsaVector<sk_sp<Bitmap>>& images) {
103*d57664e9SAndroid Build Coastguard Worker         if (!Properties::isDrawingEnabled()) {
104*d57664e9SAndroid Build Coastguard Worker             return true;
105*d57664e9SAndroid Build Coastguard Worker         }
106*d57664e9SAndroid Build Coastguard Worker         return mRenderPipeline->pinImages(images);
107*d57664e9SAndroid Build Coastguard Worker     }
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     /**
110*d57664e9SAndroid Build Coastguard Worker      * Unpin any image that had be previously pinned to the GPU cache
111*d57664e9SAndroid Build Coastguard Worker      */
unpinImages()112*d57664e9SAndroid Build Coastguard Worker     void unpinImages() { mRenderPipeline->unpinImages(); }
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker     static void invokeFunctor(const RenderThread& thread, Functor* functor);
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker     static void prepareToDraw(const RenderThread& thread, Bitmap* bitmap);
117*d57664e9SAndroid Build Coastguard Worker 
118*d57664e9SAndroid Build Coastguard Worker     /*
119*d57664e9SAndroid Build Coastguard Worker      * If Properties::isSkiaEnabled() is true then this will return the Skia
120*d57664e9SAndroid Build Coastguard Worker      * grContext associated with the current RenderPipeline.
121*d57664e9SAndroid Build Coastguard Worker      */
getGrContext()122*d57664e9SAndroid Build Coastguard Worker     GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }
123*d57664e9SAndroid Build Coastguard Worker 
getSurfaceControl()124*d57664e9SAndroid Build Coastguard Worker     ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
getSurfaceControlGenerationId()125*d57664e9SAndroid Build Coastguard Worker     int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; }
126*d57664e9SAndroid Build Coastguard Worker 
127*d57664e9SAndroid Build Coastguard Worker     // Won't take effect until next EGLSurface creation
128*d57664e9SAndroid Build Coastguard Worker     void setSwapBehavior(SwapBehavior swapBehavior);
129*d57664e9SAndroid Build Coastguard Worker 
130*d57664e9SAndroid Build Coastguard Worker     void setHardwareBuffer(AHardwareBuffer* buffer);
131*d57664e9SAndroid Build Coastguard Worker     void setSurface(ANativeWindow* window, bool enableTimeout = true);
132*d57664e9SAndroid Build Coastguard Worker     void setSurfaceControl(ASurfaceControl* surfaceControl);
133*d57664e9SAndroid Build Coastguard Worker     bool pauseSurface();
134*d57664e9SAndroid Build Coastguard Worker     void setStopped(bool stopped);
isStopped()135*d57664e9SAndroid Build Coastguard Worker     bool isStopped() { return mStopped || !hasOutputTarget(); }
hasOutputTarget()136*d57664e9SAndroid Build Coastguard Worker     bool hasOutputTarget() const { return mNativeSurface.get() || mHardwareBuffer; }
137*d57664e9SAndroid Build Coastguard Worker     void allocateBuffers();
138*d57664e9SAndroid Build Coastguard Worker 
139*d57664e9SAndroid Build Coastguard Worker     void setLightAlpha(uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
140*d57664e9SAndroid Build Coastguard Worker     void setLightGeometry(const Vector3& lightCenter, float lightRadius);
141*d57664e9SAndroid Build Coastguard Worker     void setOpaque(bool opaque);
142*d57664e9SAndroid Build Coastguard Worker     float setColorMode(ColorMode mode);
143*d57664e9SAndroid Build Coastguard Worker     float targetSdrHdrRatio() const;
144*d57664e9SAndroid Build Coastguard Worker     void setTargetSdrHdrRatio(float ratio);
145*d57664e9SAndroid Build Coastguard Worker     bool makeCurrent();
146*d57664e9SAndroid Build Coastguard Worker     void prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t syncQueued, RenderNode* target);
147*d57664e9SAndroid Build Coastguard Worker     // Returns the DequeueBufferDuration.
148*d57664e9SAndroid Build Coastguard Worker     void draw(bool solelyTextureViewUpdates);
149*d57664e9SAndroid Build Coastguard Worker     void destroy();
150*d57664e9SAndroid Build Coastguard Worker 
151*d57664e9SAndroid Build Coastguard Worker     // IFrameCallback, Choreographer-driven frame callback entry point
152*d57664e9SAndroid Build Coastguard Worker     virtual void doFrame() override;
153*d57664e9SAndroid Build Coastguard Worker     void prepareAndDraw(RenderNode* node);
154*d57664e9SAndroid Build Coastguard Worker 
155*d57664e9SAndroid Build Coastguard Worker     void buildLayer(RenderNode* node);
156*d57664e9SAndroid Build Coastguard Worker     void markLayerInUse(RenderNode* node);
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker     void destroyHardwareResources();
159*d57664e9SAndroid Build Coastguard Worker     void onContextDestroyed() override;
160*d57664e9SAndroid Build Coastguard Worker 
161*d57664e9SAndroid Build Coastguard Worker     DeferredLayerUpdater* createTextureLayer();
162*d57664e9SAndroid Build Coastguard Worker 
163*d57664e9SAndroid Build Coastguard Worker     void stopDrawing();
164*d57664e9SAndroid Build Coastguard Worker     void notifyFramePending();
165*d57664e9SAndroid Build Coastguard Worker 
profiler()166*d57664e9SAndroid Build Coastguard Worker     FrameInfoVisualizer& profiler() { return mProfiler; }
profilerLock()167*d57664e9SAndroid Build Coastguard Worker     std::mutex& profilerLock() { return mFrameInfoMutex; }
168*d57664e9SAndroid Build Coastguard Worker 
169*d57664e9SAndroid Build Coastguard Worker     void dumpFrames(int fd);
170*d57664e9SAndroid Build Coastguard Worker     void resetFrameStats();
171*d57664e9SAndroid Build Coastguard Worker 
172*d57664e9SAndroid Build Coastguard Worker     void setName(const std::string&& name);
173*d57664e9SAndroid Build Coastguard Worker 
174*d57664e9SAndroid Build Coastguard Worker     void addRenderNode(RenderNode* node, bool placeFront);
175*d57664e9SAndroid Build Coastguard Worker     void removeRenderNode(RenderNode* node);
176*d57664e9SAndroid Build Coastguard Worker 
setContentDrawBounds(const Rect & bounds)177*d57664e9SAndroid Build Coastguard Worker     void setContentDrawBounds(const Rect& bounds) { mContentDrawBounds = bounds; }
178*d57664e9SAndroid Build Coastguard Worker 
179*d57664e9SAndroid Build Coastguard Worker     void addFrameMetricsObserver(FrameMetricsObserver* observer);
180*d57664e9SAndroid Build Coastguard Worker     void removeFrameMetricsObserver(FrameMetricsObserver* observer);
181*d57664e9SAndroid Build Coastguard Worker 
182*d57664e9SAndroid Build Coastguard Worker     // Used to queue up work that needs to be completed before this frame completes
183*d57664e9SAndroid Build Coastguard Worker     void enqueueFrameWork(std::function<void()>&& func);
184*d57664e9SAndroid Build Coastguard Worker 
185*d57664e9SAndroid Build Coastguard Worker     uint64_t getFrameNumber();
186*d57664e9SAndroid Build Coastguard Worker 
187*d57664e9SAndroid Build Coastguard Worker     void waitOnFences();
188*d57664e9SAndroid Build Coastguard Worker 
getRenderPipeline()189*d57664e9SAndroid Build Coastguard Worker     IRenderPipeline* getRenderPipeline() { return mRenderPipeline.get(); }
190*d57664e9SAndroid Build Coastguard Worker 
addFrameCommitListener(std::function<void (bool)> && func)191*d57664e9SAndroid Build Coastguard Worker     void addFrameCommitListener(std::function<void(bool)>&& func) {
192*d57664e9SAndroid Build Coastguard Worker         mFrameCommitCallbacks.push_back(std::move(func));
193*d57664e9SAndroid Build Coastguard Worker     }
194*d57664e9SAndroid Build Coastguard Worker 
setPictureCapturedCallback(const std::function<void (sk_sp<SkPicture> &&)> & callback)195*d57664e9SAndroid Build Coastguard Worker     void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback) {
196*d57664e9SAndroid Build Coastguard Worker         mRenderPipeline->setPictureCapturedCallback(callback);
197*d57664e9SAndroid Build Coastguard Worker     }
198*d57664e9SAndroid Build Coastguard Worker 
setForceDark(ForceDarkType type)199*d57664e9SAndroid Build Coastguard Worker     void setForceDark(ForceDarkType type) { mForceDarkType = type; }
200*d57664e9SAndroid Build Coastguard Worker 
getForceDarkType()201*d57664e9SAndroid Build Coastguard Worker     ForceDarkType getForceDarkType() { return mForceDarkType; }
202*d57664e9SAndroid Build Coastguard Worker 
203*d57664e9SAndroid Build Coastguard Worker     SkISize getNextFrameSize() const;
204*d57664e9SAndroid Build Coastguard Worker 
205*d57664e9SAndroid Build Coastguard Worker     // Returns the matrix to use to nudge non-AA'd points/lines towards the fragment center
206*d57664e9SAndroid Build Coastguard Worker     const SkM44& getPixelSnapMatrix() const;
207*d57664e9SAndroid Build Coastguard Worker 
208*d57664e9SAndroid Build Coastguard Worker     // Called when SurfaceStats are available.
209*d57664e9SAndroid Build Coastguard Worker     static void onSurfaceStatsAvailable(void* context, int32_t surfaceControlId,
210*d57664e9SAndroid Build Coastguard Worker                                         ASurfaceControlStats* stats);
211*d57664e9SAndroid Build Coastguard Worker 
setASurfaceTransactionCallback(const std::function<bool (int64_t,int64_t,int64_t)> & callback)212*d57664e9SAndroid Build Coastguard Worker     void setASurfaceTransactionCallback(
213*d57664e9SAndroid Build Coastguard Worker             const std::function<bool(int64_t, int64_t, int64_t)>& callback) {
214*d57664e9SAndroid Build Coastguard Worker         mASurfaceTransactionCallback = callback;
215*d57664e9SAndroid Build Coastguard Worker     }
216*d57664e9SAndroid Build Coastguard Worker 
setHardwareBufferRenderParams(const HardwareBufferRenderParams & params)217*d57664e9SAndroid Build Coastguard Worker     void setHardwareBufferRenderParams(const HardwareBufferRenderParams& params) {
218*d57664e9SAndroid Build Coastguard Worker         mBufferParams = params;
219*d57664e9SAndroid Build Coastguard Worker     }
220*d57664e9SAndroid Build Coastguard Worker 
221*d57664e9SAndroid Build Coastguard Worker     bool mergeTransaction(ASurfaceTransaction* transaction, ASurfaceControl* control);
222*d57664e9SAndroid Build Coastguard Worker 
setPrepareSurfaceControlForWebviewCallback(const std::function<void ()> & callback)223*d57664e9SAndroid Build Coastguard Worker     void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback) {
224*d57664e9SAndroid Build Coastguard Worker         mPrepareSurfaceControlForWebviewCallback = callback;
225*d57664e9SAndroid Build Coastguard Worker     }
226*d57664e9SAndroid Build Coastguard Worker 
227*d57664e9SAndroid Build Coastguard Worker     void prepareSurfaceControlForWebview();
228*d57664e9SAndroid Build Coastguard Worker 
229*d57664e9SAndroid Build Coastguard Worker     static CanvasContext* getActiveContext();
230*d57664e9SAndroid Build Coastguard Worker 
231*d57664e9SAndroid Build Coastguard Worker     void sendLoadResetHint();
232*d57664e9SAndroid Build Coastguard Worker 
233*d57664e9SAndroid Build Coastguard Worker     void sendLoadIncreaseHint();
234*d57664e9SAndroid Build Coastguard Worker 
235*d57664e9SAndroid Build Coastguard Worker     void setSyncDelayDuration(nsecs_t duration);
236*d57664e9SAndroid Build Coastguard Worker 
237*d57664e9SAndroid Build Coastguard Worker     void startHintSession();
238*d57664e9SAndroid Build Coastguard Worker 
239*d57664e9SAndroid Build Coastguard Worker     static bool shouldDither();
240*d57664e9SAndroid Build Coastguard Worker 
241*d57664e9SAndroid Build Coastguard Worker     void visitAllRenderNodes(std::function<void(const RenderNode&)>) const;
242*d57664e9SAndroid Build Coastguard Worker 
243*d57664e9SAndroid Build Coastguard Worker private:
244*d57664e9SAndroid Build Coastguard Worker     CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
245*d57664e9SAndroid Build Coastguard Worker                   IContextFactory* contextFactory, std::unique_ptr<IRenderPipeline> renderPipeline,
246*d57664e9SAndroid Build Coastguard Worker                   pid_t uiThreadId, pid_t renderThreadId);
247*d57664e9SAndroid Build Coastguard Worker 
248*d57664e9SAndroid Build Coastguard Worker     friend class RegisterFrameCallbackTask;
249*d57664e9SAndroid Build Coastguard Worker     // TODO: Replace with something better for layer & other GL object
250*d57664e9SAndroid Build Coastguard Worker     // lifecycle tracking
251*d57664e9SAndroid Build Coastguard Worker     friend class android::uirenderer::RenderState;
252*d57664e9SAndroid Build Coastguard Worker 
253*d57664e9SAndroid Build Coastguard Worker     void freePrefetchedLayers();
254*d57664e9SAndroid Build Coastguard Worker 
255*d57664e9SAndroid Build Coastguard Worker     bool isSwapChainStuffed();
256*d57664e9SAndroid Build Coastguard Worker     bool surfaceRequiresRedraw();
257*d57664e9SAndroid Build Coastguard Worker     void setupPipelineSurface();
258*d57664e9SAndroid Build Coastguard Worker 
259*d57664e9SAndroid Build Coastguard Worker     SkRect computeDirtyRect(const Frame& frame, SkRect* dirty);
260*d57664e9SAndroid Build Coastguard Worker     void finishFrame(FrameInfo* frameInfo);
261*d57664e9SAndroid Build Coastguard Worker 
262*d57664e9SAndroid Build Coastguard Worker     /**
263*d57664e9SAndroid Build Coastguard Worker      * Invoke 'reportFrameMetrics' on the last frame stored in 'mLastFrameInfos'.
264*d57664e9SAndroid Build Coastguard Worker      * Populate the 'presentTime' field before calling.
265*d57664e9SAndroid Build Coastguard Worker      */
266*d57664e9SAndroid Build Coastguard Worker     void reportMetricsWithPresentTime();
267*d57664e9SAndroid Build Coastguard Worker 
268*d57664e9SAndroid Build Coastguard Worker     struct FrameMetricsInfo {
269*d57664e9SAndroid Build Coastguard Worker         FrameInfo* frameInfo;
270*d57664e9SAndroid Build Coastguard Worker         int64_t frameNumber;
271*d57664e9SAndroid Build Coastguard Worker         int32_t surfaceId;
272*d57664e9SAndroid Build Coastguard Worker     };
273*d57664e9SAndroid Build Coastguard Worker 
274*d57664e9SAndroid Build Coastguard Worker     FrameInfo* getFrameInfoFromLastFew(uint64_t frameNumber, uint32_t surfaceControlId);
275*d57664e9SAndroid Build Coastguard Worker 
276*d57664e9SAndroid Build Coastguard Worker     Frame getFrame();
277*d57664e9SAndroid Build Coastguard Worker 
278*d57664e9SAndroid Build Coastguard Worker     // The same type as Frame.mWidth and Frame.mHeight
279*d57664e9SAndroid Build Coastguard Worker     int32_t mLastFrameWidth = 0;
280*d57664e9SAndroid Build Coastguard Worker     int32_t mLastFrameHeight = 0;
281*d57664e9SAndroid Build Coastguard Worker 
282*d57664e9SAndroid Build Coastguard Worker     RenderThread& mRenderThread;
283*d57664e9SAndroid Build Coastguard Worker 
284*d57664e9SAndroid Build Coastguard Worker     AHardwareBuffer* mHardwareBuffer = nullptr;
285*d57664e9SAndroid Build Coastguard Worker     HardwareBufferRenderParams mBufferParams;
286*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<ReliableSurface> mNativeSurface;
287*d57664e9SAndroid Build Coastguard Worker     // The SurfaceControl reference is passed from ViewRootImpl, can be set to
288*d57664e9SAndroid Build Coastguard Worker     // NULL to remove the reference
289*d57664e9SAndroid Build Coastguard Worker     ASurfaceControl* mSurfaceControl = nullptr;
290*d57664e9SAndroid Build Coastguard Worker     // id to track surface control changes and WebViewFunctor uses it to determine
291*d57664e9SAndroid Build Coastguard Worker     // whether reparenting is needed also used by FrameMetricsReporter to determine
292*d57664e9SAndroid Build Coastguard Worker     // if a frame is from an "old" surface (i.e. one that existed before the
293*d57664e9SAndroid Build Coastguard Worker     // observer was attched) and therefore shouldn't be reported.
294*d57664e9SAndroid Build Coastguard Worker     // NOTE: It is important that this is an increasing counter.
295*d57664e9SAndroid Build Coastguard Worker     int32_t mSurfaceControlGenerationId = 0;
296*d57664e9SAndroid Build Coastguard Worker     // stopped indicates the CanvasContext will reject actual redraw operations,
297*d57664e9SAndroid Build Coastguard Worker     // and defer repaint until it is un-stopped
298*d57664e9SAndroid Build Coastguard Worker     bool mStopped = false;
299*d57664e9SAndroid Build Coastguard Worker     // Incremented each time the CanvasContext is stopped. Used to ignore
300*d57664e9SAndroid Build Coastguard Worker     // delayed messages that are triggered after stopping.
301*d57664e9SAndroid Build Coastguard Worker     int mGenerationID;
302*d57664e9SAndroid Build Coastguard Worker     // CanvasContext is dirty if it has received an update that it has not
303*d57664e9SAndroid Build Coastguard Worker     // painted onto its surface.
304*d57664e9SAndroid Build Coastguard Worker     bool mIsDirty = false;
305*d57664e9SAndroid Build Coastguard Worker     SwapBehavior mSwapBehavior = SwapBehavior::kSwap_default;
306*d57664e9SAndroid Build Coastguard Worker     struct SwapHistory {
307*d57664e9SAndroid Build Coastguard Worker         SkRect damage;
308*d57664e9SAndroid Build Coastguard Worker         nsecs_t vsyncTime;
309*d57664e9SAndroid Build Coastguard Worker         nsecs_t swapCompletedTime;
310*d57664e9SAndroid Build Coastguard Worker         nsecs_t dequeueDuration;
311*d57664e9SAndroid Build Coastguard Worker         nsecs_t queueDuration;
312*d57664e9SAndroid Build Coastguard Worker     };
313*d57664e9SAndroid Build Coastguard Worker 
314*d57664e9SAndroid Build Coastguard Worker     // Need at least 4 because we do quad buffer. Add a few more for good measure.
315*d57664e9SAndroid Build Coastguard Worker     RingBuffer<SwapHistory, 7> mSwapHistory;
316*d57664e9SAndroid Build Coastguard Worker     // Frame numbers start at 1, 0 means uninitialized
317*d57664e9SAndroid Build Coastguard Worker     uint64_t mFrameNumber = 0;
318*d57664e9SAndroid Build Coastguard Worker     int64_t mDamageId = 0;
319*d57664e9SAndroid Build Coastguard Worker 
320*d57664e9SAndroid Build Coastguard Worker     // last vsync for a dropped frame due to stuffed queue
321*d57664e9SAndroid Build Coastguard Worker     nsecs_t mLastDropVsync = 0;
322*d57664e9SAndroid Build Coastguard Worker 
323*d57664e9SAndroid Build Coastguard Worker     bool mOpaque;
324*d57664e9SAndroid Build Coastguard Worker     ForceDarkType mForceDarkType = ForceDarkType::NONE;
325*d57664e9SAndroid Build Coastguard Worker     LightInfo mLightInfo;
326*d57664e9SAndroid Build Coastguard Worker     LightGeometry mLightGeometry = {{0, 0, 0}, 0};
327*d57664e9SAndroid Build Coastguard Worker 
328*d57664e9SAndroid Build Coastguard Worker     bool mHaveNewSurface = false;
329*d57664e9SAndroid Build Coastguard Worker     DamageAccumulator mDamageAccumulator;
330*d57664e9SAndroid Build Coastguard Worker     LayerUpdateQueue mLayerUpdateQueue;
331*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<AnimationContext> mAnimationContext;
332*d57664e9SAndroid Build Coastguard Worker 
333*d57664e9SAndroid Build Coastguard Worker     std::vector<sp<RenderNode>> mRenderNodes;
334*d57664e9SAndroid Build Coastguard Worker 
335*d57664e9SAndroid Build Coastguard Worker     FrameInfo* mCurrentFrameInfo = nullptr;
336*d57664e9SAndroid Build Coastguard Worker 
337*d57664e9SAndroid Build Coastguard Worker     // List of data of frames that are awaiting GPU completion reporting. Used to compute frame
338*d57664e9SAndroid Build Coastguard Worker     // metrics and determine whether or not to report the metrics.
339*d57664e9SAndroid Build Coastguard Worker     RingBuffer<FrameMetricsInfo, 6> mLastFrameMetricsInfos
340*d57664e9SAndroid Build Coastguard Worker             GUARDED_BY(mLastFrameMetricsInfosMutex);
341*d57664e9SAndroid Build Coastguard Worker     std::mutex mLastFrameMetricsInfosMutex;
342*d57664e9SAndroid Build Coastguard Worker 
343*d57664e9SAndroid Build Coastguard Worker     std::string mName;
344*d57664e9SAndroid Build Coastguard Worker     JankTracker mJankTracker;
345*d57664e9SAndroid Build Coastguard Worker     FrameInfoVisualizer mProfiler;
346*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<FrameMetricsReporter> mFrameMetricsReporter GUARDED_BY(mFrameInfoMutex);
347*d57664e9SAndroid Build Coastguard Worker     std::mutex mFrameInfoMutex;
348*d57664e9SAndroid Build Coastguard Worker 
349*d57664e9SAndroid Build Coastguard Worker     std::set<RenderNode*> mPrefetchedLayers;
350*d57664e9SAndroid Build Coastguard Worker 
351*d57664e9SAndroid Build Coastguard Worker     // Stores the bounds of the main content.
352*d57664e9SAndroid Build Coastguard Worker     Rect mContentDrawBounds;
353*d57664e9SAndroid Build Coastguard Worker 
354*d57664e9SAndroid Build Coastguard Worker     std::vector<std::future<void>> mFrameFences;
355*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<IRenderPipeline> mRenderPipeline;
356*d57664e9SAndroid Build Coastguard Worker 
357*d57664e9SAndroid Build Coastguard Worker     std::vector<std::function<void(bool)>> mFrameCommitCallbacks;
358*d57664e9SAndroid Build Coastguard Worker 
359*d57664e9SAndroid Build Coastguard Worker     // If set to true, we expect that callbacks into onSurfaceStatsAvailable
360*d57664e9SAndroid Build Coastguard Worker     bool mExpectSurfaceStats = false;
361*d57664e9SAndroid Build Coastguard Worker 
362*d57664e9SAndroid Build Coastguard Worker     std::function<bool(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
363*d57664e9SAndroid Build Coastguard Worker     std::function<void()> mPrepareSurfaceControlForWebviewCallback;
364*d57664e9SAndroid Build Coastguard Worker 
365*d57664e9SAndroid Build Coastguard Worker     std::shared_ptr<HintSessionWrapper> mHintSessionWrapper;
366*d57664e9SAndroid Build Coastguard Worker     nsecs_t mLastDequeueBufferDuration = 0;
367*d57664e9SAndroid Build Coastguard Worker     nsecs_t mSyncDelayDuration = 0;
368*d57664e9SAndroid Build Coastguard Worker     nsecs_t mIdleDuration = 0;
369*d57664e9SAndroid Build Coastguard Worker 
370*d57664e9SAndroid Build Coastguard Worker     ColorMode mColorMode = ColorMode::Default;
371*d57664e9SAndroid Build Coastguard Worker     float mTargetSdrHdrRatio = 1.f;
372*d57664e9SAndroid Build Coastguard Worker 
373*d57664e9SAndroid Build Coastguard Worker     struct SkippedFrameInfo {
374*d57664e9SAndroid Build Coastguard Worker         int64_t vsyncId;
375*d57664e9SAndroid Build Coastguard Worker         int64_t startTime;
376*d57664e9SAndroid Build Coastguard Worker     };
377*d57664e9SAndroid Build Coastguard Worker     std::optional<SkippedFrameInfo> mSkippedFrameInfo;
378*d57664e9SAndroid Build Coastguard Worker };
379*d57664e9SAndroid Build Coastguard Worker 
380*d57664e9SAndroid Build Coastguard Worker } /* namespace renderthread */
381*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
382*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
383