xref: /aosp_15_r20/frameworks/base/libs/hwui/renderthread/RenderThread.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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