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