aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShahbaz Youssefi <syoussefi@chromium.org>2022-04-19 23:56:50 -0400
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-20 20:25:04 +0000
commitc66de085aae15ae96b6959eb8651e4ffe2aec9b9 (patch)
treef139130bf278d8be77cb19db43355ad423d87e48
parent19c6a8566aed8902df5cabaab08bc7cf49397570 (diff)
downloadangle-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.cpp14
-rw-r--r--src/libANGLE/renderer/vulkan/ContextVk.h1
-rw-r--r--src/libANGLE/renderer/vulkan/SurfaceVk.cpp43
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;