Mesa (main): anv: Properly clamp attachment layer counts

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jun 18 00:12:43 UTC 2022


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Wed Jun 15 12:05:51 2022 -0500

anv: Properly clamp attachment layer counts

Vulkan requires that the acutal layer count come from
VkRenderingInfo::layerCount or VkFramebufferCreateInfo::layers rather
than from the image view itself.

Cc: mesa-stable at lists.freedesktop.org
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17060>

---

 src/intel/vulkan/genX_cmd_buffer.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index a783500d990..7631489c404 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -6336,22 +6336,32 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
    if (dw == NULL)
       return;
 
+   struct isl_view isl_view = {};
    struct isl_depth_stencil_hiz_emit_info info = {
+      .view = &isl_view,
       .mocs = anv_mocs(device, NULL, ISL_SURF_USAGE_DEPTH_BIT),
    };
 
    if (gfx->depth_att.iview != NULL) {
-      info.view = &gfx->depth_att.iview->planes[0].isl;
+      isl_view = gfx->depth_att.iview->planes[0].isl;
    } else if (gfx->stencil_att.iview != NULL) {
-      info.view = &gfx->stencil_att.iview->planes[0].isl;
+      isl_view = gfx->stencil_att.iview->planes[0].isl;
+   }
+
+   if (gfx->view_mask) {
+      assert(isl_view.array_len == 0 ||
+             isl_view.array_len >= util_last_bit(gfx->view_mask));
+      isl_view.array_len = util_last_bit(gfx->view_mask);
+   } else {
+      assert(isl_view.array_len == 0 ||
+             isl_view.array_len >= util_last_bit(gfx->layer_count));
+      isl_view.array_len = gfx->layer_count;
    }
 
    if (gfx->depth_att.iview != NULL) {
       const struct anv_image_view *iview = gfx->depth_att.iview;
       const struct anv_image *image = iview->image;
 
-      info.view = &iview->planes[0].isl;
-
       const uint32_t depth_plane =
          anv_image_aspect_to_plane(image, VK_IMAGE_ASPECT_DEPTH_BIT);
       const struct anv_surface *depth_surface =
@@ -6392,9 +6402,6 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
       const struct anv_image_view *iview = gfx->stencil_att.iview;
       const struct anv_image *image = iview->image;
 
-      if (info.view == NULL)
-         info.view = &iview->planes[0].isl;
-
       const uint32_t stencil_plane =
          anv_image_aspect_to_plane(image, VK_IMAGE_ASPECT_STENCIL_BIT);
       const struct anv_surface *stencil_surface =
@@ -6689,10 +6696,19 @@ void genX(CmdBeginRendering)(
       gfx->color_att[i].layout = att->imageLayout;
       gfx->color_att[i].aux_usage = aux_usage;
 
+      struct isl_view isl_view = iview->planes[0].isl;
+      if (pRenderingInfo->viewMask) {
+         assert(isl_view.array_len >= util_last_bit(pRenderingInfo->viewMask));
+         isl_view.array_len = util_last_bit(pRenderingInfo->viewMask);
+      } else {
+         assert(isl_view.array_len >= pRenderingInfo->layerCount);
+         isl_view.array_len = pRenderingInfo->layerCount;
+      }
+
       anv_image_fill_surface_state(cmd_buffer->device,
                                    iview->image,
                                    VK_IMAGE_ASPECT_COLOR_BIT,
-                                   &iview->planes[0].isl,
+                                   &isl_view,
                                    ISL_SURF_USAGE_RENDER_TARGET_BIT,
                                    aux_usage, &fast_clear_color,
                                    0, /* anv_image_view_state_flags */



More information about the mesa-commit mailing list