Loading libs/hwui/WebViewFunctorManager.cpp +20 −1 Original line number Diff line number Diff line Loading @@ -126,7 +126,14 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) { renderthread::CanvasContext::getActiveContext(); if (activeContext != nullptr) { ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl(); if (rootSurfaceControl) overlayParams.overlaysMode = OverlaysMode::Enabled; if (rootSurfaceControl) { overlayParams.overlaysMode = OverlaysMode::Enabled; int32_t rgid = activeContext->getSurfaceControlGenerationId(); if (mParentSurfaceControlGenerationId != rgid) { reparentSurfaceControl(rootSurfaceControl); mParentSurfaceControlGenerationId = rgid; } } } } Loading Loading @@ -195,6 +202,7 @@ ASurfaceControl* WebViewFunctor::getSurfaceControl() { LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!"); auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId(); mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl"); ASurfaceTransaction* transaction = funcs.transactionCreateFunc(); activeContext->prepareSurfaceControlForWebview(); Loading @@ -218,6 +226,17 @@ void WebViewFunctor::mergeTransaction(ASurfaceTransaction* transaction) { } } void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) { ATRACE_NAME("WebViewFunctor::reparentSurfaceControl"); if (mSurfaceControl == nullptr) return; auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); ASurfaceTransaction* transaction = funcs.transactionCreateFunc(); funcs.transactionReparentFunc(transaction, mSurfaceControl, parent); mergeTransaction(transaction); funcs.transactionDeleteFunc(transaction); } WebViewFunctorManager& WebViewFunctorManager::instance() { static WebViewFunctorManager sInstance; return sInstance; Loading libs/hwui/WebViewFunctorManager.h +4 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ public: return sp<Handle>{new Handle(*this)}; } private: void reparentSurfaceControl(ASurfaceControl* parent); private: WebViewFunctorCallbacks mCallbacks; void* const mData; Loading @@ -91,6 +94,7 @@ private: RenderMode mMode; bool mHasContext = false; bool mCreatedHandle = false; int32_t mParentSurfaceControlGenerationId = 0; ASurfaceControl* mSurfaceControl = nullptr; }; Loading libs/hwui/renderthread/CanvasContext.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) { funcs.releaseFunc(mSurfaceControl); } mSurfaceControl = surfaceControl; mSurfaceControlGenerationId++; mExpectSurfaceStats = surfaceControl != nullptr; if (mSurfaceControl != nullptr) { funcs.acquireFunc(mSurfaceControl); Loading libs/hwui/renderthread/CanvasContext.h +4 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ public: GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); } ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; } int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; } // Won't take effect until next EGLSurface creation void setSwapBehavior(SwapBehavior swapBehavior); Loading Loading @@ -253,6 +254,9 @@ private: // The SurfaceControl reference is passed from ViewRootImpl, can be set to // NULL to remove the reference ASurfaceControl* mSurfaceControl = nullptr; // id to track surface control changes and WebViewFunctor uses it to determine // whether reparenting is needed int32_t mSurfaceControlGenerationId = 0; // stopped indicates the CanvasContext will reject actual redraw operations, // and defer repaint until it is un-stopped bool mStopped = false; Loading libs/hwui/renderthread/RenderThread.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,10 @@ ASurfaceControlFunctions::ASurfaceControlFunctions() { LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr, "Failed to find required symbol ASurfaceTransaction_apply!"); transactionReparentFunc = (AST_reparent)dlsym(handle_, "ASurfaceTransaction_reparent"); LOG_ALWAYS_FATAL_IF(transactionReparentFunc == nullptr, "Failed to find required symbol transactionReparentFunc!"); transactionSetVisibilityFunc = (AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility"); LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr, Loading Loading
libs/hwui/WebViewFunctorManager.cpp +20 −1 Original line number Diff line number Diff line Loading @@ -126,7 +126,14 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) { renderthread::CanvasContext::getActiveContext(); if (activeContext != nullptr) { ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl(); if (rootSurfaceControl) overlayParams.overlaysMode = OverlaysMode::Enabled; if (rootSurfaceControl) { overlayParams.overlaysMode = OverlaysMode::Enabled; int32_t rgid = activeContext->getSurfaceControlGenerationId(); if (mParentSurfaceControlGenerationId != rgid) { reparentSurfaceControl(rootSurfaceControl); mParentSurfaceControlGenerationId = rgid; } } } } Loading Loading @@ -195,6 +202,7 @@ ASurfaceControl* WebViewFunctor::getSurfaceControl() { LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!"); auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId(); mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl"); ASurfaceTransaction* transaction = funcs.transactionCreateFunc(); activeContext->prepareSurfaceControlForWebview(); Loading @@ -218,6 +226,17 @@ void WebViewFunctor::mergeTransaction(ASurfaceTransaction* transaction) { } } void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) { ATRACE_NAME("WebViewFunctor::reparentSurfaceControl"); if (mSurfaceControl == nullptr) return; auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); ASurfaceTransaction* transaction = funcs.transactionCreateFunc(); funcs.transactionReparentFunc(transaction, mSurfaceControl, parent); mergeTransaction(transaction); funcs.transactionDeleteFunc(transaction); } WebViewFunctorManager& WebViewFunctorManager::instance() { static WebViewFunctorManager sInstance; return sInstance; Loading
libs/hwui/WebViewFunctorManager.h +4 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ public: return sp<Handle>{new Handle(*this)}; } private: void reparentSurfaceControl(ASurfaceControl* parent); private: WebViewFunctorCallbacks mCallbacks; void* const mData; Loading @@ -91,6 +94,7 @@ private: RenderMode mMode; bool mHasContext = false; bool mCreatedHandle = false; int32_t mParentSurfaceControlGenerationId = 0; ASurfaceControl* mSurfaceControl = nullptr; }; Loading
libs/hwui/renderthread/CanvasContext.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) { funcs.releaseFunc(mSurfaceControl); } mSurfaceControl = surfaceControl; mSurfaceControlGenerationId++; mExpectSurfaceStats = surfaceControl != nullptr; if (mSurfaceControl != nullptr) { funcs.acquireFunc(mSurfaceControl); Loading
libs/hwui/renderthread/CanvasContext.h +4 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ public: GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); } ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; } int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; } // Won't take effect until next EGLSurface creation void setSwapBehavior(SwapBehavior swapBehavior); Loading Loading @@ -253,6 +254,9 @@ private: // The SurfaceControl reference is passed from ViewRootImpl, can be set to // NULL to remove the reference ASurfaceControl* mSurfaceControl = nullptr; // id to track surface control changes and WebViewFunctor uses it to determine // whether reparenting is needed int32_t mSurfaceControlGenerationId = 0; // stopped indicates the CanvasContext will reject actual redraw operations, // and defer repaint until it is un-stopped bool mStopped = false; Loading
libs/hwui/renderthread/RenderThread.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,10 @@ ASurfaceControlFunctions::ASurfaceControlFunctions() { LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr, "Failed to find required symbol ASurfaceTransaction_apply!"); transactionReparentFunc = (AST_reparent)dlsym(handle_, "ASurfaceTransaction_reparent"); LOG_ALWAYS_FATAL_IF(transactionReparentFunc == nullptr, "Failed to find required symbol transactionReparentFunc!"); transactionSetVisibilityFunc = (AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility"); LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr, Loading