Module: Mesa
Branch: master
Commit: e526d49edd9fe7ccf37ae22fd698a6c24de66ac4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e526d49edd9fe7ccf37ae22fd698a6c24de66ac4

Author: Jason Ekstrand <jason.ekstr...@intel.com>
Date:   Mon Nov 27 10:43:03 2017 -0800

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 <nanley.g.ch...@intel.com>

---

 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 5b41284258..f21eaa4b3c 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;

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to