v3dv: select the depth/stencil buffer from the attachment aspect mask
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index e07c3d2..f18a88e 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -713,6 +713,23 @@
*rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE;
}
+static uint32_t
+zs_buffer_from_aspect_bits(VkImageAspectFlags aspects)
+{
+ const VkImageAspectFlags zs_aspects =
+ VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
+ const VkImageAspectFlags filtered_aspects = aspects & zs_aspects;
+
+ if (filtered_aspects == zs_aspects)
+ return ZSTENCIL;
+ else if (filtered_aspects == VK_IMAGE_ASPECT_DEPTH_BIT)
+ return Z;
+ else if (filtered_aspects == VK_IMAGE_ASPECT_STENCIL_BIT)
+ return STENCIL;
+ else
+ return NONE;
+}
+
static void
cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer,
struct v3dv_cl *cl,
@@ -804,7 +821,9 @@
if (needs_load) {
struct v3dv_image_view *iview =
framebuffer->attachments[ds_attachment_idx];
- cmd_buffer_render_pass_emit_load(cmd_buffer, cl, iview, layer, Z);
+ const uint32_t zs_buffer = zs_buffer_from_aspect_bits(iview->aspects);
+ cmd_buffer_render_pass_emit_load(cmd_buffer, cl,
+ iview, layer, zs_buffer);
}
}
@@ -929,9 +948,12 @@
needs_ds_clear;
if (needs_ds_store) {
+ struct v3dv_image_view *iview =
+ state->framebuffer->attachments[ds_attachment_idx];
+ const uint32_t zs_buffer = zs_buffer_from_aspect_bits(iview->aspects);
cmd_buffer_render_pass_emit_store(cmd_buffer, cl,
ds_attachment_idx, layer,
- Z, needs_ds_clear);
+ zs_buffer, needs_ds_clear);
has_stores = true;
}
}