From c4506b5af5ed548a854f554644c1071ee753c4ec Mon Sep 17 00:00:00 2001 From: Vlad Schiller Date: Mon, 21 Aug 2023 06:34:36 +0100 Subject: [PATCH] pvr: Implement VK_KHR_format_feature_flags2 This commit will implement and set VK_KHR_format_feature_flags2 instead of the old ones. Signed-off-by: Vlad Schiller Reviewed-by: Karmjit Mahil Part-of: --- docs/features.txt | 2 +- src/imagination/vulkan/pvr_device.c | 1 + src/imagination/vulkan/pvr_formats.c | 30 +++++++++++++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 9fa76a453dc..38feaf5fcde 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -477,7 +477,7 @@ Vulkan 1.3 -- all DONE: anv, radv, tu, lvp, vn VK_KHR_copy_commands2 DONE (anv, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_dynamic_rendering DONE (anv, dzn, hasvk, lvp, nvk, radv, tu, vn) - VK_KHR_format_feature_flags2 DONE (anv, hasvk, lvp, nvk, radv, tu, v3dv, vn) + VK_KHR_format_feature_flags2 DONE (anv, hasvk, lvp, nvk, pvr, radv, tu, v3dv, vn) VK_KHR_maintenance4 DONE (anv, hasvk, lvp, nvk, radv, tu, v3dv, vn) VK_KHR_shader_integer_dot_product DONE (anv, dzn, hasvk, lvp, radv, tu, v3dv, vn) VK_KHR_shader_non_semantic_info DONE (anv, hasvk, nvk, radv, tu, v3dv, vn) diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 6ac17e80a5f..30a373939b5 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -160,6 +160,7 @@ static void pvr_physical_device_get_supported_extensions( .KHR_copy_commands2 = true, .KHR_external_memory = true, .KHR_external_memory_fd = true, + .KHR_format_feature_flags2 = true, .KHR_get_memory_requirements2 = true, .KHR_swapchain = PVR_USE_WSI_PLATFORM, .KHR_timeline_semaphore = true, diff --git a/src/imagination/vulkan/pvr_formats.c b/src/imagination/vulkan/pvr_formats.c index 4be0c1fe5aa..50cb22faddb 100644 --- a/src/imagination/vulkan/pvr_formats.c +++ b/src/imagination/vulkan/pvr_formats.c @@ -461,12 +461,11 @@ void pvr_get_hw_clear_color( #undef f32_to_snorm16 #undef f32_to_f16 -/* TODO: This currently only sets up Vulkan 1.0 flags. */ static VkFormatFeatureFlags2 pvr_get_image_format_features2(const struct pvr_format *pvr_format, VkImageTiling vk_tiling) { - VkFormatFeatureFlags flags = 0; + VkFormatFeatureFlags2 flags = 0; VkFormat vk_format; if (!pvr_format) @@ -509,7 +508,8 @@ pvr_get_image_format_features2(const struct pvr_format *pvr_format, } } else if (vk_format_is_depth_or_stencil(vk_format)) { flags |= VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_2_BLIT_DST_BIT; + VK_FORMAT_FEATURE_2_BLIT_DST_BIT | + VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT; } if (vk_tiling == VK_IMAGE_TILING_OPTIMAL) { @@ -566,6 +566,11 @@ pvr_get_image_format_features2(const struct pvr_format *pvr_format, } } + if (flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT) { + flags |= VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT | + VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT; + } + return flags; } @@ -576,7 +581,6 @@ const uint8_t *pvr_get_format_swizzle(VkFormat vk_format) return vf->swizzle; } -/* TODO: This currently only sets up Vulkan 1.0 flags. */ static VkFormatFeatureFlags2 pvr_get_buffer_format_features2(const struct pvr_format *pvr_format) { @@ -650,6 +654,11 @@ pvr_get_buffer_format_features2(const struct pvr_format *pvr_format) break; } + if (flags & VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT) { + flags |= VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT | + VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT; + } + return flags; } @@ -673,7 +682,18 @@ void pvr_GetPhysicalDeviceFormatProperties2( }; vk_foreach_struct (ext, pFormatProperties->pNext) { - pvr_debug_ignored_stype(ext->sType); + switch (ext->sType) { + case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3: { + VkFormatProperties3 *pFormatProperties3 = (VkFormatProperties3 *)ext; + pFormatProperties3->linearTilingFeatures = linear2; + pFormatProperties3->optimalTilingFeatures = optimal2; + pFormatProperties3->bufferFeatures = buffer2; + break; + } + default: + pvr_debug_ignored_stype(ext->sType); + break; + } } }