Mesa (main): radv: add radv_translate_vertex_format()

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 13 05:33:39 UTC 2021


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

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Fri Jul  2 16:02:37 2021 +0100

radv: add radv_translate_vertex_format()

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11717>

---

 src/amd/vulkan/radv_formats.c  | 52 ++++++++++++++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_pipeline.c | 51 ++++-------------------------------------
 src/amd/vulkan/radv_private.h  |  4 ++++
 3 files changed, 61 insertions(+), 46 deletions(-)

diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c
index 6ec05aa17fd..93eeb27bed1 100644
--- a/src/amd/vulkan/radv_formats.c
+++ b/src/amd/vulkan/radv_formats.c
@@ -147,6 +147,58 @@ radv_translate_buffer_numformat(const struct util_format_description *desc, int
    }
 }
 
+void
+radv_translate_vertex_format(const struct radv_physical_device *pdevice, VkFormat format,
+                             const struct util_format_description *desc, unsigned *dfmt,
+                             unsigned *nfmt, bool *post_shuffle,
+                             enum radv_vs_input_alpha_adjust *alpha_adjust)
+{
+   assert(desc->channel[0].type != UTIL_FORMAT_TYPE_VOID);
+   *nfmt = radv_translate_buffer_numformat(desc, 0);
+   *dfmt = radv_translate_buffer_dataformat(desc, 0);
+
+   *alpha_adjust = ALPHA_ADJUST_NONE;
+   if (pdevice->rad_info.chip_class <= GFX8 && pdevice->rad_info.family != CHIP_STONEY) {
+      switch (format) {
+      case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
+      case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
+         *alpha_adjust = ALPHA_ADJUST_SNORM;
+         break;
+      case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
+      case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
+         *alpha_adjust = ALPHA_ADJUST_SSCALED;
+         break;
+      case VK_FORMAT_A2R10G10B10_SINT_PACK32:
+      case VK_FORMAT_A2B10G10R10_SINT_PACK32:
+         *alpha_adjust = ALPHA_ADJUST_SINT;
+         break;
+      default:
+         break;
+      }
+   }
+
+   switch (format) {
+   case VK_FORMAT_B8G8R8A8_UNORM:
+   case VK_FORMAT_B8G8R8A8_SNORM:
+   case VK_FORMAT_B8G8R8A8_USCALED:
+   case VK_FORMAT_B8G8R8A8_SSCALED:
+   case VK_FORMAT_B8G8R8A8_UINT:
+   case VK_FORMAT_B8G8R8A8_SINT:
+   case VK_FORMAT_B8G8R8A8_SRGB:
+   case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+   case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
+   case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
+   case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
+   case VK_FORMAT_A2R10G10B10_UINT_PACK32:
+   case VK_FORMAT_A2R10G10B10_SINT_PACK32:
+      *post_shuffle = true;
+      break;
+   default:
+      *post_shuffle = false;
+      break;
+   }
+}
+
 uint32_t
 radv_translate_tex_dataformat(VkFormat format, const struct util_format_description *desc,
                               int first_non_void)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 8cf02a5c72d..31fd00a820b 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2591,7 +2591,7 @@ radv_generate_graphics_pipeline_key(const struct radv_pipeline *pipeline,
       unsigned location = desc->location;
       unsigned binding = desc->binding;
       unsigned num_format, data_format;
-      int first_non_void;
+      bool post_shuffle;
 
       if (binding_input_rate & (1u << binding)) {
          key.vs.instance_rate_inputs |= 1u << location;
@@ -2599,10 +2599,9 @@ radv_generate_graphics_pipeline_key(const struct radv_pipeline *pipeline,
       }
 
       format_desc = vk_format_description(desc->format);
-      first_non_void = vk_format_get_first_non_void_channel(desc->format);
-
-      num_format = radv_translate_buffer_numformat(format_desc, first_non_void);
-      data_format = radv_translate_buffer_dataformat(format_desc, first_non_void);
+      radv_translate_vertex_format(pipeline->device->physical_device, desc->format, format_desc,
+                                   &data_format, &num_format, &post_shuffle,
+                                   &key.vs.vertex_alpha_adjust[location]);
 
       key.vs.vertex_attribute_formats[location] = data_format | (num_format << 4);
       key.vs.vertex_attribute_bindings[location] = desc->binding;
@@ -2639,48 +2638,8 @@ radv_generate_graphics_pipeline_key(const struct radv_pipeline *pipeline,
             radv_get_attrib_stride(input_state, desc->binding);
       }
 
-      enum radv_vs_input_alpha_adjust adjust = ALPHA_ADJUST_NONE;
-      if (pipeline->device->physical_device->rad_info.chip_class <= GFX8 &&
-          pipeline->device->physical_device->rad_info.family != CHIP_STONEY) {
-         VkFormat format = input_state->pVertexAttributeDescriptions[i].format;
-         switch (format) {
-         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
-         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
-            adjust = ALPHA_ADJUST_SNORM;
-            break;
-         case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
-         case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
-            adjust = ALPHA_ADJUST_SSCALED;
-            break;
-         case VK_FORMAT_A2R10G10B10_SINT_PACK32:
-         case VK_FORMAT_A2B10G10R10_SINT_PACK32:
-            adjust = ALPHA_ADJUST_SINT;
-            break;
-         default:
-            break;
-         }
-      }
-      key.vs.vertex_alpha_adjust[location] = adjust;
-
-      switch (desc->format) {
-      case VK_FORMAT_B8G8R8A8_UNORM:
-      case VK_FORMAT_B8G8R8A8_SNORM:
-      case VK_FORMAT_B8G8R8A8_USCALED:
-      case VK_FORMAT_B8G8R8A8_SSCALED:
-      case VK_FORMAT_B8G8R8A8_UINT:
-      case VK_FORMAT_B8G8R8A8_SINT:
-      case VK_FORMAT_B8G8R8A8_SRGB:
-      case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
-      case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
-      case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
-      case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
-      case VK_FORMAT_A2R10G10B10_UINT_PACK32:
-      case VK_FORMAT_A2R10G10B10_SINT_PACK32:
+      if (post_shuffle)
          key.vs.vertex_post_shuffle |= 1 << location;
-         break;
-      default:
-         break;
-      }
    }
 
    const VkPipelineTessellationStateCreateInfo *tess =
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 8b5774c2797..1a64a439c5e 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1881,6 +1881,10 @@ uint32_t radv_translate_buffer_dataformat(const struct util_format_description *
 uint32_t radv_translate_buffer_numformat(const struct util_format_description *desc,
                                          int first_non_void);
 bool radv_is_buffer_format_supported(VkFormat format, bool *scaled);
+void radv_translate_vertex_format(const struct radv_physical_device *pdevice, VkFormat format,
+                                  const struct util_format_description *desc, unsigned *dfmt,
+                                  unsigned *nfmt, bool *post_shuffle,
+                                  enum radv_vs_input_alpha_adjust *alpha_adjust);
 uint32_t radv_translate_colorformat(VkFormat format);
 uint32_t radv_translate_color_numformat(VkFormat format, const struct util_format_description *desc,
                                         int first_non_void);



More information about the mesa-commit mailing list