From f92cc09853ea9995919cfa07e203e6620e520716 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Mon, 22 Jul 2024 00:37:04 +0200 Subject: [PATCH] Add getter for format size --- openVulkanoCpp/Scene/DataFormat.cpp | 58 +++++++++++++++++++++++++++++ openVulkanoCpp/Scene/DataFormat.hpp | 3 ++ 2 files changed, 61 insertions(+) diff --git a/openVulkanoCpp/Scene/DataFormat.cpp b/openVulkanoCpp/Scene/DataFormat.cpp index f0efca7..5f46d8b 100644 --- a/openVulkanoCpp/Scene/DataFormat.cpp +++ b/openVulkanoCpp/Scene/DataFormat.cpp @@ -5,10 +5,50 @@ */ #include "DataFormat.hpp" +#include "Base/Logger.hpp" #include namespace OpenVulkano { + namespace + { + std::unordered_map MakeFormatSizeMap() + { + std::unordered_map map; + for (auto format : magic_enum::enum_values()) + { + uint32_t size = 0; + if (format == DataFormat::R4G4_UNORM_PACK8 || format == DataFormat::S8_UINT) size = 1; + else if (format >= DataFormat::R4G4B4A4_UNORM_PACK16 && format <= DataFormat::A1R5G5B5_UNORM_PACK16) size = 2; + else if (format >= DataFormat::R8_UNORM && format <= DataFormat::R8_SRGB) size = 1; + else if (format >= DataFormat::R8G8_UNORM && format <= DataFormat::R8G8_SRGB) size = 2; + else if (format >= DataFormat::R8G8B8_UNORM && format <= DataFormat::B8G8R8_SRGB) size = 3; + else if (format >= DataFormat::R8G8B8A8_UNORM && format <= DataFormat::A2B10G10R10_SINT_PACK32) size = 4; + else if (format >= DataFormat::R16_UNORM && format <= DataFormat::R16_SFLOAT) size = 2; + else if (format >= DataFormat::R16G16_UNORM && format <= DataFormat::R16G16_SFLOAT) size = 4; + else if (format >= DataFormat::R16G16B16_UNORM && format <= DataFormat::R16G16B16_SFLOAT) size = 6; + else if (format >= DataFormat::R16G16B16A16_UNORM && format <= DataFormat::R16G16B16A16_SFLOAT) size = 8; + else if (format >= DataFormat::R32_UINT && format <= DataFormat::R32_SFLOAT) size = 4; + else if (format >= DataFormat::R32G32_UINT && format <= DataFormat::R32G32_SFLOAT) size = 8; + else if (format >= DataFormat::R32G32B32_UINT && format <= DataFormat::R32G32B32_SFLOAT) size = 12; + else if (format >= DataFormat::R32G32B32A32_UINT && format <= DataFormat::R32G32B32A32_SFLOAT) size = 16; + else if (format >= DataFormat::R64_UINT && format <= DataFormat::R64_SFLOAT) size = 8; + else if (format >= DataFormat::R64G64_UINT && format <= DataFormat::R64G64_SFLOAT) size = 16; + else if (format >= DataFormat::R64G64B64_UINT && format <= DataFormat::R64G64B64_SFLOAT) size = 24; + else if (format >= DataFormat::R64G64B64A64_UINT && format <= DataFormat::R64G64B64A64_SFLOAT) size = 32; + else if (format == DataFormat::B10G11R11_UFLOAT_PACK32 || format == DataFormat::E5B9G9R9_UFLOAT_PACK32 || + format == DataFormat::X8_D24_UNORM_PACK32 || format == DataFormat::D32_SFLOAT || format == DataFormat::D24_UNORM_S8_UINT) size = 4; + else if (format == DataFormat::D16_UNORM) size = 2; + else if (format == DataFormat::D16_UNORM_S8_UINT) size = 3; + else if (format == DataFormat::D32_SFLOAT_S8_UINT) size = 5; + map[format] = size; + } + return map; + } + + const std::unordered_map FORMAT_SIZE_MAP = MakeFormatSizeMap(); + } + std::string_view DataFormat::GetName() const { return magic_enum::enum_name(m_format); @@ -20,4 +60,22 @@ namespace OpenVulkano if (result.has_value()) return { result.value() }; return { UNDEFINED }; } + + uint32_t DataFormat::GetBytesPerPixel() + { + auto size = FORMAT_SIZE_MAP.find(m_format); + if (size == FORMAT_SIZE_MAP.end() || size->second == 0) [[unlikely]] + { + Logger::RENDER->warn("Failed to get pixel size for format: {}", GetName()); + return 0; + } + return size->second; + } + +#ifndef __APPLE__ + DataFormat DataFormat::GetFromMetalPixelFormat(int formatId) + { + return UNDEFINED; + } +#endif } \ No newline at end of file diff --git a/openVulkanoCpp/Scene/DataFormat.hpp b/openVulkanoCpp/Scene/DataFormat.hpp index 67457a6..67c0f39 100644 --- a/openVulkanoCpp/Scene/DataFormat.hpp +++ b/openVulkanoCpp/Scene/DataFormat.hpp @@ -371,9 +371,12 @@ namespace OpenVulkano return reinterpret_cast(m_format); } + uint32_t GetBytesPerPixel(); + static DataFormat GetFromName(std::string_view name); static DataFormat GetFromMetalPixelFormat(int formatId); + private: Format m_format; };