Add getter for format size

This commit is contained in:
Georg Hagen
2024-07-22 00:37:04 +02:00
parent 01c273d2fe
commit f92cc09853
2 changed files with 61 additions and 0 deletions

View File

@@ -5,10 +5,50 @@
*/
#include "DataFormat.hpp"
#include "Base/Logger.hpp"
#include <magic_enum.hpp>
namespace OpenVulkano
{
namespace
{
std::unordered_map<DataFormat::Format, uint32_t> MakeFormatSizeMap()
{
std::unordered_map<DataFormat::Format, uint32_t> map;
for (auto format : magic_enum::enum_values<DataFormat::Format>())
{
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<DataFormat::Format, uint32_t> 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
}