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