radv: Handle VK_ATTACHMENT_UNUSED in CmdClearAttachment
authorDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Thu, 31 Jan 2019 13:56:21 +0000 (15:56 +0200)
committerDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Mon, 4 Feb 2019 12:50:43 +0000 (14:50 +0200)
From the Vulkan 1.0.98 spec for vkCmdClearAttachments:

"If any attachment to be cleared in the current subpass is VK_ATTACHMENT_UNUSED,
then the clear has no effect on that attachment."

"If the aspectMask member of any element of pAttachments contains
VK_IMAGE_ASPECT_COLOR_BIT, then the colorAttachment member of that
element must either refer to a color attachment which is VK_ATTACHMENT_UNUSED,
or must be a valid color attachment."

"If the aspectMask member of any element of pAttachments contains
VK_IMAGE_ASPECT_DEPTH_BIT, then the current subpass' depth/stencil attachment
must either be VK_ATTACHMENT_UNUSED, or must have a depth component"

"If the aspectMask member of any element of pAttachments contains
VK_IMAGE_ASPECT_STENCIL_BIT, then the current subpass' depth/stencil attachment
must either be VK_ATTACHMENT_UNUSED, or must have a stencil component"

Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_meta_clear.c

index 819ec060fc6aab2d879f8647bc806c21554097fb..35da5fb1a6a06c8d3156fcc6cfa3c493f326ec5b 100644 (file)
@@ -1522,7 +1522,13 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
 
        if (aspects & VK_IMAGE_ASPECT_COLOR_BIT) {
                const uint32_t subpass_att = clear_att->colorAttachment;
+               if (subpass_att == VK_ATTACHMENT_UNUSED)
+                       return;
+
                const uint32_t pass_att = subpass->color_attachments[subpass_att].attachment;
+               if (pass_att == VK_ATTACHMENT_UNUSED)
+                       return;
+
                VkImageLayout image_layout = subpass->color_attachments[subpass_att].layout;
                const struct radv_image_view *iview = fb->attachments[pass_att].attachment;
                VkClearColorValue clear_value = clear_att->clearValue.color;
@@ -1537,6 +1543,9 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
                }
        } else {
                const uint32_t pass_att = subpass->depth_stencil_attachment->attachment;
+               if (pass_att == VK_ATTACHMENT_UNUSED)
+                       return;
+
                VkImageLayout image_layout = subpass->depth_stencil_attachment->layout;
                const struct radv_image_view *iview = fb->attachments[pass_att].attachment;
                VkClearDepthStencilValue clear_value = clear_att->clearValue.depthStencil;