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 #include +enum pipe_format +zink_decompose_vertex_format(enum pipe_format format); + VkFormat zink_pipe_format_to_vk_format(enum pipe_format format);