Re: [Mesa-dev] [PATCH 21/29] anv/cmd_buffer: Iterate all subpass attachments when clearing

2018-01-12 Thread Pohjolainen, Topi
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

2017-11-27 Thread Jason Ekstrand
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  {
+