Mesa (main): turnip: Add support for VK_KHR_format_feature_flags2.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 2 20:16:29 UTC 2022


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

Author: Emma Anholt <emma at anholt.net>
Date:   Fri Mar  4 12:29:52 2022 -0800

turnip: Add support for VK_KHR_format_feature_flags2.

This reports all of our storage formats as supporting read/write without
format, since we don't have any in-shader format conversions.  Similarly,
shadow comparisons were already supported on all the depth formats.

This extension is required for VK 1.3.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15293>

---

 docs/features.txt                 |  2 +-
 src/freedreno/vulkan/tu_device.c  |  1 +
 src/freedreno/vulkan/tu_formats.c | 34 ++++++++++++++++++++++++++++------
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/docs/features.txt b/docs/features.txt
index c21d16ba4d4..9ee43f92dd1 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -474,7 +474,7 @@ Vulkan 1.3 -- all DONE: anv, radv, lvp
 
   VK_KHR_copy_commands2                                 DONE (anv, lvp, radv, tu, v3dv)
   VK_KHR_dynamic_rendering                              DONE (anv, lvp, radv)
-  VK_KHR_format_feature_flags2                          DONE (anv, radv)
+  VK_KHR_format_feature_flags2                          DONE (anv, radv, tu)
   VK_KHR_maintenance4                                   DONE (anv, radv)
   VK_KHR_shader_non_semantic_info                       DONE (anv, radv, tu, v3dv)
   VK_KHR_shader_terminate_invocation                    DONE (anv, radv, tu)
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index 04d963af4e4..2fd037cc90b 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -131,6 +131,7 @@ get_device_extensions(const struct tu_physical_device *device,
       .KHR_external_memory_fd = true,
       .KHR_external_semaphore = true,
       .KHR_external_semaphore_fd = true,
+      .KHR_format_feature_flags2 = true,
       .KHR_get_memory_requirements2 = true,
       .KHR_imageless_framebuffer = true,
       .KHR_incremental_present = TU_HAS_SURFACE,
diff --git a/src/freedreno/vulkan/tu_formats.c b/src/freedreno/vulkan/tu_formats.c
index 1bd62265264..9cc38cf4055 100644
--- a/src/freedreno/vulkan/tu_formats.c
+++ b/src/freedreno/vulkan/tu_formats.c
@@ -163,9 +163,9 @@ static void
 tu_physical_device_get_format_properties(
    struct tu_physical_device *physical_device,
    VkFormat vk_format,
-   VkFormatProperties *out_properties)
+   VkFormatProperties3 *out_properties)
 {
-   VkFormatFeatureFlags linear = 0, optimal = 0, buffer = 0;
+   VkFormatFeatureFlags2 linear = 0, optimal = 0, buffer = 0;
    enum pipe_format format = tu_vk_format_to_pipe_format(vk_format);
    const struct util_format_description *desc = util_format_description(format);
 
@@ -223,8 +223,12 @@ tu_physical_device_get_format_properties(
        */
       struct tu_native_format tex = tu6_format_texture(format, TILE6_LINEAR);
       if (tex.swap == WZYX && tex.fmt != FMT6_1_5_5_5_UNORM) {
-         optimal |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
-         buffer |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
+         optimal |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
+                    VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT |
+                    VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR;
+         buffer |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
+                   VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT |
+                   VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR;
       }
 
       /* TODO: The blob also exposes these for R16G16_UINT/R16G16_SINT, but we
@@ -274,6 +278,12 @@ tu_physical_device_get_format_properties(
       buffer = 0;
    }
 
+   /* All our depth formats support shadow comparisons. */
+   if (vk_format_has_depth(vk_format) && (optimal & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+      optimal |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT;
+      linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT;
+   }
+
    /* From the Vulkan 1.3.205 spec, section 19.3 "43.3. Required Format Support":
     *
     *    Mandatory format support: depth/stencil with VkImageType
@@ -304,8 +314,20 @@ tu_GetPhysicalDeviceFormatProperties2(
 {
    TU_FROM_HANDLE(tu_physical_device, physical_device, physicalDevice);
 
+   VkFormatProperties3 local_props3;
+   VkFormatProperties3 *props3 =
+      vk_find_struct(pFormatProperties->pNext, FORMAT_PROPERTIES_3);
+   if (!props3)
+      props3 = &local_props3;
+
    tu_physical_device_get_format_properties(
-      physical_device, format, &pFormatProperties->formatProperties);
+      physical_device, format, props3);
+
+   pFormatProperties->formatProperties = (VkFormatProperties) {
+      .linearTilingFeatures = props3->linearTilingFeatures,
+      .optimalTilingFeatures = props3->optimalTilingFeatures,
+      .bufferFeatures = props3->bufferFeatures,
+   };
 
    VkDrmFormatModifierPropertiesListEXT *list =
       vk_find_struct(pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT);
@@ -344,7 +366,7 @@ tu_get_image_format_properties(
    VkImageFormatProperties *pImageFormatProperties,
    VkFormatFeatureFlags *p_feature_flags)
 {
-   VkFormatProperties format_props;
+   VkFormatProperties3 format_props;
    VkFormatFeatureFlags format_feature_flags;
    VkExtent3D maxExtent;
    uint32_t maxMipLevels;



More information about the mesa-commit mailing list