Vulkan: Depth / stencil attachments bug fixes

I found a couple of bugs trying to enable polygon offset render states.

This is just pre-work to get to a better state.

Bug:angleproject:2353

Change-Id: If6af949a09af1340e870afb627ae427d01c6e77c
Reviewed-on: https://chromium-review.googlesource.com/975631
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index 13c7b58..a93ed42 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -16,6 +16,13 @@
 namespace rx
 {
 
+namespace
+{
+constexpr VkClearDepthStencilValue kDefaultClearDepthStencilValue = {0.0f, 1};
+constexpr VkClearColorValue kBlackClearColorValue                 = {{0}};
+
+}  // anonymous namespace
+
 RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
     : RenderbufferImpl(state), mAllocatedMemorySize(0)
 {
@@ -77,9 +84,13 @@
 
     if (!mImage.valid() && (width != 0 || height != 0))
     {
+        const angle::Format &textureFormat = vkFormat.textureFormat();
+        bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
         const VkImageUsageFlags usage =
-            (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-             VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
+            VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+            VK_IMAGE_USAGE_SAMPLED_BIT |
+            (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
+            (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
 
         VkImageCreateInfo imageInfo;
         imageInfo.sType                 = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
@@ -106,7 +117,10 @@
         ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory,
                                           &mAllocatedMemorySize));
 
-        VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
+        VkImageAspectFlags aspect =
+            (textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
+            (textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
+            (textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
 
         // Allocate ImageView.
         VkImageViewCreateInfo viewInfo;
@@ -131,11 +145,19 @@
         // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
         vk::CommandBuffer *commandBuffer = nullptr;
         ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
-        VkClearColorValue black = {{0}};
-        mImage.changeLayoutWithStages(
-            VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-            VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
-        commandBuffer->clearSingleColorImage(mImage, black);
+        mImage.changeLayoutWithStages(aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                                      VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+                                      VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
+
+        if (isDepthOrStencilFormat)
+        {
+            commandBuffer->clearSingleDepthStencilImage(mImage, aspect,
+                                                        kDefaultClearDepthStencilValue);
+        }
+        else
+        {
+            commandBuffer->clearSingleColorImage(mImage, kBlackClearColorValue);
+        }
     }
 
     return gl::NoError();