Module: Mesa Branch: main Commit: 32223ac67f6015171c79dcd2dd0a5f19d7dafc60 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=32223ac67f6015171c79dcd2dd0a5f19d7dafc60
Author: Iago Toral Quiroga <[email protected]> Date: Thu May 5 08:58:54 2022 +0200 v3dv: implement VK_EXT_separate_stencil_usage We don't care about the depth/stencil usage other than to determine if an image format is supported for that usage. Reviewed-by: Alejandro PiƱeiro <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16344> --- docs/features.txt | 2 +- src/broadcom/vulkan/v3dv_device.c | 1 + src/broadcom/vulkan/v3dv_formats.c | 23 ++++++++++++++++------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 77cfee15a6b..653a547d10b 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -467,7 +467,7 @@ Vulkan 1.2 -- all DONE: anv, vn VK_EXT_host_query_reset DONE (anv, lvp, radv, tu, v3dv, vn) VK_EXT_sampler_filter_minmax DONE (anv/gen9+, lvp, radv, tu, vn) VK_EXT_scalar_block_layout DONE (anv, lvp, radv/gfx7+, tu, vn) - VK_EXT_separate_stencil_usage DONE (anv, lvp, radv, tu, vn) + VK_EXT_separate_stencil_usage DONE (anv, lvp, radv, tu, v3dv, vn) VK_EXT_shader_viewport_index_layer DONE (anv, lvp, radv, tu, vn) Vulkan 1.3 -- all DONE: anv, radv, lvp diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index bd8e0e8640d..c5e52fd48e2 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -162,6 +162,7 @@ get_device_extensions(const struct v3dv_physical_device *device, .EXT_pipeline_creation_feedback = true, .EXT_private_data = true, .EXT_provoking_vertex = true, + .EXT_separate_stencil_usage = true, .EXT_vertex_attribute_divisor = true, #ifdef ANDROID .ANDROID_native_buffer = true, diff --git a/src/broadcom/vulkan/v3dv_formats.c b/src/broadcom/vulkan/v3dv_formats.c index 4751f50f06b..581ad8d5a6e 100644 --- a/src/broadcom/vulkan/v3dv_formats.c +++ b/src/broadcom/vulkan/v3dv_formats.c @@ -347,7 +347,13 @@ get_image_format_properties( if (info->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) goto unsupported; - if (info->usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { + const VkImageStencilUsageCreateInfo *stencil_usage_info = + vk_find_struct_const(info->pNext, IMAGE_STENCIL_USAGE_CREATE_INFO); + + VkImageUsageFlags usage = + info->usage | (stencil_usage_info ? stencil_usage_info->stencilUsage : 0); + + if (usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) { goto unsupported; } @@ -363,14 +369,14 @@ get_image_format_properties( } } - if (info->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { + if (usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) { goto unsupported; } } - if (info->usage & (VK_IMAGE_USAGE_SAMPLED_BIT | - VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { + if (usage & (VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { if (!(format_feature_flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { goto unsupported; } @@ -385,19 +391,19 @@ get_image_format_properties( } } - if (info->usage & VK_IMAGE_USAGE_STORAGE_BIT) { + if (usage & VK_IMAGE_USAGE_STORAGE_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + if (usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) { goto unsupported; @@ -535,6 +541,9 @@ v3dv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: external_info = (const void *) s; break; + case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: + /* Do nothing, get_image_format_properties() below will handle it */; + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: drm_format_mod_info = (const void *) s; switch (drm_format_mod_info->drmFormatModifier) {
