Vulkan: fix non-float clear with draw
Instead of using one draw call that clears all attachments, multiple
draw calls are issued that clear a single attachment each. This allows
us to have a manageable number of variations for the ImageClear.frag
shader, now that non-float format support is introduced.
Bug: angleproject:3187
Change-Id: Ic0c1067a396250bd80f31d00cad5a272acff8be8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1545523
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 0ac4c8f..7c2215a 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -1240,14 +1240,28 @@
RendererVk *renderer = contextVk->getRenderer();
UtilsVk::ClearImageParameters params = {};
- params.colorMaskFlags = colorMaskFlags;
params.renderAreaHeight = mState.getDimensions().height;
params.clearValue = clearColorValue;
- params.alphaMask = &getEmulatedAlphaAttachmentMask();
- params.clearBufferMask = &clearColorBuffers;
params.renderPassDesc = &getRenderPassDesc();
- return renderer->getUtils().clearImage(contextVk, this, params);
+ const auto &colorRenderTargets = mRenderTargetCache.getColors();
+ for (size_t colorIndex : clearColorBuffers)
+ {
+ const RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
+ ASSERT(colorRenderTarget);
+
+ params.format = &colorRenderTarget->getImage().getFormat().textureFormat();
+ params.attachmentIndex = colorIndex;
+ params.colorMaskFlags = colorMaskFlags;
+ if (mEmulatedAlphaAttachmentMask[colorIndex])
+ {
+ params.colorMaskFlags &= ~VK_COLOR_COMPONENT_A_BIT;
+ }
+
+ ANGLE_TRY(renderer->getUtils().clearImage(contextVk, this, params));
+ }
+
+ return angle::Result::Continue;
}
angle::Result FramebufferVk::getSamplePosition(const gl::Context *context,