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,