Mesa (master): anv: Allow HiZ clears for multi-view

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 1 16:28:48 UTC 2020


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Tue Jul  7 14:10:21 2020 -0500

anv: Allow HiZ clears for multi-view

Now that we're enabling HiZ on multi-layer images, there's no reason why
we can't enable HiZ clears for multi-view.  The only reason I can think
of why we didn't before was because no one thought to and the old code
didn't.  Enabling this means that an attachment will get HiZ cleared if
and only if att_state->fast_clear.

Reviewed-by: Sagar Ghuge <sagar.ghuge at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6549>

---

 src/intel/vulkan/genX_cmd_buffer.c | 62 +++++++++++++++++++++++---------------
 1 file changed, 37 insertions(+), 25 deletions(-)

diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index fb5645830a4..819da34194a 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -5261,20 +5261,15 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
          }
       } else if (att_state->pending_clear_aspects & (VK_IMAGE_ASPECT_DEPTH_BIT |
                                                      VK_IMAGE_ASPECT_STENCIL_BIT)) {
-         if (att_state->fast_clear && !is_multiview) {
+         if (att_state->fast_clear &&
+             (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) {
             /* We currently only support HiZ for single-LOD images */
-            if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
-               assert(isl_aux_usage_has_hiz(iview->image->planes[0].aux_usage));
-               assert(iview->planes[0].isl.base_level == 0);
-            }
+            assert(isl_aux_usage_has_hiz(iview->image->planes[0].aux_usage));
+            assert(iview->planes[0].isl.base_level == 0);
+            assert(iview->planes[0].isl.levels == 1);
+         }
 
-            anv_image_hiz_clear(cmd_buffer, image,
-                                att_state->pending_clear_aspects,
-                                iview->planes[0].isl.base_level,
-                                iview->planes[0].isl.base_array_layer,
-                                fb->layers, render_area,
-                                att_state->clear_value.depthStencil.stencil);
-         } else if (is_multiview) {
+         if (is_multiview) {
             uint32_t pending_clear_mask =
               get_multiview_subpass_clear_mask(cmd_state, att_state);
 
@@ -5283,26 +5278,43 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
                uint32_t layer =
                   iview->planes[0].isl.base_array_layer + layer_idx;
 
+               if (att_state->fast_clear) {
+                  anv_image_hiz_clear(cmd_buffer, image,
+                                      att_state->pending_clear_aspects,
+                                      iview->planes[0].isl.base_level,
+                                      layer, 1, render_area,
+                                      att_state->clear_value.depthStencil.stencil);
+               } else {
+                  anv_image_clear_depth_stencil(cmd_buffer, image,
+                                                att_state->pending_clear_aspects,
+                                                att_state->aux_usage,
+                                                iview->planes[0].isl.base_level,
+                                                layer, 1,
+                                                render_area,
+                                                att_state->clear_value.depthStencil.depth,
+                                                att_state->clear_value.depthStencil.stencil);
+               }
+            }
+
+            att_state->pending_clear_views &= ~pending_clear_mask;
+         } else {
+            if (att_state->fast_clear) {
+               anv_image_hiz_clear(cmd_buffer, image,
+                                   att_state->pending_clear_aspects,
+                                   iview->planes[0].isl.base_level,
+                                   iview->planes[0].isl.base_array_layer,
+                                   fb->layers, render_area,
+                                   att_state->clear_value.depthStencil.stencil);
+            } else {
                anv_image_clear_depth_stencil(cmd_buffer, image,
                                              att_state->pending_clear_aspects,
                                              att_state->aux_usage,
                                              iview->planes[0].isl.base_level,
-                                             layer, 1,
-                                             render_area,
+                                             iview->planes[0].isl.base_array_layer,
+                                             fb->layers, render_area,
                                              att_state->clear_value.depthStencil.depth,
                                              att_state->clear_value.depthStencil.stencil);
             }
-
-            att_state->pending_clear_views &= ~pending_clear_mask;
-         } else {
-            anv_image_clear_depth_stencil(cmd_buffer, image,
-                                          att_state->pending_clear_aspects,
-                                          att_state->aux_usage,
-                                          iview->planes[0].isl.base_level,
-                                          iview->planes[0].isl.base_array_layer,
-                                          fb->layers, render_area,
-                                          att_state->clear_value.depthStencil.depth,
-                                          att_state->clear_value.depthStencil.stencil);
          }
       } else  {
          assert(att_state->pending_clear_aspects == 0);



More information about the mesa-commit mailing list