Add getter for format size
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -371,9 +371,12 @@ namespace OpenVulkano
|
||||
return reinterpret_cast<const vk::Format&>(m_format);
|
||||
}
|
||||
|
||||
uint32_t GetBytesPerPixel();
|
||||
|
||||
static DataFormat GetFromName(std::string_view name);
|
||||
|
||||
static DataFormat GetFromMetalPixelFormat(int formatId);
|
||||
|
||||
private:
|
||||
Format m_format;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user