From db4efa14dfa62e86ffd632c097b59caa5819ea91 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:54 -0600 Subject: [PATCH] nvk: Move the vertex format table into nvk_format.h Part-of: --- src/nouveau/vulkan/nvk_cmd_draw.c | 131 ++---------------------------- src/nouveau/vulkan/nvk_format.c | 127 +++++++++++++++++++++++++++++ src/nouveau/vulkan/nvk_format.h | 11 +++ 3 files changed, 146 insertions(+), 123 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index d81bf7dc04b..bd95a0b2d33 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -1,6 +1,7 @@ #include "nvk_buffer.h" #include "nvk_cmd_buffer.h" #include "nvk_device.h" +#include "nvk_format.h" #include "nvk_image.h" #include "nvk_image_view.h" #include "nvk_physical_device.h" @@ -599,142 +600,26 @@ nvk_cmd_bind_graphics_pipeline(struct nvk_cmd_buffer *cmd, nouveau_ws_push_append(p, &pipeline->push); } -#define VFMT(vk_fmt, widths, swap_rb, type) \ - [VK_FORMAT_##vk_fmt] = \ - { NV9097_SET_VERTEX_ATTRIBUTE_A_COMPONENT_BIT_WIDTHS_##widths, \ - NV9097_SET_VERTEX_ATTRIBUTE_A_SWAP_R_AND_B_##swap_rb, \ - NV9097_SET_VERTEX_ATTRIBUTE_A_NUMERICAL_TYPE_NUM_##type } - -static const struct nvk_vf_format { - uint8_t component_bit_widths; - uint8_t swap_r_and_b:1; - uint8_t numerical_type:7; -} nvk_vf_formats[] = { - VFMT(R8_UNORM, R8, FALSE, UNORM), - VFMT(R8_SNORM, R8, FALSE, SNORM), - VFMT(R8_USCALED, R8, FALSE, USCALED), - VFMT(R8_SSCALED, R8, FALSE, SSCALED), - VFMT(R8_UINT, R8, FALSE, UINT), - VFMT(R8_SINT, R8, FALSE, SINT), - - VFMT(R8G8_UNORM, R8_G8, FALSE, UNORM), - VFMT(R8G8_SNORM, R8_G8, FALSE, SNORM), - VFMT(R8G8_USCALED, R8_G8, FALSE, USCALED), - VFMT(R8G8_SSCALED, R8_G8, FALSE, SSCALED), - VFMT(R8G8_UINT, R8_G8, FALSE, UINT), - VFMT(R8G8_SINT, R8_G8, FALSE, SINT), - - VFMT(R8G8B8_UNORM, R8_G8_B8, FALSE, UNORM), - VFMT(R8G8B8_SNORM, R8_G8_B8, FALSE, SNORM), - VFMT(R8G8B8_USCALED, R8_G8_B8, FALSE, USCALED), - VFMT(R8G8B8_SSCALED, R8_G8_B8, FALSE, SSCALED), - VFMT(R8G8B8_UINT, R8_G8_B8, FALSE, UINT), - VFMT(R8G8B8_SINT, R8_G8_B8, FALSE, SINT), - - VFMT(B8G8R8_UNORM, R8_G8_B8, TRUE, UNORM), - VFMT(B8G8R8_SNORM, R8_G8_B8, TRUE, SNORM), - VFMT(B8G8R8_USCALED, R8_G8_B8, TRUE, USCALED), - VFMT(B8G8R8_SSCALED, R8_G8_B8, TRUE, SSCALED), - VFMT(B8G8R8_UINT, R8_G8_B8, TRUE, UINT), - VFMT(B8G8R8_SINT, R8_G8_B8, TRUE, SINT), - - VFMT(R8G8B8A8_UNORM, R8_G8_B8_A8, FALSE, UNORM), - VFMT(R8G8B8A8_SNORM, R8_G8_B8_A8, FALSE, SNORM), - VFMT(R8G8B8A8_USCALED, R8_G8_B8_A8, FALSE, USCALED), - VFMT(R8G8B8A8_SSCALED, R8_G8_B8_A8, FALSE, SSCALED), - VFMT(R8G8B8A8_UINT, R8_G8_B8_A8, FALSE, UINT), - VFMT(R8G8B8A8_SINT, R8_G8_B8_A8, FALSE, SINT), - - VFMT(B8G8R8A8_UNORM, R8_G8_B8_A8, TRUE, UNORM), - VFMT(B8G8R8A8_SNORM, R8_G8_B8_A8, TRUE, SNORM), - VFMT(B8G8R8A8_USCALED, R8_G8_B8_A8, TRUE, USCALED), - VFMT(B8G8R8A8_SSCALED, R8_G8_B8_A8, TRUE, SSCALED), - VFMT(B8G8R8A8_UINT, R8_G8_B8_A8, TRUE, UINT), - VFMT(B8G8R8A8_SINT, R8_G8_B8_A8, TRUE, SINT), - - VFMT(A2R10G10B10_UNORM_PACK32, A2B10G10R10, TRUE, UNORM), - VFMT(A2R10G10B10_SNORM_PACK32, A2B10G10R10, TRUE, SNORM), - VFMT(A2R10G10B10_USCALED_PACK32, A2B10G10R10, TRUE, USCALED), - VFMT(A2R10G10B10_SSCALED_PACK32, A2B10G10R10, TRUE, SSCALED), - VFMT(A2R10G10B10_UINT_PACK32, A2B10G10R10, TRUE, UINT), - VFMT(A2R10G10B10_SINT_PACK32, A2B10G10R10, TRUE, SINT), - - VFMT(A2B10G10R10_UNORM_PACK32, A2B10G10R10, FALSE, UNORM), - VFMT(A2B10G10R10_SNORM_PACK32, A2B10G10R10, FALSE, SNORM), - VFMT(A2B10G10R10_USCALED_PACK32, A2B10G10R10, FALSE, USCALED), - VFMT(A2B10G10R10_SSCALED_PACK32, A2B10G10R10, FALSE, SSCALED), - VFMT(A2B10G10R10_UINT_PACK32, A2B10G10R10, FALSE, UINT), - VFMT(A2B10G10R10_SINT_PACK32, A2B10G10R10, FALSE, SINT), - - VFMT(R16_UNORM, R16, FALSE, UNORM), - VFMT(R16_SNORM, R16, FALSE, SNORM), - VFMT(R16_USCALED, R16, FALSE, USCALED), - VFMT(R16_SSCALED, R16, FALSE, SSCALED), - VFMT(R16_UINT, R16, FALSE, UINT), - VFMT(R16_SINT, R16, FALSE, SINT), - VFMT(R16_SFLOAT, R16, FALSE, FLOAT), - - VFMT(R16G16_UNORM, R16_G16, FALSE, UNORM), - VFMT(R16G16_SNORM, R16_G16, FALSE, SNORM), - VFMT(R16G16_USCALED, R16_G16, FALSE, USCALED), - VFMT(R16G16_SSCALED, R16_G16, FALSE, SSCALED), - VFMT(R16G16_UINT, R16_G16, FALSE, UINT), - VFMT(R16G16_SINT, R16_G16, FALSE, SINT), - VFMT(R16G16_SFLOAT, R16_G16, FALSE, FLOAT), - - VFMT(R16G16B16_UNORM, R16_G16_B16, FALSE, UNORM), - VFMT(R16G16B16_SNORM, R16_G16_B16, FALSE, SNORM), - VFMT(R16G16B16_USCALED, R16_G16_B16, FALSE, USCALED), - VFMT(R16G16B16_SSCALED, R16_G16_B16, FALSE, SSCALED), - VFMT(R16G16B16_UINT, R16_G16_B16, FALSE, UINT), - VFMT(R16G16B16_SINT, R16_G16_B16, FALSE, SINT), - VFMT(R16G16B16_SFLOAT, R16_G16_B16, FALSE, FLOAT), - - VFMT(R16G16B16A16_UNORM, R16_G16_B16_A16, FALSE, UNORM), - VFMT(R16G16B16A16_SNORM, R16_G16_B16_A16, FALSE, SNORM), - VFMT(R16G16B16A16_USCALED, R16_G16_B16_A16, FALSE, USCALED), - VFMT(R16G16B16A16_SSCALED, R16_G16_B16_A16, FALSE, SSCALED), - VFMT(R16G16B16A16_UINT, R16_G16_B16_A16, FALSE, UINT), - VFMT(R16G16B16A16_SINT, R16_G16_B16_A16, FALSE, SINT), - VFMT(R16G16B16A16_SFLOAT, R16_G16_B16_A16, FALSE, FLOAT), - - VFMT(R32_UINT, R32, FALSE, UINT), - VFMT(R32_SINT, R32, FALSE, SINT), - VFMT(R32_SFLOAT, R32, FALSE, FLOAT), - - VFMT(R32G32_UINT, R32_G32, FALSE, UINT), - VFMT(R32G32_SINT, R32_G32, FALSE, SINT), - VFMT(R32G32_SFLOAT, R32_G32, FALSE, FLOAT), - - VFMT(R32G32B32_UINT, R32_G32_B32, FALSE, UINT), - VFMT(R32G32B32_SINT, R32_G32_B32, FALSE, SINT), - VFMT(R32G32B32_SFLOAT, R32_G32_B32, FALSE, FLOAT), - - VFMT(R32G32B32A32_UINT, R32_G32_B32_A32, FALSE, UINT), - VFMT(R32G32B32A32_SINT, R32_G32_B32_A32, FALSE, SINT), - VFMT(R32G32B32A32_SFLOAT, R32_G32_B32_A32, FALSE, FLOAT), -}; - -#undef VFMT - static void nvk_flush_vi_state(struct nvk_cmd_buffer *cmd) { + struct nvk_device *dev = nvk_cmd_buffer_device(cmd); + struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nouveau_ws_push *p = cmd->push; const struct vk_dynamic_graphics_state *dyn = &cmd->vk.dynamic_graphics_state; if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_VI)) { u_foreach_bit(a, dyn->vi->attributes_valid) { - const struct nvk_vf_format *fmt = - &nvk_vf_formats[dyn->vi->attributes[a].format]; + const struct nvk_va_format *fmt = + nvk_get_va_format(pdev, dyn->vi->attributes[a].format); P_IMMD(p, NV9097, SET_VERTEX_ATTRIBUTE_A(a), { .stream = dyn->vi->attributes[a].binding, .offset = dyn->vi->attributes[a].offset, - .component_bit_widths = fmt->component_bit_widths, - .numerical_type = fmt->numerical_type, - .swap_r_and_b = fmt->swap_r_and_b, + .component_bit_widths = fmt->bit_widths, + .numerical_type = fmt->type, + .swap_r_and_b = fmt->swap_rb, }); } diff --git a/src/nouveau/vulkan/nvk_format.c b/src/nouveau/vulkan/nvk_format.c index 568076760c5..c275392efbf 100644 --- a/src/nouveau/vulkan/nvk_format.c +++ b/src/nouveau/vulkan/nvk_format.c @@ -6,6 +6,7 @@ #include "nvtypes.h" #include "classes/cl902d.h" +#include "classes/cl9097.h" #include "classes/cl90c0.h" #include "vulkan/util/vk_enum_defines.h" #include "vulkan/util/vk_format.h" @@ -238,6 +239,132 @@ nvk_get_format(VkFormat vk_format) return NULL; } +#define VA_FMT(vk_fmt, widths, swap_rb, type) \ + [VK_FORMAT_##vk_fmt] = \ + { NV9097_SET_VERTEX_ATTRIBUTE_A_COMPONENT_BIT_WIDTHS_##widths, \ + NV9097_SET_VERTEX_ATTRIBUTE_A_SWAP_R_AND_B_##swap_rb, \ + NV9097_SET_VERTEX_ATTRIBUTE_A_NUMERICAL_TYPE_NUM_##type } + +static const struct nvk_va_format nvk_vf_formats[] = { + VA_FMT(R8_UNORM, R8, FALSE, UNORM), + VA_FMT(R8_SNORM, R8, FALSE, SNORM), + VA_FMT(R8_USCALED, R8, FALSE, USCALED), + VA_FMT(R8_SSCALED, R8, FALSE, SSCALED), + VA_FMT(R8_UINT, R8, FALSE, UINT), + VA_FMT(R8_SINT, R8, FALSE, SINT), + + VA_FMT(R8G8_UNORM, R8_G8, FALSE, UNORM), + VA_FMT(R8G8_SNORM, R8_G8, FALSE, SNORM), + VA_FMT(R8G8_USCALED, R8_G8, FALSE, USCALED), + VA_FMT(R8G8_SSCALED, R8_G8, FALSE, SSCALED), + VA_FMT(R8G8_UINT, R8_G8, FALSE, UINT), + VA_FMT(R8G8_SINT, R8_G8, FALSE, SINT), + + VA_FMT(R8G8B8_UNORM, R8_G8_B8, FALSE, UNORM), + VA_FMT(R8G8B8_SNORM, R8_G8_B8, FALSE, SNORM), + VA_FMT(R8G8B8_USCALED, R8_G8_B8, FALSE, USCALED), + VA_FMT(R8G8B8_SSCALED, R8_G8_B8, FALSE, SSCALED), + VA_FMT(R8G8B8_UINT, R8_G8_B8, FALSE, UINT), + VA_FMT(R8G8B8_SINT, R8_G8_B8, FALSE, SINT), + + VA_FMT(B8G8R8_UNORM, R8_G8_B8, TRUE, UNORM), + VA_FMT(B8G8R8_SNORM, R8_G8_B8, TRUE, SNORM), + VA_FMT(B8G8R8_USCALED, R8_G8_B8, TRUE, USCALED), + VA_FMT(B8G8R8_SSCALED, R8_G8_B8, TRUE, SSCALED), + VA_FMT(B8G8R8_UINT, R8_G8_B8, TRUE, UINT), + VA_FMT(B8G8R8_SINT, R8_G8_B8, TRUE, SINT), + + VA_FMT(R8G8B8A8_UNORM, R8_G8_B8_A8, FALSE, UNORM), + VA_FMT(R8G8B8A8_SNORM, R8_G8_B8_A8, FALSE, SNORM), + VA_FMT(R8G8B8A8_USCALED, R8_G8_B8_A8, FALSE, USCALED), + VA_FMT(R8G8B8A8_SSCALED, R8_G8_B8_A8, FALSE, SSCALED), + VA_FMT(R8G8B8A8_UINT, R8_G8_B8_A8, FALSE, UINT), + VA_FMT(R8G8B8A8_SINT, R8_G8_B8_A8, FALSE, SINT), + + VA_FMT(B8G8R8A8_UNORM, R8_G8_B8_A8, TRUE, UNORM), + VA_FMT(B8G8R8A8_SNORM, R8_G8_B8_A8, TRUE, SNORM), + VA_FMT(B8G8R8A8_USCALED, R8_G8_B8_A8, TRUE, USCALED), + VA_FMT(B8G8R8A8_SSCALED, R8_G8_B8_A8, TRUE, SSCALED), + VA_FMT(B8G8R8A8_UINT, R8_G8_B8_A8, TRUE, UINT), + VA_FMT(B8G8R8A8_SINT, R8_G8_B8_A8, TRUE, SINT), + + VA_FMT(A2R10G10B10_UNORM_PACK32, A2B10G10R10, TRUE, UNORM), + VA_FMT(A2R10G10B10_SNORM_PACK32, A2B10G10R10, TRUE, SNORM), + VA_FMT(A2R10G10B10_USCALED_PACK32, A2B10G10R10, TRUE, USCALED), + VA_FMT(A2R10G10B10_SSCALED_PACK32, A2B10G10R10, TRUE, SSCALED), + VA_FMT(A2R10G10B10_UINT_PACK32, A2B10G10R10, TRUE, UINT), + VA_FMT(A2R10G10B10_SINT_PACK32, A2B10G10R10, TRUE, SINT), + + VA_FMT(A2B10G10R10_UNORM_PACK32, A2B10G10R10, FALSE, UNORM), + VA_FMT(A2B10G10R10_SNORM_PACK32, A2B10G10R10, FALSE, SNORM), + VA_FMT(A2B10G10R10_USCALED_PACK32, A2B10G10R10, FALSE, USCALED), + VA_FMT(A2B10G10R10_SSCALED_PACK32, A2B10G10R10, FALSE, SSCALED), + VA_FMT(A2B10G10R10_UINT_PACK32, A2B10G10R10, FALSE, UINT), + VA_FMT(A2B10G10R10_SINT_PACK32, A2B10G10R10, FALSE, SINT), + + VA_FMT(R16_UNORM, R16, FALSE, UNORM), + VA_FMT(R16_SNORM, R16, FALSE, SNORM), + VA_FMT(R16_USCALED, R16, FALSE, USCALED), + VA_FMT(R16_SSCALED, R16, FALSE, SSCALED), + VA_FMT(R16_UINT, R16, FALSE, UINT), + VA_FMT(R16_SINT, R16, FALSE, SINT), + VA_FMT(R16_SFLOAT, R16, FALSE, FLOAT), + + VA_FMT(R16G16_UNORM, R16_G16, FALSE, UNORM), + VA_FMT(R16G16_SNORM, R16_G16, FALSE, SNORM), + VA_FMT(R16G16_USCALED, R16_G16, FALSE, USCALED), + VA_FMT(R16G16_SSCALED, R16_G16, FALSE, SSCALED), + VA_FMT(R16G16_UINT, R16_G16, FALSE, UINT), + VA_FMT(R16G16_SINT, R16_G16, FALSE, SINT), + VA_FMT(R16G16_SFLOAT, R16_G16, FALSE, FLOAT), + + VA_FMT(R16G16B16_UNORM, R16_G16_B16, FALSE, UNORM), + VA_FMT(R16G16B16_SNORM, R16_G16_B16, FALSE, SNORM), + VA_FMT(R16G16B16_USCALED, R16_G16_B16, FALSE, USCALED), + VA_FMT(R16G16B16_SSCALED, R16_G16_B16, FALSE, SSCALED), + VA_FMT(R16G16B16_UINT, R16_G16_B16, FALSE, UINT), + VA_FMT(R16G16B16_SINT, R16_G16_B16, FALSE, SINT), + VA_FMT(R16G16B16_SFLOAT, R16_G16_B16, FALSE, FLOAT), + + VA_FMT(R16G16B16A16_UNORM, R16_G16_B16_A16, FALSE, UNORM), + VA_FMT(R16G16B16A16_SNORM, R16_G16_B16_A16, FALSE, SNORM), + VA_FMT(R16G16B16A16_USCALED, R16_G16_B16_A16, FALSE, USCALED), + VA_FMT(R16G16B16A16_SSCALED, R16_G16_B16_A16, FALSE, SSCALED), + VA_FMT(R16G16B16A16_UINT, R16_G16_B16_A16, FALSE, UINT), + VA_FMT(R16G16B16A16_SINT, R16_G16_B16_A16, FALSE, SINT), + VA_FMT(R16G16B16A16_SFLOAT, R16_G16_B16_A16, FALSE, FLOAT), + + VA_FMT(R32_UINT, R32, FALSE, UINT), + VA_FMT(R32_SINT, R32, FALSE, SINT), + VA_FMT(R32_SFLOAT, R32, FALSE, FLOAT), + + VA_FMT(R32G32_UINT, R32_G32, FALSE, UINT), + VA_FMT(R32G32_SINT, R32_G32, FALSE, SINT), + VA_FMT(R32G32_SFLOAT, R32_G32, FALSE, FLOAT), + + VA_FMT(R32G32B32_UINT, R32_G32_B32, FALSE, UINT), + VA_FMT(R32G32B32_SINT, R32_G32_B32, FALSE, SINT), + VA_FMT(R32G32B32_SFLOAT, R32_G32_B32, FALSE, FLOAT), + + VA_FMT(R32G32B32A32_UINT, R32_G32_B32_A32, FALSE, UINT), + VA_FMT(R32G32B32A32_SINT, R32_G32_B32_A32, FALSE, SINT), + VA_FMT(R32G32B32A32_SFLOAT, R32_G32_B32_A32, FALSE, FLOAT), +}; + +#undef VA_FMT + +const struct nvk_va_format * +nvk_get_va_format(const struct nvk_physical_device *pdev, VkFormat format) +{ + if (format > ARRAY_SIZE(nvk_vf_formats)) + return NULL; + + if (nvk_vf_formats[format].bit_widths == 0) + return NULL; + + return &nvk_vf_formats[format]; +} + VKAPI_ATTR void VKAPI_CALL nvk_GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, VkFormat format, diff --git a/src/nouveau/vulkan/nvk_format.h b/src/nouveau/vulkan/nvk_format.h index 7077595ce9f..5afc9346c9f 100644 --- a/src/nouveau/vulkan/nvk_format.h +++ b/src/nouveau/vulkan/nvk_format.h @@ -3,6 +3,8 @@ #include "nvk_private.h" +struct nvk_physical_device; + bool nvk_is_storage_image_format(VkFormat vk_format); struct nvk_format { @@ -14,4 +16,13 @@ struct nvk_format { const struct nvk_format *nvk_get_format(VkFormat vk_format); +struct nvk_va_format { + uint8_t bit_widths; + uint8_t swap_rb:1; + uint8_t type:7; +}; + +const struct nvk_va_format * +nvk_get_va_format(const struct nvk_physical_device *pdev, VkFormat format); + #endif