xref: /aosp_15_r20/frameworks/base/libs/hwui/WebViewFunctorManager.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2018 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 <private/hwui/WebViewFunctor.h>
20*d57664e9SAndroid Build Coastguard Worker #include <renderthread/RenderProxy.h>
21*d57664e9SAndroid Build Coastguard Worker #include <utils/LightRefBase.h>
22*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker #include <mutex>
26*d57664e9SAndroid Build Coastguard Worker #include <vector>
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker namespace android::uirenderer {
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker class WebViewFunctorManager;
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker class WebViewFunctor {
33*d57664e9SAndroid Build Coastguard Worker public:
34*d57664e9SAndroid Build Coastguard Worker     WebViewFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode);
35*d57664e9SAndroid Build Coastguard Worker     ~WebViewFunctor();
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     class Handle : public LightRefBase<Handle> {
38*d57664e9SAndroid Build Coastguard Worker     public:
~Handle()39*d57664e9SAndroid Build Coastguard Worker         ~Handle() { renderthread::RenderProxy::destroyFunctor(id()); }
40*d57664e9SAndroid Build Coastguard Worker 
id()41*d57664e9SAndroid Build Coastguard Worker         int id() const { return mReference.id(); }
42*d57664e9SAndroid Build Coastguard Worker 
sync(const WebViewSyncData & syncData)43*d57664e9SAndroid Build Coastguard Worker         void sync(const WebViewSyncData& syncData) const { mReference.sync(syncData); }
44*d57664e9SAndroid Build Coastguard Worker 
drawGl(const DrawGlInfo & drawInfo)45*d57664e9SAndroid Build Coastguard Worker         void drawGl(const DrawGlInfo& drawInfo) const { mReference.drawGl(drawInfo); }
46*d57664e9SAndroid Build Coastguard Worker 
initVk(const VkFunctorInitParams & params)47*d57664e9SAndroid Build Coastguard Worker         void initVk(const VkFunctorInitParams& params) { mReference.initVk(params); }
48*d57664e9SAndroid Build Coastguard Worker 
drawVk(const VkFunctorDrawParams & params)49*d57664e9SAndroid Build Coastguard Worker         void drawVk(const VkFunctorDrawParams& params) { mReference.drawVk(params); }
50*d57664e9SAndroid Build Coastguard Worker 
postDrawVk()51*d57664e9SAndroid Build Coastguard Worker         void postDrawVk() { mReference.postDrawVk(); }
52*d57664e9SAndroid Build Coastguard Worker 
removeOverlays()53*d57664e9SAndroid Build Coastguard Worker         void removeOverlays() { mReference.removeOverlays(); }
54*d57664e9SAndroid Build Coastguard Worker 
onRemovedFromTree()55*d57664e9SAndroid Build Coastguard Worker         void onRemovedFromTree() { mReference.onRemovedFromTree(); }
56*d57664e9SAndroid Build Coastguard Worker 
getRenderingThreads()57*d57664e9SAndroid Build Coastguard Worker         const std::vector<pid_t>& getRenderingThreads() const {
58*d57664e9SAndroid Build Coastguard Worker             return mReference.getRenderingThreads();
59*d57664e9SAndroid Build Coastguard Worker         }
60*d57664e9SAndroid Build Coastguard Worker 
61*d57664e9SAndroid Build Coastguard Worker     private:
62*d57664e9SAndroid Build Coastguard Worker         friend class WebViewFunctor;
63*d57664e9SAndroid Build Coastguard Worker 
Handle(WebViewFunctor & ref)64*d57664e9SAndroid Build Coastguard Worker         Handle(WebViewFunctor& ref) : mReference(ref) {}
65*d57664e9SAndroid Build Coastguard Worker 
66*d57664e9SAndroid Build Coastguard Worker         WebViewFunctor& mReference;
67*d57664e9SAndroid Build Coastguard Worker     };
68*d57664e9SAndroid Build Coastguard Worker 
id()69*d57664e9SAndroid Build Coastguard Worker     int id() const { return mFunctor; }
70*d57664e9SAndroid Build Coastguard Worker     void sync(const WebViewSyncData& syncData) const;
71*d57664e9SAndroid Build Coastguard Worker     void drawGl(const DrawGlInfo& drawInfo);
72*d57664e9SAndroid Build Coastguard Worker     void initVk(const VkFunctorInitParams& params);
73*d57664e9SAndroid Build Coastguard Worker     void drawVk(const VkFunctorDrawParams& params);
74*d57664e9SAndroid Build Coastguard Worker     void postDrawVk();
75*d57664e9SAndroid Build Coastguard Worker     void destroyContext();
76*d57664e9SAndroid Build Coastguard Worker     void removeOverlays();
77*d57664e9SAndroid Build Coastguard Worker     void onRemovedFromTree();
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker     ASurfaceControl* getSurfaceControl();
80*d57664e9SAndroid Build Coastguard Worker     void mergeTransaction(ASurfaceTransaction* transaction);
81*d57664e9SAndroid Build Coastguard Worker 
82*d57664e9SAndroid Build Coastguard Worker     void reportRenderingThreads(const pid_t* thread_ids, size_t size);
getRenderingThreads()83*d57664e9SAndroid Build Coastguard Worker     const std::vector<pid_t>& getRenderingThreads() const { return mRenderingThreads; }
84*d57664e9SAndroid Build Coastguard Worker 
createHandle()85*d57664e9SAndroid Build Coastguard Worker     sp<Handle> createHandle() {
86*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(mCreatedHandle);
87*d57664e9SAndroid Build Coastguard Worker         mCreatedHandle = true;
88*d57664e9SAndroid Build Coastguard Worker         return sp<Handle>{new Handle(*this)};
89*d57664e9SAndroid Build Coastguard Worker     }
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker private:
92*d57664e9SAndroid Build Coastguard Worker     bool prepareRootSurfaceControl();
93*d57664e9SAndroid Build Coastguard Worker     void reparentSurfaceControl(ASurfaceControl* parent);
94*d57664e9SAndroid Build Coastguard Worker 
95*d57664e9SAndroid Build Coastguard Worker private:
96*d57664e9SAndroid Build Coastguard Worker     WebViewFunctorCallbacks mCallbacks;
97*d57664e9SAndroid Build Coastguard Worker     void* const mData;
98*d57664e9SAndroid Build Coastguard Worker     int mFunctor;
99*d57664e9SAndroid Build Coastguard Worker     RenderMode mMode;
100*d57664e9SAndroid Build Coastguard Worker     bool mHasContext = false;
101*d57664e9SAndroid Build Coastguard Worker     bool mCreatedHandle = false;
102*d57664e9SAndroid Build Coastguard Worker     int32_t mParentSurfaceControlGenerationId = 0;
103*d57664e9SAndroid Build Coastguard Worker     ASurfaceControl* mSurfaceControl = nullptr;
104*d57664e9SAndroid Build Coastguard Worker     std::vector<pid_t> mRenderingThreads;
105*d57664e9SAndroid Build Coastguard Worker };
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker class WebViewFunctorManager {
108*d57664e9SAndroid Build Coastguard Worker public:
109*d57664e9SAndroid Build Coastguard Worker     static WebViewFunctorManager& instance();
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     int createFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode);
112*d57664e9SAndroid Build Coastguard Worker     void releaseFunctor(int functor);
113*d57664e9SAndroid Build Coastguard Worker     void onContextDestroyed();
114*d57664e9SAndroid Build Coastguard Worker     void destroyFunctor(int functor);
115*d57664e9SAndroid Build Coastguard Worker     void reportRenderingThreads(int functor, const pid_t* thread_ids, size_t size);
116*d57664e9SAndroid Build Coastguard Worker     std::vector<pid_t> getRenderingThreadsForActiveFunctors();
117*d57664e9SAndroid Build Coastguard Worker 
118*d57664e9SAndroid Build Coastguard Worker     sp<WebViewFunctor::Handle> handleFor(int functor);
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker private:
121*d57664e9SAndroid Build Coastguard Worker     WebViewFunctorManager() = default;
122*d57664e9SAndroid Build Coastguard Worker     ~WebViewFunctorManager() = default;
123*d57664e9SAndroid Build Coastguard Worker 
124*d57664e9SAndroid Build Coastguard Worker     std::mutex mLock;
125*d57664e9SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<WebViewFunctor>> mFunctors;
126*d57664e9SAndroid Build Coastguard Worker     std::vector<sp<WebViewFunctor::Handle>> mActiveFunctors;
127*d57664e9SAndroid Build Coastguard Worker };
128*d57664e9SAndroid Build Coastguard Worker 
129*d57664e9SAndroid Build Coastguard Worker }  // namespace android::uirenderer
130