diff options
author | Shahbaz Youssefi <syoussefi@chromium.org> | 2022-04-19 23:56:50 -0400 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-20 20:25:04 +0000 |
commit | c66de085aae15ae96b6959eb8651e4ffe2aec9b9 (patch) | |
tree | f139130bf278d8be77cb19db43355ad423d87e48 | |
parent | 19c6a8566aed8902df5cabaab08bc7cf49397570 (diff) | |
download | angle-c66de085aae15ae96b6959eb8651e4ffe2aec9b9.tar.gz |
Vulkan: Fix surface invalidate w.r.t shared present mode
When in shared present mode (i.e. single-buffer rendering), surface
shouldn't be invalidated on (the implicit) swap, because the application
is expected to continuously draw to it.
Bug: b/229689340
Change-Id: I006a954c558a5da1d9af631797546e4b76f4ff2c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3594801
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Jeff Vigil <j.vigil@samsung.com>
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
-rw-r--r-- | src/libANGLE/renderer/vulkan/ContextVk.cpp | 14 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/ContextVk.h | 1 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/SurfaceVk.cpp | 43 |
3 files changed, 39 insertions, 19 deletions
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp index 370512f9d5..cd37e36dec 100644 --- a/src/libANGLE/renderer/vulkan/ContextVk.cpp +++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp @@ -3522,6 +3522,7 @@ angle::Result ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferH vk::ImageViewHelper *colorImageView, vk::ImageHelper *colorImage, vk::ImageHelper *colorImageMS, + VkPresentModeKHR presentMode, bool *imageResolved) { if (!mRenderPassCommands->started()) @@ -3574,10 +3575,15 @@ angle::Result ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferH onImageRenderPassWrite(gl::LevelIndex(0), 0, 1, VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment, colorImage); - const gl::Rectangle invalidateArea(0, 0, colorImageMS->getExtents().width, - colorImageMS->getExtents().height); - commandBufferHelper.invalidateRenderPassColorAttachment( - mState, 0, vk::PackedAttachmentIndex(0), invalidateArea); + // Invalidate the surface. See comment in WindowSurfaceVk::doDeferredAcquireNextImage on + // why this is not done when in DEMAND_REFRESH mode. + if (presentMode != VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR) + { + const gl::Rectangle invalidateArea(0, 0, colorImageMS->getExtents().width, + colorImageMS->getExtents().height); + commandBufferHelper.invalidateRenderPassColorAttachment( + mState, 0, vk::PackedAttachmentIndex(0), invalidateArea); + } ANGLE_TRY( flushCommandsAndEndRenderPass(RenderPassClosureReason::AlreadySpecifiedElsewhere)); diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h index f8f79b5591..d8f7840f02 100644 --- a/src/libANGLE/renderer/vulkan/ContextVk.h +++ b/src/libANGLE/renderer/vulkan/ContextVk.h @@ -447,6 +447,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText vk::ImageViewHelper *colorImageView, vk::ImageHelper *colorImage, vk::ImageHelper *colorImageMS, + VkPresentModeKHR presentMode, bool *imageResolved); vk::DynamicQueryPool *getQueryPool(gl::QueryType queryType); diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp index be99b33fcf..a805efbe63 100644 --- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp +++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp @@ -1698,9 +1698,9 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk, bool imageResolved = false; if (currentFramebuffer.valid() && !overlayHasEnabledWidget(contextVk)) { - ANGLE_TRY(contextVk->optimizeRenderPassForPresent(currentFramebuffer.getHandle(), - &image.imageViews, &image.image, - &mColorImageMS, &imageResolved)); + ANGLE_TRY(contextVk->optimizeRenderPassForPresent( + currentFramebuffer.getHandle(), &image.imageViews, &image.image, &mColorImageMS, + mSwapchainPresentMode, &imageResolved)); } // Because the color attachment defers layout changes until endRenderPass time, we must call @@ -1909,21 +1909,34 @@ angle::Result WindowSurfaceVk::doDeferredAcquireNextImage(const gl::Context *con ANGLE_VK_TRY(contextVk, result); } - if (mState.swapBehavior == EGL_BUFFER_DESTROYED && mBufferAgeQueryFrameNumber == 0) + // Auto-invalidate the contents of the surface. According to EGL, on swap: + // + // - When EGL_BUFFER_DESTROYED is specified, the contents of the color image can be + // invalidated. + // * This is disabled with buffer age has been queried to work around a dEQP test bug. + // - Depth/Stencil can always be invalidated + // + // In all cases, when the present mode is DEMAND_REFRESH, swap is implicit and the swap behavior + // doesn't apply so no invalidation is done. + if (mSwapchainPresentMode != VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR) { - mSwapchainImages[mCurrentSwapchainImageIndex].image.invalidateSubresourceContent( - contextVk, gl::LevelIndex(0), 0, 1, nullptr); - if (mColorImageMS.valid()) + if (mState.swapBehavior == EGL_BUFFER_DESTROYED && mBufferAgeQueryFrameNumber == 0) { - mColorImageMS.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1, nullptr); + mSwapchainImages[mCurrentSwapchainImageIndex].image.invalidateSubresourceContent( + contextVk, gl::LevelIndex(0), 0, 1, nullptr); + if (mColorImageMS.valid()) + { + mColorImageMS.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1, + nullptr); + } + } + if (mDepthStencilImage.valid()) + { + mDepthStencilImage.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1, + nullptr); + mDepthStencilImage.invalidateSubresourceStencilContent(contextVk, gl::LevelIndex(0), 0, + 1, nullptr); } - } - if (mDepthStencilImage.valid()) - { - mDepthStencilImage.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1, - nullptr); - mDepthStencilImage.invalidateSubresourceStencilContent(contextVk, gl::LevelIndex(0), 0, 1, - nullptr); } return angle::Result::Continue; |