From 2da2d0ef9c0ed6ea646912b9fe38646d101604ac Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Mon, 9 Dec 2024 15:57:15 +0200 Subject: [PATCH] Changed switch statement to unordered_map, added extra exception information --- openVulkanoCpp/Image/ImageLoaderDds.cpp | 335 ++++++++---------------- 1 file changed, 107 insertions(+), 228 deletions(-) diff --git a/openVulkanoCpp/Image/ImageLoaderDds.cpp b/openVulkanoCpp/Image/ImageLoaderDds.cpp index cdf1c6e..903c772 100644 --- a/openVulkanoCpp/Image/ImageLoaderDds.cpp +++ b/openVulkanoCpp/Image/ImageLoaderDds.cpp @@ -7,6 +7,103 @@ #include "ImageLoaderDds.hpp" #include +#include +#include + +#include + +namespace +{ + std::unordered_map DXGI_TO_OV_DATAFORMAT = { + { DXGI_FORMAT_R32G32B32A32_FLOAT, OpenVulkano::DataFormat::Format::R32G32B32A32_SFLOAT }, + { DXGI_FORMAT_R32G32B32A32_UINT, OpenVulkano::DataFormat::Format::R32G32B32A32_UINT }, + { DXGI_FORMAT_R32G32B32A32_SINT, OpenVulkano::DataFormat::Format::R32G32B32A32_SINT }, + { DXGI_FORMAT_R32G32B32_FLOAT, OpenVulkano::DataFormat::Format::R32G32B32_SFLOAT }, + { DXGI_FORMAT_R32G32B32_UINT, OpenVulkano::DataFormat::Format::R32G32B32_UINT }, + { DXGI_FORMAT_R32G32B32_SINT, OpenVulkano::DataFormat::Format::R32G32B32_SINT }, + + { DXGI_FORMAT_R16G16B16A16_FLOAT, OpenVulkano::DataFormat::Format::R16G16B16A16_SFLOAT }, + { DXGI_FORMAT_R16G16B16A16_UNORM, OpenVulkano::DataFormat::Format::R16G16B16A16_UNORM }, + { DXGI_FORMAT_R16G16B16A16_UINT, OpenVulkano::DataFormat::Format::R16G16B16A16_UINT }, + { DXGI_FORMAT_R16G16B16A16_SNORM, OpenVulkano::DataFormat::Format::R16G16B16A16_SNORM }, + { DXGI_FORMAT_R16G16B16A16_SINT, OpenVulkano::DataFormat::Format::R16G16B16A16_SINT }, + + { DXGI_FORMAT_R32G32_FLOAT, OpenVulkano::DataFormat::Format::R32G32_SFLOAT }, + { DXGI_FORMAT_R32G32_UINT, OpenVulkano::DataFormat::Format::R32G32_UINT }, + { DXGI_FORMAT_R32G32_SINT, OpenVulkano::DataFormat::Format::R32G32_SINT }, + + { DXGI_FORMAT_D32_FLOAT_S8X24_UINT, OpenVulkano::DataFormat::Format::D32_SFLOAT_S8_UINT }, + + { DXGI_FORMAT_R8G8B8A8_UNORM, OpenVulkano::DataFormat::Format::R8G8B8A8_UNORM }, + { DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, OpenVulkano::DataFormat::Format::R8G8B8A8_SRGB }, + { DXGI_FORMAT_R8G8B8A8_UINT, OpenVulkano::DataFormat::Format::R8G8B8A8_UINT }, + { DXGI_FORMAT_R8G8B8A8_SNORM, OpenVulkano::DataFormat::Format::R8G8B8A8_SNORM }, + { DXGI_FORMAT_R8G8B8A8_SINT, OpenVulkano::DataFormat::Format::R8G8B8A8_SINT }, + + { DXGI_FORMAT_R16G16_FLOAT, OpenVulkano::DataFormat::Format::R16G16_SFLOAT }, + { DXGI_FORMAT_R16G16_UNORM, OpenVulkano::DataFormat::Format::R16G16_UNORM }, + { DXGI_FORMAT_R16G16_UINT, OpenVulkano::DataFormat::Format::R16G16_UINT }, + { DXGI_FORMAT_R16G16_SNORM, OpenVulkano::DataFormat::Format::R16G16_SNORM }, + { DXGI_FORMAT_R16G16_SINT, OpenVulkano::DataFormat::Format::R16G16_SINT }, + + { DXGI_FORMAT_D32_FLOAT, OpenVulkano::DataFormat::Format::D32_SFLOAT }, + + { DXGI_FORMAT_R32_FLOAT, OpenVulkano::DataFormat::Format::R32_SFLOAT }, + { DXGI_FORMAT_R32_UINT, OpenVulkano::DataFormat::Format::R32_UINT }, + { DXGI_FORMAT_R32_SINT, OpenVulkano::DataFormat::Format::R32_SINT }, + + { DXGI_FORMAT_D24_UNORM_S8_UINT, OpenVulkano::DataFormat::Format::D24_UNORM_S8_UINT }, + + { DXGI_FORMAT_R8G8_UNORM, OpenVulkano::DataFormat::Format::R8G8_UNORM }, + { DXGI_FORMAT_R8G8_UINT, OpenVulkano::DataFormat::Format::R8G8_UINT }, + { DXGI_FORMAT_R8G8_SNORM, OpenVulkano::DataFormat::Format::R8G8_SNORM }, + { DXGI_FORMAT_R8G8_SINT, OpenVulkano::DataFormat::Format::R8G8_SINT }, + + { DXGI_FORMAT_D16_UNORM, OpenVulkano::DataFormat::Format::D16_UNORM }, + { DXGI_FORMAT_R16_FLOAT, OpenVulkano::DataFormat::Format::R16_SFLOAT }, + { DXGI_FORMAT_R16_UNORM, OpenVulkano::DataFormat::Format::R16_UNORM }, + { DXGI_FORMAT_R16_UINT, OpenVulkano::DataFormat::Format::R16_UINT }, + { DXGI_FORMAT_R16_SNORM, OpenVulkano::DataFormat::Format::R16_SNORM }, + { DXGI_FORMAT_R16_SINT, OpenVulkano::DataFormat::Format::R16_SINT }, + + { DXGI_FORMAT_R8_UNORM, OpenVulkano::DataFormat::Format::R8_UNORM }, + { DXGI_FORMAT_R8_UINT, OpenVulkano::DataFormat::Format::R8_UINT }, + { DXGI_FORMAT_R8_SNORM, OpenVulkano::DataFormat::Format::R8_SNORM }, + { DXGI_FORMAT_R8_SINT, OpenVulkano::DataFormat::Format::R8_SINT }, + + { DXGI_FORMAT_BC1_UNORM, OpenVulkano::DataFormat::Format::BC1_RGBA_UNORM_BLOCK }, + { DXGI_FORMAT_BC1_UNORM_SRGB, OpenVulkano::DataFormat::Format::BC1_RGBA_SRGB_BLOCK }, + + { DXGI_FORMAT_BC2_UNORM, OpenVulkano::DataFormat::Format::BC2_UNORM_BLOCK }, + { DXGI_FORMAT_BC2_UNORM_SRGB, OpenVulkano::DataFormat::Format::BC2_SRGB_BLOCK }, + + { DXGI_FORMAT_BC3_UNORM, OpenVulkano::DataFormat::Format::BC3_UNORM_BLOCK }, + { DXGI_FORMAT_BC3_UNORM_SRGB, OpenVulkano::DataFormat::Format::BC3_SRGB_BLOCK }, + + { DXGI_FORMAT_BC4_UNORM, OpenVulkano::DataFormat::Format::BC4_UNORM_BLOCK }, + { DXGI_FORMAT_BC4_SNORM, OpenVulkano::DataFormat::Format::BC4_SNORM_BLOCK }, + + { DXGI_FORMAT_BC5_UNORM, OpenVulkano::DataFormat::Format::BC5_UNORM_BLOCK }, + { DXGI_FORMAT_BC5_SNORM, OpenVulkano::DataFormat::Format::BC5_SNORM_BLOCK }, + + { DXGI_FORMAT_B5G6R5_UNORM, OpenVulkano::DataFormat::Format::B5G6R5_UNORM_PACK16 }, + { DXGI_FORMAT_B5G5R5A1_UNORM, OpenVulkano::DataFormat::Format::B5G5R5A1_UNORM_PACK16 }, + + { DXGI_FORMAT_B8G8R8A8_UNORM, OpenVulkano::DataFormat::Format::B8G8R8A8_UNORM }, + { DXGI_FORMAT_B8G8R8X8_UNORM, OpenVulkano::DataFormat::Format::B8G8R8A8_SNORM }, + + { DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, OpenVulkano::DataFormat::Format::B8G8R8A8_SRGB }, + { DXGI_FORMAT_B8G8R8X8_UNORM_SRGB, OpenVulkano::DataFormat::Format::B8G8R8A8_SRGB }, + + { DXGI_FORMAT_BC6H_UF16, OpenVulkano::DataFormat::Format::BC6H_UFLOAT_BLOCK }, + { DXGI_FORMAT_BC6H_SF16, OpenVulkano::DataFormat::Format::BC6H_SFLOAT_BLOCK }, + + { DXGI_FORMAT_BC7_UNORM, OpenVulkano::DataFormat::Format::BC7_UNORM_BLOCK }, + { DXGI_FORMAT_BC7_UNORM_SRGB, OpenVulkano::DataFormat::Format::BC7_SRGB_BLOCK }, + + { DXGI_FORMAT_B4G4R4A4_UNORM, OpenVulkano::DataFormat::Format::B4G4R4A4_UNORM_PACK16 }, + }; +} namespace OpenVulkano::Image { @@ -52,243 +149,25 @@ namespace OpenVulkano::Image image->resolution.x = ddsImage->width; image->resolution.y = ddsImage->height; image->resolution.z = 1; - + + if (DXGI_TO_OV_DATAFORMAT.contains(ddsImage->format)) + { + image->dataFormat = DXGI_TO_OV_DATAFORMAT[ddsImage->format]; + } + else + { + throw std::runtime_error(fmt::format("Unhandled DDS texture format: {} ({})", magic_enum::enum_name(ddsImage->format), static_cast(ddsImage->format))); + } + if (ddsImage->mipmaps.size() == 0) { throw std::runtime_error("Failed to read an image from a texture with no mipmaps"); } dds::span texture = ddsImage->mipmaps[0]; - image->data = Array(texture.size_bytes()); memcpy(image->data.Data(), texture.data(), texture.size_bytes()); - image->dataFormat = DataFormat::Format::UNDEFINED; - switch (ddsImage->format) - { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - image->dataFormat = DataFormat::Format::R32G32B32A32_SFLOAT; - break; - case DXGI_FORMAT_R32G32B32A32_UINT: - image->dataFormat = DataFormat::Format::R32G32B32A32_UINT; - break; - case DXGI_FORMAT_R32G32B32A32_SINT: - image->dataFormat = DataFormat::Format::R32G32B32A32_SINT; - break; - case DXGI_FORMAT_R32G32B32_FLOAT: - image->dataFormat = DataFormat::Format::R32G32B32_SFLOAT; - break; - case DXGI_FORMAT_R32G32B32_UINT: - image->dataFormat = DataFormat::Format::R32G32B32_UINT; - break; - case DXGI_FORMAT_R32G32B32_SINT: - image->dataFormat = DataFormat::Format::R32G32B32_SINT; - break; - - case DXGI_FORMAT_R16G16B16A16_FLOAT: - image->dataFormat = DataFormat::Format::R16G16B16A16_SFLOAT; - break; - case DXGI_FORMAT_R16G16B16A16_UNORM: - image->dataFormat = DataFormat::Format::R16G16B16A16_UNORM; - break; - case DXGI_FORMAT_R16G16B16A16_UINT: - image->dataFormat = DataFormat::Format::R16G16B16A16_UINT; - break; - case DXGI_FORMAT_R16G16B16A16_SNORM: - image->dataFormat = DataFormat::Format::R16G16B16A16_SNORM; - break; - case DXGI_FORMAT_R16G16B16A16_SINT: - image->dataFormat = DataFormat::Format::R16G16B16A16_SINT; - break; - - case DXGI_FORMAT_R32G32_FLOAT: - image->dataFormat = DataFormat::Format::R32G32_SFLOAT; - break; - case DXGI_FORMAT_R32G32_UINT: - image->dataFormat = DataFormat::Format::R32G32_UINT; - break; - case DXGI_FORMAT_R32G32_SINT: - image->dataFormat = DataFormat::Format::R32G32_SINT; - break; - - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - image->dataFormat = DataFormat::Format::D32_SFLOAT_S8_UINT; - break; - - case DXGI_FORMAT_R8G8B8A8_UNORM: - image->dataFormat = DataFormat::Format::R8G8B8A8_UNORM; - break; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - image->dataFormat = DataFormat::Format::R8G8B8A8_SRGB; - break; - case DXGI_FORMAT_R8G8B8A8_UINT: - image->dataFormat = DataFormat::Format::R8G8B8A8_UINT; - break; - case DXGI_FORMAT_R8G8B8A8_SNORM: - image->dataFormat = DataFormat::Format::R8G8B8A8_SNORM; - break; - case DXGI_FORMAT_R8G8B8A8_SINT: - image->dataFormat = DataFormat::Format::R8G8B8A8_SINT; - break; - - case DXGI_FORMAT_R16G16_FLOAT: - image->dataFormat = DataFormat::Format::R16G16_SFLOAT; - break; - case DXGI_FORMAT_R16G16_UNORM: - image->dataFormat = DataFormat::Format::R16G16_UNORM; - break; - case DXGI_FORMAT_R16G16_UINT: - image->dataFormat = DataFormat::Format::R16G16_UINT; - break; - case DXGI_FORMAT_R16G16_SNORM: - image->dataFormat = DataFormat::Format::R16G16_SNORM; - break; - case DXGI_FORMAT_R16G16_SINT: - image->dataFormat = DataFormat::Format::R16G16_SINT; - break; - - case DXGI_FORMAT_D32_FLOAT: - image->dataFormat = DataFormat::Format::D32_SFLOAT; - break; - - case DXGI_FORMAT_R32_FLOAT: - image->dataFormat = DataFormat::Format::R32_SFLOAT; - break; - case DXGI_FORMAT_R32_UINT: - image->dataFormat = DataFormat::Format::R32_UINT; - break; - case DXGI_FORMAT_R32_SINT: - image->dataFormat = DataFormat::Format::R32_SINT; - break; - - case DXGI_FORMAT_D24_UNORM_S8_UINT: - image->dataFormat = DataFormat::Format::D24_UNORM_S8_UINT; - break; - - case DXGI_FORMAT_R8G8_UNORM: - image->dataFormat = DataFormat::Format::R8G8_UNORM; - break; - case DXGI_FORMAT_R8G8_UINT: - image->dataFormat = DataFormat::Format::R8G8_UINT; - break; - case DXGI_FORMAT_R8G8_SNORM: - image->dataFormat = DataFormat::Format::R8G8_SNORM; - break; - case DXGI_FORMAT_R8G8_SINT: - image->dataFormat = DataFormat::Format::R8G8_SINT; - break; - - case DXGI_FORMAT_D16_UNORM: - image->dataFormat = DataFormat::Format::D16_UNORM; - break; - case DXGI_FORMAT_R16_FLOAT: - image->dataFormat = DataFormat::Format::R16_SFLOAT; - break; - case DXGI_FORMAT_R16_UNORM: - image->dataFormat = DataFormat::Format::R16_UNORM; - break; - case DXGI_FORMAT_R16_UINT: - image->dataFormat = DataFormat::Format::R16_UINT; - break; - case DXGI_FORMAT_R16_SNORM: - image->dataFormat = DataFormat::Format::R16_SNORM; - break; - case DXGI_FORMAT_R16_SINT: - image->dataFormat = DataFormat::Format::R16_SINT; - break; - - case DXGI_FORMAT_R8_UNORM: - image->dataFormat = DataFormat::Format::R8_UNORM; - break; - case DXGI_FORMAT_R8_UINT: - image->dataFormat = DataFormat::Format::R8_UINT; - break; - case DXGI_FORMAT_R8_SNORM: - image->dataFormat = DataFormat::Format::R8_SNORM; - break; - case DXGI_FORMAT_R8_SINT: - image->dataFormat = DataFormat::Format::R8_SINT; - break; - - case DXGI_FORMAT_BC1_UNORM: - image->dataFormat = DataFormat::Format::BC1_RGBA_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC1_UNORM_SRGB: - image->dataFormat = DataFormat::Format::BC1_RGBA_SRGB_BLOCK; - break; - - case DXGI_FORMAT_BC2_UNORM: - image->dataFormat = DataFormat::Format::BC2_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC2_UNORM_SRGB: - image->dataFormat = DataFormat::Format::BC2_SRGB_BLOCK; - break; - - case DXGI_FORMAT_BC3_UNORM: - image->dataFormat = DataFormat::Format::BC3_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC3_UNORM_SRGB: - image->dataFormat = DataFormat::Format::BC3_SRGB_BLOCK; - break; - - case DXGI_FORMAT_BC4_UNORM: - image->dataFormat = DataFormat::Format::BC4_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC4_SNORM: - image->dataFormat = DataFormat::Format::BC4_SNORM_BLOCK; - break; - - case DXGI_FORMAT_BC5_UNORM: - image->dataFormat = DataFormat::Format::BC5_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC5_SNORM: - image->dataFormat = DataFormat::Format::BC5_SNORM_BLOCK; - break; - - case DXGI_FORMAT_B5G6R5_UNORM: - image->dataFormat = DataFormat::Format::B5G6R5_UNORM_PACK16; - break; - case DXGI_FORMAT_B5G5R5A1_UNORM: - image->dataFormat = DataFormat::Format::B5G5R5A1_UNORM_PACK16; - break; - - case DXGI_FORMAT_B8G8R8A8_UNORM: - image->dataFormat = DataFormat::Format::B8G8R8A8_UNORM; - break; - case DXGI_FORMAT_B8G8R8X8_UNORM: - image->dataFormat = DataFormat::Format::B8G8R8A8_SNORM; - break; - - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - image->dataFormat = DataFormat::Format::B8G8R8A8_SRGB; - break; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - image->dataFormat = DataFormat::Format::B8G8R8A8_SRGB; - break; - - case DXGI_FORMAT_BC6H_UF16: - image->dataFormat = DataFormat::Format::BC6H_UFLOAT_BLOCK; - break; - case DXGI_FORMAT_BC6H_SF16: - image->dataFormat = DataFormat::Format::BC6H_SFLOAT_BLOCK; - break; - - case DXGI_FORMAT_BC7_UNORM: - image->dataFormat = DataFormat::Format::BC7_UNORM_BLOCK; - break; - case DXGI_FORMAT_BC7_UNORM_SRGB: - image->dataFormat = DataFormat::Format::BC7_SRGB_BLOCK; - break; - - case DXGI_FORMAT_B4G4R4A4_UNORM: - image->dataFormat = DataFormat::Format::B4G4R4A4_UNORM_PACK16; - break; - - default: - throw std::runtime_error("Unhandled DDS texture format: " - + std::to_string(*reinterpret_cast(&ddsImage->format))); - } - return image; } }