1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2013 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 #ifndef RENDERTHREAD_H_ 18*d57664e9SAndroid Build Coastguard Worker #define RENDERTHREAD_H_ 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <SkBitmap.h> 21*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h> 22*d57664e9SAndroid Build Coastguard Worker #include <include/gpu/ganesh/GrDirectContext.h> 23*d57664e9SAndroid Build Coastguard Worker #include <surface_control_private.h> 24*d57664e9SAndroid Build Coastguard Worker #include <utils/Thread.h> 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker #include <memory> 27*d57664e9SAndroid Build Coastguard Worker #include <mutex> 28*d57664e9SAndroid Build Coastguard Worker #include <set> 29*d57664e9SAndroid Build Coastguard Worker 30*d57664e9SAndroid Build Coastguard Worker #include "CacheManager.h" 31*d57664e9SAndroid Build Coastguard Worker #include "MemoryPolicy.h" 32*d57664e9SAndroid Build Coastguard Worker #include "ProfileDataContainer.h" 33*d57664e9SAndroid Build Coastguard Worker #include "RenderTask.h" 34*d57664e9SAndroid Build Coastguard Worker #include "TimeLord.h" 35*d57664e9SAndroid Build Coastguard Worker #include "WebViewFunctorManager.h" 36*d57664e9SAndroid Build Coastguard Worker #include "thread/ThreadBase.h" 37*d57664e9SAndroid Build Coastguard Worker #include "utils/TimeUtils.h" 38*d57664e9SAndroid Build Coastguard Worker 39*d57664e9SAndroid Build Coastguard Worker namespace android { 40*d57664e9SAndroid Build Coastguard Worker 41*d57664e9SAndroid Build Coastguard Worker class Bitmap; 42*d57664e9SAndroid Build Coastguard Worker 43*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker class AutoBackendTextureRelease; 46*d57664e9SAndroid Build Coastguard Worker class Readback; 47*d57664e9SAndroid Build Coastguard Worker class RenderState; 48*d57664e9SAndroid Build Coastguard Worker class TestUtils; 49*d57664e9SAndroid Build Coastguard Worker 50*d57664e9SAndroid Build Coastguard Worker namespace skiapipeline { 51*d57664e9SAndroid Build Coastguard Worker class VkFunctorDrawHandler; 52*d57664e9SAndroid Build Coastguard Worker } 53*d57664e9SAndroid Build Coastguard Worker 54*d57664e9SAndroid Build Coastguard Worker namespace VectorDrawable { 55*d57664e9SAndroid Build Coastguard Worker class Tree; 56*d57664e9SAndroid Build Coastguard Worker } 57*d57664e9SAndroid Build Coastguard Worker 58*d57664e9SAndroid Build Coastguard Worker namespace renderthread { 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker class CanvasContext; 61*d57664e9SAndroid Build Coastguard Worker class EglManager; 62*d57664e9SAndroid Build Coastguard Worker class RenderProxy; 63*d57664e9SAndroid Build Coastguard Worker class VulkanManager; 64*d57664e9SAndroid Build Coastguard Worker 65*d57664e9SAndroid Build Coastguard Worker // Mimics android.view.Choreographer.FrameCallback 66*d57664e9SAndroid Build Coastguard Worker class IFrameCallback { 67*d57664e9SAndroid Build Coastguard Worker public: 68*d57664e9SAndroid Build Coastguard Worker virtual void doFrame() = 0; 69*d57664e9SAndroid Build Coastguard Worker 70*d57664e9SAndroid Build Coastguard Worker protected: ~IFrameCallback()71*d57664e9SAndroid Build Coastguard Worker virtual ~IFrameCallback() {} 72*d57664e9SAndroid Build Coastguard Worker }; 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker struct VsyncSource { 75*d57664e9SAndroid Build Coastguard Worker virtual void requestNextVsync() = 0; 76*d57664e9SAndroid Build Coastguard Worker virtual void drainPendingEvents() = 0; ~VsyncSourceVsyncSource77*d57664e9SAndroid Build Coastguard Worker virtual ~VsyncSource() {} 78*d57664e9SAndroid Build Coastguard Worker }; 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker typedef ASurfaceControl* (*ASC_create)(ASurfaceControl* parent, const char* debug_name); 81*d57664e9SAndroid Build Coastguard Worker typedef void (*ASC_acquire)(ASurfaceControl* control); 82*d57664e9SAndroid Build Coastguard Worker typedef void (*ASC_release)(ASurfaceControl* control); 83*d57664e9SAndroid Build Coastguard Worker 84*d57664e9SAndroid Build Coastguard Worker typedef void (*ASC_registerSurfaceStatsListener)(ASurfaceControl* control, int32_t id, 85*d57664e9SAndroid Build Coastguard Worker void* context, 86*d57664e9SAndroid Build Coastguard Worker ASurfaceControl_SurfaceStatsListener func); 87*d57664e9SAndroid Build Coastguard Worker typedef void (*ASC_unregisterSurfaceStatsListener)(void* context, 88*d57664e9SAndroid Build Coastguard Worker ASurfaceControl_SurfaceStatsListener func); 89*d57664e9SAndroid Build Coastguard Worker 90*d57664e9SAndroid Build Coastguard Worker typedef int64_t (*ASCStats_getAcquireTime)(ASurfaceControlStats* stats); 91*d57664e9SAndroid Build Coastguard Worker typedef uint64_t (*ASCStats_getFrameNumber)(ASurfaceControlStats* stats); 92*d57664e9SAndroid Build Coastguard Worker 93*d57664e9SAndroid Build Coastguard Worker typedef ASurfaceTransaction* (*AST_create)(); 94*d57664e9SAndroid Build Coastguard Worker typedef void (*AST_delete)(ASurfaceTransaction* transaction); 95*d57664e9SAndroid Build Coastguard Worker typedef void (*AST_apply)(ASurfaceTransaction* transaction); 96*d57664e9SAndroid Build Coastguard Worker typedef void (*AST_reparent)(ASurfaceTransaction* aSurfaceTransaction, 97*d57664e9SAndroid Build Coastguard Worker ASurfaceControl* aSurfaceControl, 98*d57664e9SAndroid Build Coastguard Worker ASurfaceControl* newParentASurfaceControl); 99*d57664e9SAndroid Build Coastguard Worker typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction, 100*d57664e9SAndroid Build Coastguard Worker ASurfaceControl* surface_control, int8_t visibility); 101*d57664e9SAndroid Build Coastguard Worker typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control, 102*d57664e9SAndroid Build Coastguard Worker int32_t z_order); 103*d57664e9SAndroid Build Coastguard Worker 104*d57664e9SAndroid Build Coastguard Worker struct ASurfaceControlFunctions { 105*d57664e9SAndroid Build Coastguard Worker ASurfaceControlFunctions(); 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker ASC_create createFunc; 108*d57664e9SAndroid Build Coastguard Worker ASC_acquire acquireFunc; 109*d57664e9SAndroid Build Coastguard Worker ASC_release releaseFunc; 110*d57664e9SAndroid Build Coastguard Worker ASC_registerSurfaceStatsListener registerListenerFunc; 111*d57664e9SAndroid Build Coastguard Worker ASC_unregisterSurfaceStatsListener unregisterListenerFunc; 112*d57664e9SAndroid Build Coastguard Worker ASCStats_getAcquireTime getAcquireTimeFunc; 113*d57664e9SAndroid Build Coastguard Worker ASCStats_getFrameNumber getFrameNumberFunc; 114*d57664e9SAndroid Build Coastguard Worker 115*d57664e9SAndroid Build Coastguard Worker AST_create transactionCreateFunc; 116*d57664e9SAndroid Build Coastguard Worker AST_delete transactionDeleteFunc; 117*d57664e9SAndroid Build Coastguard Worker AST_apply transactionApplyFunc; 118*d57664e9SAndroid Build Coastguard Worker AST_reparent transactionReparentFunc; 119*d57664e9SAndroid Build Coastguard Worker AST_setVisibility transactionSetVisibilityFunc; 120*d57664e9SAndroid Build Coastguard Worker AST_setZOrder transactionSetZOrderFunc; 121*d57664e9SAndroid Build Coastguard Worker }; 122*d57664e9SAndroid Build Coastguard Worker 123*d57664e9SAndroid Build Coastguard Worker class ChoreographerSource; 124*d57664e9SAndroid Build Coastguard Worker class DummyVsyncSource; 125*d57664e9SAndroid Build Coastguard Worker 126*d57664e9SAndroid Build Coastguard Worker typedef void (*JVMAttachHook)(const char* name); 127*d57664e9SAndroid Build Coastguard Worker 128*d57664e9SAndroid Build Coastguard Worker class RenderThread : private ThreadBase { 129*d57664e9SAndroid Build Coastguard Worker PREVENT_COPY_AND_ASSIGN(RenderThread); 130*d57664e9SAndroid Build Coastguard Worker 131*d57664e9SAndroid Build Coastguard Worker public: 132*d57664e9SAndroid Build Coastguard Worker // Sets a callback that fires before any RenderThread setup has occurred. 133*d57664e9SAndroid Build Coastguard Worker static void setOnStartHook(JVMAttachHook onStartHook); 134*d57664e9SAndroid Build Coastguard Worker static JVMAttachHook getOnStartHook(); 135*d57664e9SAndroid Build Coastguard Worker queue()136*d57664e9SAndroid Build Coastguard Worker WorkQueue& queue() { return ThreadBase::queue(); } 137*d57664e9SAndroid Build Coastguard Worker 138*d57664e9SAndroid Build Coastguard Worker // Mimics android.view.Choreographer 139*d57664e9SAndroid Build Coastguard Worker void postFrameCallback(IFrameCallback* callback); 140*d57664e9SAndroid Build Coastguard Worker bool removeFrameCallback(IFrameCallback* callback); 141*d57664e9SAndroid Build Coastguard Worker // If the callback is currently registered, it will be pushed back until 142*d57664e9SAndroid Build Coastguard Worker // the next vsync. If it is not currently registered this does nothing. 143*d57664e9SAndroid Build Coastguard Worker void pushBackFrameCallback(IFrameCallback* callback); 144*d57664e9SAndroid Build Coastguard Worker timeLord()145*d57664e9SAndroid Build Coastguard Worker TimeLord& timeLord() { return mTimeLord; } renderState()146*d57664e9SAndroid Build Coastguard Worker RenderState& renderState() const { return *mRenderState; } eglManager()147*d57664e9SAndroid Build Coastguard Worker EglManager& eglManager() const { return *mEglManager; } globalProfileData()148*d57664e9SAndroid Build Coastguard Worker ProfileDataContainer& globalProfileData() { return mGlobalProfileData; } getJankDataMutex()149*d57664e9SAndroid Build Coastguard Worker std::mutex& getJankDataMutex() { return mJankDataMutex; } 150*d57664e9SAndroid Build Coastguard Worker Readback& readback(); 151*d57664e9SAndroid Build Coastguard Worker getGrContext()152*d57664e9SAndroid Build Coastguard Worker GrDirectContext* getGrContext() const { return mGrContext.get(); } 153*d57664e9SAndroid Build Coastguard Worker void setGrContext(sk_sp<GrDirectContext> cxt); 154*d57664e9SAndroid Build Coastguard Worker sk_sp<GrDirectContext> requireGrContext(); 155*d57664e9SAndroid Build Coastguard Worker cacheManager()156*d57664e9SAndroid Build Coastguard Worker CacheManager& cacheManager() { return *mCacheManager; } 157*d57664e9SAndroid Build Coastguard Worker VulkanManager& vulkanManager(); 158*d57664e9SAndroid Build Coastguard Worker 159*d57664e9SAndroid Build Coastguard Worker sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& skBitmap); 160*d57664e9SAndroid Build Coastguard Worker void dumpGraphicsMemory(int fd, bool includeProfileData); 161*d57664e9SAndroid Build Coastguard Worker void getMemoryUsage(size_t* cpuUsage, size_t* gpuUsage); 162*d57664e9SAndroid Build Coastguard Worker 163*d57664e9SAndroid Build Coastguard Worker void requireGlContext(); 164*d57664e9SAndroid Build Coastguard Worker void requireVkContext(); 165*d57664e9SAndroid Build Coastguard Worker void destroyRenderingContext(); 166*d57664e9SAndroid Build Coastguard Worker 167*d57664e9SAndroid Build Coastguard Worker void preload(); 168*d57664e9SAndroid Build Coastguard Worker getASurfaceControlFunctions()169*d57664e9SAndroid Build Coastguard Worker const ASurfaceControlFunctions& getASurfaceControlFunctions() { 170*d57664e9SAndroid Build Coastguard Worker return mASurfaceControlFunctions; 171*d57664e9SAndroid Build Coastguard Worker } 172*d57664e9SAndroid Build Coastguard Worker 173*d57664e9SAndroid Build Coastguard Worker void trimMemory(TrimLevel level); 174*d57664e9SAndroid Build Coastguard Worker void trimCaches(CacheTrimLevel level); 175*d57664e9SAndroid Build Coastguard Worker 176*d57664e9SAndroid Build Coastguard Worker /** 177*d57664e9SAndroid Build Coastguard Worker * isCurrent provides a way to query, if the caller is running on 178*d57664e9SAndroid Build Coastguard Worker * the render thread. 179*d57664e9SAndroid Build Coastguard Worker * 180*d57664e9SAndroid Build Coastguard Worker * @return true only if isCurrent is invoked from the render thread. 181*d57664e9SAndroid Build Coastguard Worker */ 182*d57664e9SAndroid Build Coastguard Worker static bool isCurrent(); 183*d57664e9SAndroid Build Coastguard Worker 184*d57664e9SAndroid Build Coastguard Worker static void initGrContextOptions(GrContextOptions& options); 185*d57664e9SAndroid Build Coastguard Worker 186*d57664e9SAndroid Build Coastguard Worker protected: 187*d57664e9SAndroid Build Coastguard Worker virtual bool threadLoop() override; 188*d57664e9SAndroid Build Coastguard Worker 189*d57664e9SAndroid Build Coastguard Worker private: 190*d57664e9SAndroid Build Coastguard Worker friend class DispatchFrameCallbacks; 191*d57664e9SAndroid Build Coastguard Worker friend class RenderProxy; 192*d57664e9SAndroid Build Coastguard Worker friend class DummyVsyncSource; 193*d57664e9SAndroid Build Coastguard Worker friend class ChoreographerSource; 194*d57664e9SAndroid Build Coastguard Worker friend class android::uirenderer::AutoBackendTextureRelease; 195*d57664e9SAndroid Build Coastguard Worker friend class android::uirenderer::TestUtils; 196*d57664e9SAndroid Build Coastguard Worker friend class android::uirenderer::WebViewFunctor; 197*d57664e9SAndroid Build Coastguard Worker friend class android::uirenderer::skiapipeline::VkFunctorDrawHandler; 198*d57664e9SAndroid Build Coastguard Worker friend class android::uirenderer::VectorDrawable::Tree; 199*d57664e9SAndroid Build Coastguard Worker friend class sp<RenderThread>; 200*d57664e9SAndroid Build Coastguard Worker 201*d57664e9SAndroid Build Coastguard Worker RenderThread(); 202*d57664e9SAndroid Build Coastguard Worker virtual ~RenderThread(); 203*d57664e9SAndroid Build Coastguard Worker 204*d57664e9SAndroid Build Coastguard Worker static bool hasInstance(); 205*d57664e9SAndroid Build Coastguard Worker static RenderThread& getInstance(); 206*d57664e9SAndroid Build Coastguard Worker 207*d57664e9SAndroid Build Coastguard Worker void initThreadLocals(); 208*d57664e9SAndroid Build Coastguard Worker void initializeChoreographer(); 209*d57664e9SAndroid Build Coastguard Worker void setupFrameInterval(); 210*d57664e9SAndroid Build Coastguard Worker // Callbacks for choreographer events: 211*d57664e9SAndroid Build Coastguard Worker // choreographerCallback will call AChoreograper_handleEvent to call the 212*d57664e9SAndroid Build Coastguard Worker // corresponding callbacks for each display event type 213*d57664e9SAndroid Build Coastguard Worker static int choreographerCallback(int fd, int events, void* data); 214*d57664e9SAndroid Build Coastguard Worker // Callback that will be run on vsync ticks. 215*d57664e9SAndroid Build Coastguard Worker static void extendedFrameCallback(const AChoreographerFrameCallbackData* cbData, void* data); 216*d57664e9SAndroid Build Coastguard Worker void frameCallback(int64_t vsyncId, int64_t frameDeadline, int64_t frameTimeNanos, 217*d57664e9SAndroid Build Coastguard Worker int64_t frameInterval); 218*d57664e9SAndroid Build Coastguard Worker // Callback that will be run whenver there is a refresh rate change. 219*d57664e9SAndroid Build Coastguard Worker static void refreshRateCallback(int64_t vsyncPeriod, void* data); 220*d57664e9SAndroid Build Coastguard Worker void drainDisplayEventQueue(); 221*d57664e9SAndroid Build Coastguard Worker void dispatchFrameCallbacks(); 222*d57664e9SAndroid Build Coastguard Worker void requestVsync(); 223*d57664e9SAndroid Build Coastguard Worker 224*d57664e9SAndroid Build Coastguard Worker AChoreographer* mChoreographer; 225*d57664e9SAndroid Build Coastguard Worker VsyncSource* mVsyncSource; 226*d57664e9SAndroid Build Coastguard Worker bool mVsyncRequested; 227*d57664e9SAndroid Build Coastguard Worker std::set<IFrameCallback*> mFrameCallbacks; 228*d57664e9SAndroid Build Coastguard Worker // We defer the actual registration of these callbacks until 229*d57664e9SAndroid Build Coastguard Worker // both mQueue *and* mDisplayEventReceiver have been drained off all 230*d57664e9SAndroid Build Coastguard Worker // immediate events. This makes sure that we catch the next vsync, not 231*d57664e9SAndroid Build Coastguard Worker // the previous one 232*d57664e9SAndroid Build Coastguard Worker std::set<IFrameCallback*> mPendingRegistrationFrameCallbacks; 233*d57664e9SAndroid Build Coastguard Worker bool mFrameCallbackTaskPending; 234*d57664e9SAndroid Build Coastguard Worker 235*d57664e9SAndroid Build Coastguard Worker TimeLord mTimeLord; 236*d57664e9SAndroid Build Coastguard Worker RenderState* mRenderState; 237*d57664e9SAndroid Build Coastguard Worker EglManager* mEglManager; 238*d57664e9SAndroid Build Coastguard Worker WebViewFunctorManager& mFunctorManager; 239*d57664e9SAndroid Build Coastguard Worker 240*d57664e9SAndroid Build Coastguard Worker ProfileDataContainer mGlobalProfileData; 241*d57664e9SAndroid Build Coastguard Worker Readback* mReadback = nullptr; 242*d57664e9SAndroid Build Coastguard Worker 243*d57664e9SAndroid Build Coastguard Worker sk_sp<GrDirectContext> mGrContext; 244*d57664e9SAndroid Build Coastguard Worker CacheManager* mCacheManager; 245*d57664e9SAndroid Build Coastguard Worker sp<VulkanManager> mVkManager; 246*d57664e9SAndroid Build Coastguard Worker 247*d57664e9SAndroid Build Coastguard Worker ASurfaceControlFunctions mASurfaceControlFunctions; 248*d57664e9SAndroid Build Coastguard Worker std::mutex mJankDataMutex; 249*d57664e9SAndroid Build Coastguard Worker }; 250*d57664e9SAndroid Build Coastguard Worker 251*d57664e9SAndroid Build Coastguard Worker } /* namespace renderthread */ 252*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 253*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 254*d57664e9SAndroid Build Coastguard Worker #endif /* RENDERTHREAD_H_ */ 255