From e526d49edd9fe7ccf37ae22fd698a6c24de66ac4 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 27 Nov 2017 10:43:03 -0800 Subject: [PATCH] anv/cmd_buffer: Iterate all subpass attachments when clearing This unifies things a bit because we now handle depth and stencil at the same time. Reviewed-by: Nanley Chery --- src/intel/vulkan/genX_cmd_buffer.c | 78 +++++++++++++----------------- 1 file changed, 33 insertions(+), 45 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 5b41284258d..f21eaa4b3cf 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3563,66 +3563,52 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer, VkRect2D render_area = cmd_buffer->state.render_area; struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; - for (uint32_t i = 0; i < subpass->color_count; ++i) { - const uint32_t a = subpass->color_attachments[i].attachment; + + for (uint32_t i = 0; i < subpass->attachment_count; ++i) { + const uint32_t a = subpass->attachments[i].attachment; if (a == VK_ATTACHMENT_UNUSED) continue; assert(a < cmd_state->pass->attachment_count); struct anv_attachment_state *att_state = &cmd_state->attachments[a]; - if (!att_state->pending_clear_aspects) - continue; - - assert(att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT); - struct anv_image_view *iview = fb->attachments[a]; const struct anv_image *image = iview->image; - /* Multi-planar images are not supported as attachments */ - assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); - assert(image->n_planes == 1); - - uint32_t base_clear_layer = iview->planes[0].isl.base_array_layer; - uint32_t clear_layer_count = fb->layers; + if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_COLOR_BIT) { + assert(att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT); - if (att_state->fast_clear) { - /* We only support fast-clears on the first layer */ - assert(iview->planes[0].isl.base_level == 0); - assert(iview->planes[0].isl.base_array_layer == 0); - - anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, - 0, 0, 1, ISL_AUX_OP_FAST_CLEAR, false); - base_clear_layer++; - clear_layer_count--; - } - - if (clear_layer_count > 0) { + /* Multi-planar images are not supported as attachments */ + assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); assert(image->n_planes == 1); - anv_image_clear_color(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, - att_state->aux_usage, - iview->planes[0].isl.format, - iview->planes[0].isl.swizzle, - iview->planes[0].isl.base_level, - base_clear_layer, clear_layer_count, render_area, - vk_to_isl_color(att_state->clear_value.color)); - } - - att_state->pending_clear_aspects = 0; - } - if (subpass->depth_stencil_attachment.attachment != VK_ATTACHMENT_UNUSED) { - const uint32_t a = subpass->depth_stencil_attachment.attachment; + uint32_t base_clear_layer = iview->planes[0].isl.base_array_layer; + uint32_t clear_layer_count = fb->layers; - assert(a < cmd_state->pass->attachment_count); - struct anv_attachment_state *att_state = &cmd_state->attachments[a]; - struct anv_image_view *iview = fb->attachments[a]; - const struct anv_image *image = iview->image; + if (att_state->fast_clear) { + /* We only support fast-clears on the first layer */ + assert(iview->planes[0].isl.base_level == 0); + assert(iview->planes[0].isl.base_array_layer == 0); - assert(image->aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT)); + anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, + 0, 0, 1, ISL_AUX_OP_FAST_CLEAR, false); + base_clear_layer++; + clear_layer_count--; + } - if (att_state->pending_clear_aspects) { + if (clear_layer_count > 0) { + assert(image->n_planes == 1); + anv_image_clear_color(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, + att_state->aux_usage, + iview->planes[0].isl.format, + iview->planes[0].isl.swizzle, + iview->planes[0].isl.base_level, + base_clear_layer, clear_layer_count, + render_area, + vk_to_isl_color(att_state->clear_value.color)); + } + } else if (att_state->pending_clear_aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | + VK_IMAGE_ASPECT_STENCIL_BIT)) { if (att_state->fast_clear) { /* We currently only support HiZ for single-layer images */ assert(iview->planes[0].isl.base_level == 0); @@ -3645,6 +3631,8 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer, att_state->clear_value.depthStencil.depth, att_state->clear_value.depthStencil.stencil); } + } else { + assert(att_state->pending_clear_aspects == 0); } att_state->pending_clear_aspects = 0; -- 2.30.2