Vulkan: Convert VertexBuffer to Contain Supported Attributes #107733
|
@ -241,7 +241,7 @@ VkFormat to_vk_format(const eGPUTextureFormat format)
|
|||
return VK_FORMAT_UNDEFINED;
|
||||
}
|
||||
|
||||
VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
||||
static VkFormat to_vk_format_norm(const GPUVertCompType type, const uint32_t size)
|
||||
{
|
||||
switch (type) {
|
||||
case GPU_COMP_I8:
|
||||
|
@ -254,8 +254,11 @@ VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
|||
return VK_FORMAT_R8G8B8_SNORM;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_SNORM;
|
||||
case 16:
|
||||
return VK_FORMAT_R8G8B8A8_SNORM;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_SNORM;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -269,8 +272,11 @@ VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
|||
return VK_FORMAT_R8G8B8_UNORM;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
case 16:
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_UNORM;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -285,7 +291,8 @@ VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
|||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_SNORM;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_SNORM;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -300,39 +307,102 @@ VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
|||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_UNORM;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_UNORM;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_I10:
|
||||
BLI_assert(size == 4);
|
||||
return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
|
||||
|
||||
case GPU_COMP_I32:
|
||||
switch (size) {
|
||||
case 4:
|
||||
return VK_FORMAT_R32_SINT;
|
||||
case 8:
|
||||
return VK_FORMAT_R32G32_SINT;
|
||||
case 12:
|
||||
return VK_FORMAT_R32G32B32_SINT;
|
||||
case 16:
|
||||
return VK_FORMAT_R32G32B32A32_SINT;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_U32:
|
||||
case GPU_COMP_F32:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
|
||||
static VkFormat to_vk_format_float(const GPUVertCompType type, const uint32_t size)
|
||||
{
|
||||
switch (type) {
|
||||
case GPU_COMP_I8:
|
||||
switch (size) {
|
||||
case 1:
|
||||
return VK_FORMAT_R8_SSCALED;
|
||||
case 2:
|
||||
return VK_FORMAT_R8G8_SSCALED;
|
||||
case 3:
|
||||
return VK_FORMAT_R8G8B8_SSCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_SSCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_SSCALED;
|
||||
}
|
||||
case GPU_COMP_U8:
|
||||
switch (size) {
|
||||
case 1:
|
||||
return VK_FORMAT_R8_USCALED;
|
||||
case 2:
|
||||
return VK_FORMAT_R8G8_USCALED;
|
||||
case 3:
|
||||
return VK_FORMAT_R8G8B8_USCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_USCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_USCALED;
|
||||
}
|
||||
case GPU_COMP_I16:
|
||||
switch (size) {
|
||||
case 2:
|
||||
return VK_FORMAT_R16_SSCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R16G16_SSCALED;
|
||||
case 6:
|
||||
return VK_FORMAT_R16G16B16_SSCALED;
|
||||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_SSCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_SSCALED;
|
||||
}
|
||||
case GPU_COMP_U16:
|
||||
switch (size) {
|
||||
case 2:
|
||||
return VK_FORMAT_R16_USCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R16G16_USCALED;
|
||||
case 6:
|
||||
return VK_FORMAT_R16G16B16_USCALED;
|
||||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_USCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_USCALED;
|
||||
}
|
||||
|
||||
case GPU_COMP_I32:
|
||||
case GPU_COMP_U32:
|
||||
/* NOTE: GPU_COMP_I32/U32 using GPU_FETCH_INT_TO_FLOAT isn't natively supported. These are
|
||||
* converted on the host and therefor needs to be attached as signed floats. */
|
||||
Jeroen-Bakker marked this conversation as resolved
Outdated
|
||||
switch (size) {
|
||||
case 4:
|
||||
return VK_FORMAT_R32_UINT;
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
case 8:
|
||||
return VK_FORMAT_R32G32_UINT;
|
||||
return VK_FORMAT_R32G32_SFLOAT;
|
||||
case 12:
|
||||
return VK_FORMAT_R32G32B32_UINT;
|
||||
return VK_FORMAT_R32G32B32_SFLOAT;
|
||||
case 16:
|
||||
return VK_FORMAT_R32G32B32A32_UINT;
|
||||
return VK_FORMAT_R32G32B32A32_SFLOAT;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_F32:
|
||||
switch (size) {
|
||||
|
@ -347,17 +417,165 @@ VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size)
|
|||
case 64:
|
||||
return VK_FORMAT_R32G32B32A32_SFLOAT;
|
||||
default:
|
||||
break;
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
|
||||
case GPU_COMP_I10:
|
||||
BLI_assert(size == 4);
|
||||
return VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
|
||||
static VkFormat to_vk_format_int(const GPUVertCompType type, const uint32_t size)
|
||||
{
|
||||
switch (type) {
|
||||
case GPU_COMP_I8:
|
||||
switch (size) {
|
||||
case 1:
|
||||
return VK_FORMAT_R8_SINT;
|
||||
case 2:
|
||||
return VK_FORMAT_R8G8_SINT;
|
||||
case 3:
|
||||
return VK_FORMAT_R8G8B8_SINT;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_SINT;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_SINT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_U8:
|
||||
switch (size) {
|
||||
case 1:
|
||||
return VK_FORMAT_R8_USCALED;
|
||||
case 2:
|
||||
return VK_FORMAT_R8G8_USCALED;
|
||||
case 3:
|
||||
return VK_FORMAT_R8G8B8_USCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R8G8B8A8_USCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R8_USCALED;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_I16:
|
||||
switch (size) {
|
||||
case 2:
|
||||
return VK_FORMAT_R16_SINT;
|
||||
case 4:
|
||||
return VK_FORMAT_R16G16_SINT;
|
||||
case 6:
|
||||
return VK_FORMAT_R16G16B16_SINT;
|
||||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_SINT;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_SINT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_U16:
|
||||
switch (size) {
|
||||
case 2:
|
||||
return VK_FORMAT_R16_USCALED;
|
||||
case 4:
|
||||
return VK_FORMAT_R16G16_USCALED;
|
||||
case 6:
|
||||
return VK_FORMAT_R16G16B16_USCALED;
|
||||
case 8:
|
||||
return VK_FORMAT_R16G16B16A16_USCALED;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R16_USCALED;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_I32:
|
||||
switch (size) {
|
||||
case 4:
|
||||
return VK_FORMAT_R32_SINT;
|
||||
case 8:
|
||||
return VK_FORMAT_R32G32_SINT;
|
||||
case 12:
|
||||
return VK_FORMAT_R32G32B32_SINT;
|
||||
case 16:
|
||||
return VK_FORMAT_R32G32B32A32_SINT;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SINT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_U32:
|
||||
switch (size) {
|
||||
case 4:
|
||||
return VK_FORMAT_R32_UINT;
|
||||
case 8:
|
||||
return VK_FORMAT_R32G32_UINT;
|
||||
case 12:
|
||||
return VK_FORMAT_R32G32B32_UINT;
|
||||
case 16:
|
||||
return VK_FORMAT_R32G32B32A32_UINT;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_UINT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_F32:
|
||||
switch (size) {
|
||||
case 4:
|
||||
return VK_FORMAT_R32_SINT;
|
||||
case 8:
|
||||
return VK_FORMAT_R32G32_SINT;
|
||||
case 12:
|
||||
return VK_FORMAT_R32G32B32_SINT;
|
||||
case 16:
|
||||
return VK_FORMAT_R32G32B32A32_SINT;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SINT;
|
||||
}
|
||||
break;
|
||||
|
||||
case GPU_COMP_I10:
|
||||
BLI_assert(size == 4);
|
||||
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
|
||||
return VK_FORMAT_A2B10G10R10_SINT_PACK32;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
|
||||
VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size, GPUVertFetchMode fetch_mode)
|
||||
{
|
||||
switch (fetch_mode) {
|
||||
case GPU_FETCH_FLOAT:
|
||||
case GPU_FETCH_INT_TO_FLOAT:
|
||||
return to_vk_format_float(type, size);
|
||||
break;
|
||||
case GPU_FETCH_INT:
|
||||
return to_vk_format_int(type, size);
|
||||
break;
|
||||
case GPU_FETCH_INT_TO_FLOAT_UNIT:
|
||||
return to_vk_format_norm(type, size);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
BLI_assert_unreachable();
|
||||
return VK_FORMAT_R32_SFLOAT;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,9 @@ namespace blender::gpu {
|
|||
|
||||
VkImageAspectFlagBits to_vk_image_aspect_flag_bits(const eGPUTextureFormat format);
|
||||
VkFormat to_vk_format(const eGPUTextureFormat format);
|
||||
VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size);
|
||||
VkFormat to_vk_format(const GPUVertCompType type,
|
||||
const uint32_t size,
|
||||
const GPUVertFetchMode fetch_mode);
|
||||
VkComponentMapping to_vk_component_mapping(const eGPUTextureFormat format);
|
||||
VkImageViewType to_vk_image_view_type(const eGPUTextureType type);
|
||||
VkImageType to_vk_image_type(const eGPUTextureType type);
|
||||
|
|
Loading…
Reference in New Issue
spelling