diff options
author | 2021-11-17 13:50:56 -0500 | |
---|---|---|
committer | 2021-11-17 19:29:46 +0000 | |
commit | 372a21b3aac26e18b4b4ab34944deffe69f4d999 (patch) | |
tree | 010ce0ff14bad7d96a646f8d5ca6a55949904d15 | |
parent | f3a0bf47cae14292a44d11f3f9b65c28d13226c7 (diff) |
Enable WebView overlays for Vulkan
This CL uses new skia api to determine if we're drawing on screen or
offscreen for vulkan and enables overlays when possible.
Bug: 185730234
Test: manual
Change-Id: Ib7748535431e4dc56b1af6d7ccc729b3b649df96
-rw-r--r-- | libs/hwui/WebViewFunctorManager.cpp | 39 | ||||
-rw-r--r-- | libs/hwui/WebViewFunctorManager.h | 1 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/VkFunctorDrawable.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/private/hwui/DrawVkInfo.h | 3 | ||||
-rw-r--r-- | libs/hwui/renderthread/VulkanSurface.cpp | 2 |
5 files changed, 30 insertions, 16 deletions
diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp index 5aad821ad59f..6fc251dc815c 100644 --- a/libs/hwui/WebViewFunctorManager.cpp +++ b/libs/hwui/WebViewFunctorManager.cpp @@ -118,6 +118,24 @@ void WebViewFunctor::onRemovedFromTree() { } } +bool WebViewFunctor::prepareRootSurfaceControl() { + if (!Properties::enableWebViewOverlays) return false; + + renderthread::CanvasContext* activeContext = renderthread::CanvasContext::getActiveContext(); + if (!activeContext) return false; + + ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl(); + if (!rootSurfaceControl) return false; + + int32_t rgid = activeContext->getSurfaceControlGenerationId(); + if (mParentSurfaceControlGenerationId != rgid) { + reparentSurfaceControl(rootSurfaceControl); + mParentSurfaceControlGenerationId = rgid; + } + + return true; +} + void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) { ATRACE_NAME("WebViewFunctor::drawGl"); if (!mHasContext) { @@ -131,20 +149,8 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) { .mergeTransaction = currentFunctor.mergeTransaction, }; - if (Properties::enableWebViewOverlays && !drawInfo.isLayer) { - renderthread::CanvasContext* activeContext = - renderthread::CanvasContext::getActiveContext(); - if (activeContext != nullptr) { - ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl(); - if (rootSurfaceControl) { - overlayParams.overlaysMode = OverlaysMode::Enabled; - int32_t rgid = activeContext->getSurfaceControlGenerationId(); - if (mParentSurfaceControlGenerationId != rgid) { - reparentSurfaceControl(rootSurfaceControl); - mParentSurfaceControlGenerationId = rgid; - } - } - } + if (!drawInfo.isLayer && prepareRootSurfaceControl()) { + overlayParams.overlaysMode = OverlaysMode::Enabled; } mCallbacks.gles.draw(mFunctor, mData, drawInfo, overlayParams); @@ -170,7 +176,10 @@ void WebViewFunctor::drawVk(const VkFunctorDrawParams& params) { .mergeTransaction = currentFunctor.mergeTransaction, }; - // TODO, enable surface control once offscreen mode figured out + if (!params.is_layer && prepareRootSurfaceControl()) { + overlayParams.overlaysMode = OverlaysMode::Enabled; + } + mCallbacks.vk.draw(mFunctor, mData, params, overlayParams); } diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h index f28f310993ec..0a02f2d4b720 100644 --- a/libs/hwui/WebViewFunctorManager.h +++ b/libs/hwui/WebViewFunctorManager.h @@ -88,6 +88,7 @@ public: } private: + bool prepareRootSurfaceControl(); void reparentSurfaceControl(ASurfaceControl* parent); private: diff --git a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp index 8abf4534a04c..e6ef95b9cf91 100644 --- a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp @@ -72,6 +72,7 @@ void VkFunctorDrawHandler::draw(const GrBackendDrawableInfo& info) { .clip_top = mClip.fTop, .clip_right = mClip.fRight, .clip_bottom = mClip.fBottom, + .is_layer = !vulkan_info.fFromSwapchainOrAndroidWindow, }; mat4.getColMajor(¶ms.transform[0]); params.secondary_command_buffer = vulkan_info.fSecondaryCommandBuffer; diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h index 4ae0f5a0a2e5..5c596576df4e 100644 --- a/libs/hwui/private/hwui/DrawVkInfo.h +++ b/libs/hwui/private/hwui/DrawVkInfo.h @@ -68,6 +68,9 @@ struct VkFunctorDrawParams { int clip_top; int clip_right; int clip_bottom; + + // Input: Whether destination surface is offscreen surface. + bool is_layer; }; } // namespace uirenderer diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index fe9a30a59870..611a4d9c8f2c 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -426,7 +426,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { if (bufferInfo->skSurface.get() == nullptr) { bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer( mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()), - kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr); + kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr, /*from_window=*/true); if (bufferInfo->skSurface.get() == nullptr) { ALOGE("SkSurface::MakeFromAHardwareBuffer failed"); mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, |