anv/sparse: bring back our (limited) support for depth/stencil
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

The ambiguity of the Vulkan spec was clarified, and we don't need to
support sparse depth/stencil with exactly the same number of samples
as non-sparse.

If you want to pass CTS, you'll need VK-GL-CTS commit 03976477f521
("Don't require more than VK_SAMPLE_COUNT_1_BIT for non-color sparse
resident images").

This is essentially a revert of d5da6980d3 ("anv/sparse: don't
support depth/stencil with sparse") and 7b337e214d ("anv: remove
dead code").

Thanks to Iván Briano for working with Khronos to get clarification on
the spec and for implementing the VK-GL-CTS fix.

Reviewed-by: Iván Briano <ivan.briano@intel.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37423>
This commit is contained in:
Paulo Zanoni 2025-09-15 16:25:12 -07:00 committed by Marge Bot
parent 7eab94d542
commit ff5b909511

View file

@ -1658,15 +1658,30 @@ anv_sparse_image_check_support(struct anv_physical_device *pdevice,
return VK_ERROR_FEATURE_NOT_PRESENT;
}
/* While our hardware allows us to support sparse with some depth/stencil
* formats (e.g., single-sampled 2D), the spec seems to be expecting that,
* if we support a format, we have to support it with all the multi-sampled
* flags we support for non-sparse. Therefore, just give up depth/stencil
* entirely since games don't seem to be requiring it.
/* Please see ISL's filter_tiling() functions for accurate explanations on
* why depth/stencil images are not always supported with the tiling
* formats we want.
*/
VkImageAspectFlags aspects = vk_format_aspects(vk_format);
if (aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))
return VK_ERROR_FORMAT_NOT_SUPPORTED;
if (aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
/* For multi-sampled images, the image layouts for color and
* depth/stencil are different, and only the color layout is compatible
* with the standard block shapes.
*/
valid_samples &= VK_SAMPLE_COUNT_1_BIT;
/* For 125+, isl_gfx125_filter_tiling() claims 3D is not supported.
* For the previous platforms, isl_gfx6_filter_tiling() says only 2D is
* supported.
*/
if (pdevice->info.verx10 >= 125) {
if (type == VK_IMAGE_TYPE_3D)
return VK_ERROR_FORMAT_NOT_SUPPORTED;
} else {
if (type != VK_IMAGE_TYPE_2D)
return VK_ERROR_FORMAT_NOT_SUPPORTED;
}
}
const struct anv_format *anv_format = anv_get_format(pdevice, vk_format);
if (!anv_format)
@ -1709,5 +1724,8 @@ anv_sparse_image_check_support(struct anv_physical_device *pdevice,
if (valid_samples_out)
*valid_samples_out = valid_samples;
if (!valid_samples)
return VK_ERROR_FORMAT_NOT_SUPPORTED;
return VK_SUCCESS;
}