Now that we're tracking aux properly per-slice, we can enable this for
applications which actually care.
---
 src/intel/vulkan/anv_blorp.c       | 22 +++++++++++++++-------
 src/intel/vulkan/genX_cmd_buffer.c | 13 +++++++++----
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 594b0d8..73a44fd 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
*cmd_buffer)
                                    image, VK_IMAGE_ASPECT_COLOR_BIT,
                                    att_state->aux_usage, &surf);
 
+      uint32_t base_layer = iview->planes[0].isl.base_array_layer;
+      uint32_t layer_count = fb->layers;
+
       if (att_state->fast_clear) {
          surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
 
+         /* 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);
+
          /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
           *
           *    "After Render target fast clear, pipe-control with color cache
@@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
*cmd_buffer)
 
          assert(image->n_planes == 1);
          blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format,
-                          iview->planes[0].isl.base_level,
-                          iview->planes[0].isl.base_array_layer, fb->layers,
+                          iview->planes[0].isl.base_level, base_layer, 1,
                           render_area.offset.x, render_area.offset.y,
                           render_area.offset.x + render_area.extent.width,
                           render_area.offset.y + render_area.extent.height);
+         base_layer++;
+         layer_count--;
 
          cmd_buffer->state.pending_pipe_bits |=
             ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
-      } else {
+      }
+
+      if (layer_count > 0) {
          assert(image->n_planes == 1);
          anv_cmd_buffer_mark_image_written(cmd_buffer, image,
                                            VK_IMAGE_ASPECT_COLOR_BIT,
                                            att_state->aux_usage,
                                            iview->planes[0].isl.base_level,
-                                           
iview->planes[0].isl.base_array_layer,
-                                           fb->layers);
+                                           base_layer, layer_count);
 
          blorp_clear(&batch, &surf, iview->planes[0].isl.format,
                      anv_swizzle_for_render(iview->planes[0].isl.swizzle),
-                     iview->planes[0].isl.base_level,
-                     iview->planes[0].isl.base_array_layer, fb->layers,
+                     iview->planes[0].isl.base_level, base_layer, layer_count,
                      render_area.offset.x, render_area.offset.y,
                      render_area.offset.x + render_area.extent.width,
                      render_area.offset.y + render_area.extent.height,
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 4c83a5c..484246d 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct anv_device * 
device,
        */
       if (att_state->fast_clear &&
           (iview->planes[0].isl.base_level > 0 ||
-           iview->image->type == VK_IMAGE_TYPE_3D ||
-           iview->image->array_size > 0)) {
+           iview->planes[0].isl.base_array_layer > 0 ||
+           cmd_state->framebuffer->layers > 1)) {
          anv_perf_warn(device->instance, iview->image,
                        "Rendering to a multi-LOD or multi-layer framebuffer "
-                       "with LOAD_OP_CLEAR.  Not fast-clearing");
-         att_state->fast_clear = false;
+                       "with LOAD_OP_CLEAR.  Only fast-clearing the first "
+                       "slice");
+
+         /* Leave fast_clear enabled if we are clearing the first slice. */
+         if (iview->planes[0].isl.base_level > 0 ||
+             iview->planes[0].isl.base_array_layer > 0)
+            att_state->fast_clear = false;
       }
 
       if (att_state->fast_clear) {
-- 
2.5.0.400.gff86faf

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

Reply via email to