diff options
author | Hugues Evrard <hevrard@google.com> | 2021-03-01 14:35:22 +0000 |
---|---|---|
committer | Hugues Evrard <hevrard@google.com> | 2021-03-09 18:22:32 +0000 |
commit | b9510a0a8bb0f5b82a8b2021683c6afccfb59835 (patch) | |
tree | 3c6fde73011bd6d43a6752918d1ad51b2c43f125 /libs/hwui/renderthread/VulkanManager.cpp | |
parent | 7e3f7d1061da8873a7fc68d3a24081d8442e146f (diff) |
Use VK_ANDROID_frame_boundary in HWUI
This extension paves the way to profiling HWUI apps with AGI.
Bug: 181645761
Test: manual
Change-Id: I03ee66832a9013016dc91904962ce54809b198e6
Diffstat (limited to 'libs/hwui/renderthread/VulkanManager.cpp')
-rw-r--r-- | libs/hwui/renderthread/VulkanManager.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index e93824dfbd30..01126860b3ba 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -336,6 +336,7 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe GET_DEV_PROC(ResetCommandBuffer); GET_DEV_PROC(ResetFences); GET_DEV_PROC(WaitForFences); + GET_DEV_PROC(FrameBoundaryANDROID); } void VulkanManager::initialize() { @@ -516,6 +517,25 @@ void VulkanManager::finishFrame(SkSurface* surface) { if (semaphore != VK_NULL_HANDLE) { if (submitted == GrSemaphoresSubmitted::kYes) { mSwapSemaphore = semaphore; + if (mFrameBoundaryANDROID) { + // retrieve VkImage used as render target + VkImage image = VK_NULL_HANDLE; + GrBackendRenderTarget backendRenderTarget = + surface->getBackendRenderTarget(SkSurface::kFlushRead_BackendHandleAccess); + if (backendRenderTarget.isValid()) { + GrVkImageInfo info; + if (backendRenderTarget.getVkImageInfo(&info)) { + image = info.fImage; + } else { + ALOGE("Frame boundary: backend is not vulkan"); + } + } else { + ALOGE("Frame boundary: invalid backend render target"); + } + // frameBoundaryANDROID needs to know about mSwapSemaphore, but + // it won't wait on it. + mFrameBoundaryANDROID(mDevice, mSwapSemaphore, image); + } } else { destroy_semaphore(mDestroySemaphoreContext); mDestroySemaphoreContext = nullptr; |