/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #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); } DataFormat DataFormat::GetFromName(std::string_view name) { auto result = magic_enum::enum_cast(name); 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 }