Add MTLPixelFormat to DataFormat mapping

This commit is contained in:
Georg Hagen
2024-07-09 10:07:41 +02:00
parent 92b77e46f5
commit d48d60441a
2 changed files with 285 additions and 1 deletions

View File

@@ -372,7 +372,9 @@ namespace OpenVulkano
}
static DataFormat GetFromName(std::string_view name);
static DataFormat GetFromMetalPixelFormat(int formatId);
private:
Format m_format;
};
}
}

View File

@@ -0,0 +1,282 @@
/*
* 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"
#import <Metal/MTLPixelFormat.h>
namespace OpenVulkano
{
DataFormat DataFormat::GetFromMetalPixelFormat(int formatId)
{
switch(formatId)
{
case MTLPixelFormatA8Unorm: // 1
// Unavailable -> map to R8_UNORM
case MTLPixelFormatR8Unorm: // 10
return DataFormat::R8_UNORM;
case MTLPixelFormatR8Unorm_sRGB: // 11
return DataFormat::R8_SRGB;
case MTLPixelFormatR8Snorm: // 12
return DataFormat::R8_SNORM;
case MTLPixelFormatR8Uint: // 13
return DataFormat::R8_UINT;
case MTLPixelFormatR8Sint: // 14
return DataFormat::R8_SINT;
/* Normal 16 bit formats */
case MTLPixelFormatR16Unorm: // 20
return DataFormat::R16_UNORM;
case MTLPixelFormatR16Snorm: // 22
return DataFormat::R16_SNORM;
case MTLPixelFormatR16Uint: // 23
return DataFormat::R16_UINT;
case MTLPixelFormatR16Sint: // 24
return DataFormat::R16_SINT;
case MTLPixelFormatR16Float: // 25
return DataFormat::R16_SFLOAT;
case MTLPixelFormatRG8Unorm: // 30
return DataFormat::R8G8_UNORM;
case MTLPixelFormatRG8Unorm_sRGB: // 31
return DataFormat::R8G8_SRGB;
case MTLPixelFormatRG8Snorm: // 32
return DataFormat::R8G8_SNORM;
case MTLPixelFormatRG8Uint: // 33
return DataFormat::R8G8_UINT;
case MTLPixelFormatRG8Sint: // 34
return DataFormat::R8G8_SINT;
/* Packed 16 bit formats */
case MTLPixelFormatB5G6R5Unorm: // 40
return DataFormat::B5G6R5_UNORM_PACK16;
case MTLPixelFormatA1BGR5Unorm: // 41
throw std::runtime_error("No mapping form A1BGR5 to vk type");
case MTLPixelFormatABGR4Unorm: // 42
return DataFormat::A4B4G4R4_UNORM_PACK16;
case MTLPixelFormatBGR5A1Unorm: // 43
return DataFormat::B5G5R5A1_UNORM_PACK16;
/* Normal 32 bit formats */
case MTLPixelFormatR32Uint: // 53
return DataFormat::R32_UINT;
case MTLPixelFormatR32Sint: // 54
return DataFormat::R32_SINT;
case MTLPixelFormatR32Float: // 55
return DataFormat::R32_SFLOAT;
case MTLPixelFormatRG16Unorm: // 60
return DataFormat::R16G16_UNORM;
case MTLPixelFormatRG16Snorm: // 62
return DataFormat::R16G16_SNORM;
case MTLPixelFormatRG16Uint: // 63
return DataFormat::R16G16_UINT;
case MTLPixelFormatRG16Sint: // 64
return DataFormat::R16G16_SINT;
case MTLPixelFormatRG16Float: // 65
return DataFormat::R16G16_SFLOAT;
case MTLPixelFormatRGBA8Unorm: // 70
return DataFormat::R8G8B8A8_UNORM;
case MTLPixelFormatRGBA8Unorm_sRGB: // 71
return DataFormat::R8G8B8A8_SRGB;
case MTLPixelFormatRGBA8Snorm: // 72
return DataFormat::R8G8B8A8_SNORM;
case MTLPixelFormatRGBA8Uint: // 73
return DataFormat::R8G8B8A8_UINT;
case MTLPixelFormatRGBA8Sint: // 74
return DataFormat::R8G8B8A8_SINT;
case MTLPixelFormatBGRA8Unorm: // 80
return DataFormat::B8G8R8A8_UNORM;
case MTLPixelFormatBGRA8Unorm_sRGB: // 81
return DataFormat::B8G8R8A8_SRGB;
/* Packed 32 bit formats */
case MTLPixelFormatRGB10A2Unorm: // 90
return DataFormat::A2B10G10R10_UNORM_PACK32;
case MTLPixelFormatRGB10A2Uint: // 91
return DataFormat::A2B10G10R10_UINT_PACK32;
case MTLPixelFormatRG11B10Float: // 92
return DataFormat::B10G11R11_UFLOAT_PACK32;
case MTLPixelFormatRGB9E5Float: // 93
return DataFormat::E5B9G9R9_UFLOAT_PACK32;
case MTLPixelFormatBGR10A2Unorm: // 94
return DataFormat::A2R10G10B10_UNORM_PACK32;
case MTLPixelFormatBGR10_XR: // 554
case MTLPixelFormatBGR10_XR_sRGB: // 555
throw std::runtime_error("Unimplemented format");
/* Normal 64 bit formats */
case MTLPixelFormatRG32Uint: // 103
return DataFormat::R32G32_UINT;
case MTLPixelFormatRG32Sint: // 104
return DataFormat::R32G32_SINT;
case MTLPixelFormatRG32Float: // 105
return DataFormat::R32G32_SFLOAT;
case MTLPixelFormatRGBA16Unorm: // 110
return DataFormat::R16G16B16A16_UNORM;
case MTLPixelFormatRGBA16Snorm: // 112
return DataFormat::R16G16B16A16_SNORM;
case MTLPixelFormatRGBA16Uint: // 113
return DataFormat::R16G16B16A16_UINT;
case MTLPixelFormatRGBA16Sint: // 114
return DataFormat::R16G16B16A16_SINT;
case MTLPixelFormatRGBA16Float: // 115
return DataFormat::R16G16B16A16_SFLOAT;
case MTLPixelFormatBGRA10_XR: // 552
case MTLPixelFormatBGRA10_XR_sRGB: // 553
throw std::runtime_error("Unimplemented format");
/* Normal 128 bit formats */
case MTLPixelFormatRGBA32Uint: // 123
return DataFormat::R32G32B32A32_UINT;
case MTLPixelFormatRGBA32Sint: // 124
return DataFormat::R32G32B32A32_SINT;
case MTLPixelFormatRGBA32Float: // 125
return DataFormat::R32G32B32A32_SFLOAT;
/* Compressed formats. */
/* S3TC/DXT */
case MTLPixelFormatBC1_RGBA: // 130
case MTLPixelFormatBC1_RGBA_sRGB: // 131
case MTLPixelFormatBC2_RGBA: // 132
case MTLPixelFormatBC2_RGBA_sRGB: // 133
case MTLPixelFormatBC3_RGBA: // 134
case MTLPixelFormatBC3_RGBA_sRGB: // 135
/* RGTC */
case MTLPixelFormatBC4_RUnorm: // 140
case MTLPixelFormatBC4_RSnorm: // 141
case MTLPixelFormatBC5_RGUnorm: // 142
case MTLPixelFormatBC5_RGSnorm: // 143
/* BPTC */
case MTLPixelFormatBC6H_RGBFloat: // 150
case MTLPixelFormatBC6H_RGBUfloat: // 151
case MTLPixelFormatBC7_RGBAUnorm: // 152
case MTLPixelFormatBC7_RGBAUnorm_sRGB: // 153
/* PVRTC */
case MTLPixelFormatPVRTC_RGB_2BPP: // 160
case MTLPixelFormatPVRTC_RGB_2BPP_sRGB: // 161
case MTLPixelFormatPVRTC_RGB_4BPP: // 162
case MTLPixelFormatPVRTC_RGB_4BPP_sRGB: // 163
case MTLPixelFormatPVRTC_RGBA_2BPP: // 164
case MTLPixelFormatPVRTC_RGBA_2BPP_sRGB: // 165
case MTLPixelFormatPVRTC_RGBA_4BPP: // 166
case MTLPixelFormatPVRTC_RGBA_4BPP_sRGB: // 167
/* ETC2 */
case MTLPixelFormatEAC_R11Unorm: // 170
case MTLPixelFormatEAC_R11Snorm: // 172
case MTLPixelFormatEAC_RG11Unorm: // 174
case MTLPixelFormatEAC_RG11Snorm: // 176
case MTLPixelFormatEAC_RGBA8: // 178
case MTLPixelFormatEAC_RGBA8_sRGB: // 179
case MTLPixelFormatETC2_RGB8: // 180
case MTLPixelFormatETC2_RGB8_sRGB: // 181
case MTLPixelFormatETC2_RGB8A1: // 182
case MTLPixelFormatETC2_RGB8A1_sRGB: // 183
/* ASTC */
case MTLPixelFormatASTC_4x4_sRGB: // 186
case MTLPixelFormatASTC_5x4_sRGB: // 187
case MTLPixelFormatASTC_5x5_sRGB: // 188
case MTLPixelFormatASTC_6x5_sRGB: // 189
case MTLPixelFormatASTC_6x6_sRGB: // 190
case MTLPixelFormatASTC_8x5_sRGB: // 192
case MTLPixelFormatASTC_8x6_sRGB: // 193
case MTLPixelFormatASTC_8x8_sRGB: // 194
case MTLPixelFormatASTC_10x5_sRGB: // 195
case MTLPixelFormatASTC_10x6_sRGB: // 196
case MTLPixelFormatASTC_10x8_sRGB: // 197
case MTLPixelFormatASTC_10x10_sRGB: // 198
case MTLPixelFormatASTC_12x10_sRGB: // 199
case MTLPixelFormatASTC_12x12_sRGB: // 200
case MTLPixelFormatASTC_4x4_LDR: // 204
case MTLPixelFormatASTC_5x4_LDR: // 205
case MTLPixelFormatASTC_5x5_LDR: // 206
case MTLPixelFormatASTC_6x5_LDR: // 207
case MTLPixelFormatASTC_6x6_LDR: // 208
case MTLPixelFormatASTC_8x5_LDR: // 210
case MTLPixelFormatASTC_8x6_LDR: // 211
case MTLPixelFormatASTC_8x8_LDR: // 212
case MTLPixelFormatASTC_10x5_LDR: // 213
case MTLPixelFormatASTC_10x6_LDR: // 214
case MTLPixelFormatASTC_10x8_LDR: // 215
case MTLPixelFormatASTC_10x10_LDR: // 216
case MTLPixelFormatASTC_12x10_LDR: // 217
case MTLPixelFormatASTC_12x12_LDR: // 218
// ASTC HDR (High Dynamic Range) Formats
case MTLPixelFormatASTC_4x4_HDR: // 222
case MTLPixelFormatASTC_5x4_HDR: // 223
case MTLPixelFormatASTC_5x5_HDR: // 224
case MTLPixelFormatASTC_6x5_HDR: // 225
case MTLPixelFormatASTC_6x6_HDR: // 226
case MTLPixelFormatASTC_8x5_HDR: // 228
case MTLPixelFormatASTC_8x6_HDR: // 229
case MTLPixelFormatASTC_8x8_HDR: // 230
case MTLPixelFormatASTC_10x5_HDR: // 231
case MTLPixelFormatASTC_10x6_HDR: // 232
case MTLPixelFormatASTC_10x8_HDR: // 233
case MTLPixelFormatASTC_10x10_HDR: // 234
case MTLPixelFormatASTC_12x10_HDR: // 235
case MTLPixelFormatASTC_12x12_HDR: // 236
throw std::runtime_error("Conversion not yet implemented"); //TODO
/*!
@constant case MTLPixelFormatGBGR422
@abstract A pixel format where the red and green channels are subsampled horizontally. Two pixels are stored in 32 bits, with shared red and blue values, and unique green values.
@discussion This format is equivalent to YUY2, YUYV, yuvs, or GL_RGB_422_APPLE/GL_UNSIGNED_SHORT_8_8_REV_APPLE. The component order, from lowest addressed byte to highest, is Y0, Cb, Y1, Cr. There is no implicit colorspace conversion from YUV to RGB, the shader will receive (Cr, Y, Cb, 1). 422 textures must have a width that is a multiple of 2, and can only be used for 2D non-mipmap textures. When sampling, ClampToEdge is the only usable wrap mode.
*/
case MTLPixelFormatGBGR422: // 240
return DataFormat::G8B8G8R8_422_UNORM;
/*!
@constant case MTLPixelFormatBGRG422
@abstract A pixel format where the red and green channels are subsampled horizontally. Two pixels are stored in 32 bits, with shared red and blue values, and unique green values.
@discussion This format is equivalent to UYVY, 2vuy, or GL_RGB_422_APPLE/GL_UNSIGNED_SHORT_8_8_APPLE. The component order, from lowest addressed byte to highest, is Cb, Y0, Cr, Y1. There is no implicit colorspace conversion from YUV to RGB, the shader will receive (Cr, Y, Cb, 1). 422 textures must have a width that is a multiple of 2, and can only be used for 2D non-mipmap textures. When sampling, ClampToEdge is the only usable wrap mode.
*/
case MTLPixelFormatBGRG422: // 241
return DataFormat::B8G8R8G8_422_UNORM;
/* Depth */
case MTLPixelFormatDepth16Unorm: // 250
return DataFormat::D16_UNORM;
case MTLPixelFormatDepth32Float: // 252
return DataFormat::D32_SFLOAT;
/* Stencil */
case MTLPixelFormatStencil8: // 253
return DataFormat::S8_UINT;
/* Depth Stencil */
//case MTLPixelFormatDepth24Unorm_Stencil8: // 255
return DataFormat::D24_UNORM_S8_UINT;
case MTLPixelFormatDepth32Float_Stencil8: // 260
return DataFormat::D32_SFLOAT_S8_UINT;
case MTLPixelFormatX32_Stencil8: // 261
//case MTLPixelFormatX24_Stencil8: // 262
throw std::runtime_error("Conversion not yet implemented");
}
return UNDEFINED;
}
}