Re: [Mesa-dev] [PATCH 21/29] anv/cmd_buffer: Iterate all subpass attachments when clearing
On Mon, Nov 27, 2017 at 07:06:11PM -0800, Jason Ekstrand wrote: > This unifies things a bit because we now handle depth and stencil at the > same time. It also ensures that clears happen for input attachments. > --- > src/intel/vulkan/genX_cmd_buffer.c | 69 > -- > 1 file changed, 28 insertions(+), 41 deletions(-) > > diff --git a/src/intel/vulkan/genX_cmd_buffer.c > b/src/intel/vulkan/genX_cmd_buffer.c > index 3f90c1a..e5e0d1c 100644 > --- a/src/intel/vulkan/genX_cmd_buffer.c > +++ b/src/intel/vulkan/genX_cmd_buffer.c > @@ -3219,58 +3219,43 @@ 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 = _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); > - > - if (att_state->fast_clear) { > - anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, > - iview->planes[0].isl.base_level, > - iview->planes[0].isl.base_array_layer, > - fb->layers, > - ISL_AUX_OP_FAST_CLEAR, false); > - } else { > - 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, > - iview->planes[0].isl.base_array_layer, > - fb->layers, 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; > - > - assert(a < cmd_state->pass->attachment_count); > - struct anv_attachment_state *att_state = _state->attachments[a]; > - struct anv_image_view *iview = fb->attachments[a]; > - const struct anv_image *image = iview->image; > + if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_COLOR_BIT) { > + assert(att_state->pending_clear_aspects == > VK_IMAGE_ASPECT_COLOR_BIT); > > - assert(image->aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | > - VK_IMAGE_ASPECT_STENCIL_BIT)); > + /* Multi-planar images are not supported as attachments */ > + assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); > + assert(image->n_planes == 1); > > - if (att_state->pending_clear_aspects) { > + if (att_state->fast_clear) { > +anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, > + iview->planes[0].isl.base_level, > + iview->planes[0].isl.base_array_layer, > + fb->layers, > + ISL_AUX_OP_FAST_CLEAR, false); > + } else { > +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, > + iview->planes[0].isl.base_array_layer, > + fb->layers, 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); > @@ -3293,6 +3278,8 @@ cmd_buffer_begin_subpass(struct
[Mesa-dev] [PATCH 21/29] 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. It also ensures that clears happen for input attachments. --- src/intel/vulkan/genX_cmd_buffer.c | 69 -- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 3f90c1a..e5e0d1c 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3219,58 +3219,43 @@ 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 = _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); - - if (att_state->fast_clear) { - anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, - iview->planes[0].isl.base_level, - iview->planes[0].isl.base_array_layer, - fb->layers, - ISL_AUX_OP_FAST_CLEAR, false); - } else { - 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, - iview->planes[0].isl.base_array_layer, - fb->layers, 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; - - assert(a < cmd_state->pass->attachment_count); - struct anv_attachment_state *att_state = _state->attachments[a]; - struct anv_image_view *iview = fb->attachments[a]; - const struct anv_image *image = iview->image; + if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_COLOR_BIT) { + assert(att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT); - assert(image->aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT)); + /* Multi-planar images are not supported as attachments */ + assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); + assert(image->n_planes == 1); - if (att_state->pending_clear_aspects) { + if (att_state->fast_clear) { +anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT, + iview->planes[0].isl.base_level, + iview->planes[0].isl.base_array_layer, + fb->layers, + ISL_AUX_OP_FAST_CLEAR, false); + } else { +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, + iview->planes[0].isl.base_array_layer, + fb->layers, 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); @@ -3293,6 +3278,8 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer, att_state->clear_value.depthStencil.depth, att_state->clear_value.depthStencil.stencil); } + } else { +