1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <private/hwui/WebViewFunctor.h> 20 #ifdef __ANDROID__ // Layoutlib does not support render thread 21 #include <renderthread/RenderProxy.h> 22 #else 23 #include <utils/Log.h> 24 #endif 25 26 #include <utils/LightRefBase.h> 27 #include <mutex> 28 #include <vector> 29 30 namespace android::uirenderer { 31 32 class WebViewFunctorManager; 33 34 class WebViewFunctor { 35 public: 36 WebViewFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode); 37 ~WebViewFunctor(); 38 39 class Handle : public LightRefBase<Handle> { 40 public: ~Handle()41 ~Handle() { 42 #ifdef __ANDROID__ // Layoutlib does not support render thread 43 renderthread::RenderProxy::destroyFunctor(id()); 44 #endif 45 } 46 id()47 int id() const { return mReference.id(); } 48 sync(const WebViewSyncData & syncData)49 void sync(const WebViewSyncData& syncData) const { mReference.sync(syncData); } 50 drawGl(const DrawGlInfo & drawInfo)51 void drawGl(const DrawGlInfo& drawInfo) const { mReference.drawGl(drawInfo); } 52 initVk(const VkFunctorInitParams & params)53 void initVk(const VkFunctorInitParams& params) { mReference.initVk(params); } 54 drawVk(const VkFunctorDrawParams & params)55 void drawVk(const VkFunctorDrawParams& params) { mReference.drawVk(params); } 56 postDrawVk()57 void postDrawVk() { mReference.postDrawVk(); } 58 59 private: 60 friend class WebViewFunctor; 61 Handle(WebViewFunctor & ref)62 Handle(WebViewFunctor& ref) : mReference(ref) {} 63 64 WebViewFunctor& mReference; 65 }; 66 id()67 int id() const { return mFunctor; } 68 void sync(const WebViewSyncData& syncData) const; 69 void drawGl(const DrawGlInfo& drawInfo); 70 void initVk(const VkFunctorInitParams& params); 71 void drawVk(const VkFunctorDrawParams& params); 72 void postDrawVk(); 73 void destroyContext(); 74 createHandle()75 sp<Handle> createHandle() { 76 LOG_ALWAYS_FATAL_IF(mCreatedHandle); 77 mCreatedHandle = true; 78 return sp<Handle>{new Handle(*this)}; 79 } 80 81 private: 82 WebViewFunctorCallbacks mCallbacks; 83 void* const mData; 84 int mFunctor; 85 RenderMode mMode; 86 bool mHasContext = false; 87 bool mCreatedHandle = false; 88 }; 89 90 class WebViewFunctorManager { 91 public: 92 static WebViewFunctorManager& instance(); 93 94 int createFunctor(void* data, const WebViewFunctorCallbacks& callbacks, RenderMode functorMode); 95 void releaseFunctor(int functor); 96 void onContextDestroyed(); 97 void destroyFunctor(int functor); 98 99 sp<WebViewFunctor::Handle> handleFor(int functor); 100 101 private: 102 WebViewFunctorManager() = default; 103 ~WebViewFunctorManager() = default; 104 105 std::mutex mLock; 106 std::vector<std::unique_ptr<WebViewFunctor>> mFunctors; 107 std::vector<sp<WebViewFunctor::Handle>> mActiveFunctors; 108 }; 109 110 } // namespace android::uirenderer 111