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

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Sep 13 09:22:01 2021 -0400

zink: add function for decomposing vertex format to single component

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12771>

---

 src/gallium/drivers/zink/zink_format.c | 47 ++++++++++++++++++++++++++++++++++
 src/gallium/drivers/zink/zink_format.h |  3 +++
 2 files changed, 50 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_format.c 
b/src/gallium/drivers/zink/zink_format.c
index 87c1ea548b5..358f409922e 100644
--- a/src/gallium/drivers/zink/zink_format.c
+++ b/src/gallium/drivers/zink/zink_format.c
@@ -148,6 +148,53 @@ static const VkFormat formats[PIPE_FORMAT_COUNT] = {
    [PIPE_FORMAT_BPTC_RGB_UFLOAT] = VK_FORMAT_BC6H_UFLOAT_BLOCK,
 };
 
+enum pipe_format
+zink_decompose_vertex_format(enum pipe_format format)
+{
+   const struct util_format_description *desc = 
util_format_description(format);
+   unsigned first_non_void = util_format_get_first_non_void_channel(format);
+   enum pipe_format new_format;
+   assert(first_non_void == 0);
+   if (!desc->is_array)
+      return PIPE_FORMAT_NONE;
+   if (desc->is_unorm) {
+      enum pipe_format unorm_formats[] = {
+         PIPE_FORMAT_R8_UNORM,
+         PIPE_FORMAT_R16_UNORM,
+         PIPE_FORMAT_R32_UNORM
+      };
+      return unorm_formats[desc->channel[first_non_void].size >> 4];
+   } else if (desc->is_snorm) {
+      enum pipe_format snorm_formats[] = {
+         PIPE_FORMAT_R8_SNORM,
+         PIPE_FORMAT_R16_SNORM,
+         PIPE_FORMAT_R32_SNORM
+      };
+      return snorm_formats[desc->channel[first_non_void].size >> 4];
+   } else {
+      enum pipe_format uint_formats[][3] = {
+         {PIPE_FORMAT_R8_USCALED, PIPE_FORMAT_R16_USCALED, 
PIPE_FORMAT_R32_USCALED},
+         {PIPE_FORMAT_R8_UINT, PIPE_FORMAT_R16_UINT, PIPE_FORMAT_R32_UINT},
+      };
+      enum pipe_format sint_formats[][3] = {
+         {PIPE_FORMAT_R8_SSCALED, PIPE_FORMAT_R16_SSCALED, 
PIPE_FORMAT_R32_SSCALED},
+         {PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R16_SINT, PIPE_FORMAT_R32_SINT},
+      };
+      switch (desc->channel[first_non_void].type) {
+      case UTIL_FORMAT_TYPE_UNSIGNED:
+         return 
uint_formats[desc->channel[first_non_void].pure_integer][desc->channel[first_non_void].size
 >> 4];
+      case UTIL_FORMAT_TYPE_SIGNED:
+         return 
sint_formats[desc->channel[first_non_void].pure_integer][desc->channel[first_non_void].size
 >> 4];
+      case UTIL_FORMAT_TYPE_FLOAT:
+         return desc->channel[first_non_void].size == 16 ? 
PIPE_FORMAT_R16_FLOAT : PIPE_FORMAT_R32_FLOAT;
+         break;
+      default:
+         return PIPE_FORMAT_NONE;
+      }
+   }
+   return new_format;
+}
+
 VkFormat
 zink_pipe_format_to_vk_format(enum pipe_format format)
 {
diff --git a/src/gallium/drivers/zink/zink_format.h 
b/src/gallium/drivers/zink/zink_format.h
index 5f81a78b10e..3324265177d 100644
--- a/src/gallium/drivers/zink/zink_format.h
+++ b/src/gallium/drivers/zink/zink_format.h
@@ -29,6 +29,9 @@
 #include <stdbool.h>
 #include <vulkan/vulkan.h>
 
+enum pipe_format
+zink_decompose_vertex_format(enum pipe_format format);
+
 VkFormat
 zink_pipe_format_to_vk_format(enum pipe_format format);
 

Reply via email to