diff options
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm')
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm | 1930 |
1 files changed, 1620 insertions, 310 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm b/chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm index ed7cb4ab809..82763dd1066 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm +++ b/chromium/third_party/angle/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm @@ -11,10 +11,15 @@ #import <Metal/Metal.h> #include <TargetConditionals.h> +#include "image_util/copyimage.h" +#include "image_util/generatemip.h" +#include "image_util/loadimage.h" #include "libANGLE/renderer/Format.h" #include "libANGLE/renderer/metal/DisplayMtl.h" #include "libANGLE/renderer/metal/mtl_format_utils.h" +using namespace angle; + namespace rx { namespace mtl @@ -30,602 +35,1166 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) switch (this->intendedFormatId) { case angle::FormatID::A8_UNORM: + this->metalFormat = MTLPixelFormatA8Unorm; this->actualFormatId = angle::FormatID::A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::B8G8R8A8_UNORM: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatBGRA8Unorm; - this->actualFormatId = angle::FormatID::B8G8R8A8_UNORM; - } - else - { - this->metalFormat = MTLPixelFormatRGBA8Unorm; - this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; - } + case angle::FormatID::B10G10R10A2_UNORM: + + this->metalFormat = MTLPixelFormatBGR10A2Unorm; + this->actualFormatId = angle::FormatID::B10G10R10A2_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::B8G8R8A8_UNORM: + this->metalFormat = MTLPixelFormatBGRA8Unorm; this->actualFormatId = angle::FormatID::B8G8R8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::B8G8R8A8_UNORM_SRGB: + this->metalFormat = MTLPixelFormatBGRA8Unorm_sRGB; this->actualFormatId = angle::FormatID::B8G8R8A8_UNORM_SRGB; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D32_FLOAT: + this->metalFormat = MTLPixelFormatDepth32Float; this->actualFormatId = angle::FormatID::D32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D32_FLOAT_S8X24_UINT: + this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::NONE: + this->metalFormat = MTLPixelFormatInvalid; this->actualFormatId = angle::FormatID::NONE; + this->initFunction = nullptr; + + this->swizzled = false; break; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R16G16B16A16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA16Float; - this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + case angle::FormatID::R10G10B10A2_UINT: + + this->metalFormat = MTLPixelFormatRGB10A2Uint; + this->actualFormatId = angle::FormatID::R10G10B10A2_UINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R10G10B10A2_UNORM: + + this->metalFormat = MTLPixelFormatRGB10A2Unorm; + this->actualFormatId = angle::FormatID::R10G10B10A2_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R11G11B10_FLOAT: + + this->metalFormat = MTLPixelFormatRG11B10Float; + this->actualFormatId = angle::FormatID::R11G11B10_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R16G16B16A16_FLOAT: + this->metalFormat = MTLPixelFormatRGBA16Float; this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16A16_SINT: + + this->metalFormat = MTLPixelFormatRGBA16Sint; + this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16A16_SNORM: + + this->metalFormat = MTLPixelFormatRGBA16Snorm; + this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16A16_UINT: + + this->metalFormat = MTLPixelFormatRGBA16Uint; + this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16A16_UNORM: + + this->metalFormat = MTLPixelFormatRGBA16Unorm; + this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R16G16_FLOAT: + this->metalFormat = MTLPixelFormatRG16Float; this->actualFormatId = angle::FormatID::R16G16_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatR16Float; - this->actualFormatId = angle::FormatID::R16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + case angle::FormatID::R16G16_SINT: + + this->metalFormat = MTLPixelFormatRG16Sint; + this->actualFormatId = angle::FormatID::R16G16_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16_SNORM: + + this->metalFormat = MTLPixelFormatRG16Snorm; + this->actualFormatId = angle::FormatID::R16G16_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16_UINT: + + this->metalFormat = MTLPixelFormatRG16Uint; + this->actualFormatId = angle::FormatID::R16G16_UINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16_UNORM: + + this->metalFormat = MTLPixelFormatRG16Unorm; + this->actualFormatId = angle::FormatID::R16G16_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R16_FLOAT: + this->metalFormat = MTLPixelFormatR16Float; this->actualFormatId = angle::FormatID::R16_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16_SINT: + + this->metalFormat = MTLPixelFormatR16Sint; + this->actualFormatId = angle::FormatID::R16_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16_SNORM: + + this->metalFormat = MTLPixelFormatR16Snorm; + this->actualFormatId = angle::FormatID::R16_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R16_UINT: + + this->metalFormat = MTLPixelFormatR16Uint; + this->actualFormatId = angle::FormatID::R16_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R16_UNORM: + this->metalFormat = MTLPixelFormatR16Unorm; this->actualFormatId = angle::FormatID::R16_UNORM; - break; + this->initFunction = nullptr; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R32G32B32A32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA32Float; - this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R32G32B32A32_FLOAT: + this->metalFormat = MTLPixelFormatRGBA32Float; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R32G32B32A32_SINT: + + this->metalFormat = MTLPixelFormatRGBA32Sint; + this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R32G32B32A32_UINT: + + this->metalFormat = MTLPixelFormatRGBA32Uint; + this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R32G32_FLOAT: + this->metalFormat = MTLPixelFormatRG32Float; this->actualFormatId = angle::FormatID::R32G32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatR32Float; - this->actualFormatId = angle::FormatID::R32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + case angle::FormatID::R32G32_SINT: + + this->metalFormat = MTLPixelFormatRG32Sint; + this->actualFormatId = angle::FormatID::R32G32_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R32G32_UINT: + + this->metalFormat = MTLPixelFormatRG32Uint; + this->actualFormatId = angle::FormatID::R32G32_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R32_FLOAT: + this->metalFormat = MTLPixelFormatR32Float; this->actualFormatId = angle::FormatID::R32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R32_SINT: + + this->metalFormat = MTLPixelFormatR32Sint; + this->actualFormatId = angle::FormatID::R32_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R32_UINT: + + this->metalFormat = MTLPixelFormatR32Uint; + this->actualFormatId = angle::FormatID::R32_UINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8A8_SINT: + + this->metalFormat = MTLPixelFormatRGBA8Sint; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8A8_SNORM: + + this->metalFormat = MTLPixelFormatRGBA8Snorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8A8_UINT: + + this->metalFormat = MTLPixelFormatRGBA8Uint; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R8G8B8A8_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R8G8B8A8_UNORM_SRGB: + this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8_SINT: + + this->metalFormat = MTLPixelFormatRG8Sint; + this->actualFormatId = angle::FormatID::R8G8_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8_SNORM: + + this->metalFormat = MTLPixelFormatRG8Snorm; + this->actualFormatId = angle::FormatID::R8G8_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8_UINT: + + this->metalFormat = MTLPixelFormatRG8Uint; + this->actualFormatId = angle::FormatID::R8G8_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R8G8_UNORM: + this->metalFormat = MTLPixelFormatRG8Unorm; this->actualFormatId = angle::FormatID::R8G8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R8_UNORM: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatR8Unorm; - this->actualFormatId = angle::FormatID::R8_UNORM; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + case angle::FormatID::R8_SINT: + + this->metalFormat = MTLPixelFormatR8Sint; + this->actualFormatId = angle::FormatID::R8_SINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8_SNORM: + + this->metalFormat = MTLPixelFormatR8Snorm; + this->actualFormatId = angle::FormatID::R8_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R8_UINT: + + this->metalFormat = MTLPixelFormatR8Uint; + this->actualFormatId = angle::FormatID::R8_UINT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R8_UNORM: + this->metalFormat = MTLPixelFormatR8Unorm; this->actualFormatId = angle::FormatID::R8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::R9G9B9E5_SHAREDEXP: + + this->metalFormat = MTLPixelFormatRGB9E5Float; + this->actualFormatId = angle::FormatID::R9G9B9E5_SHAREDEXP; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::S8_UINT: + this->metalFormat = MTLPixelFormatStencil8; this->actualFormatId = angle::FormatID::S8_UINT; - break; + this->initFunction = nullptr; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::A16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA16Float; - this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::A16_FLOAT: + this->metalFormat = MTLPixelFormatRGBA16Float; this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - break; + this->initFunction = nullptr; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::A32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA32Float; - this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::A32_FLOAT: + this->metalFormat = MTLPixelFormatRGBA32Float; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::D24_UNORM_X8_UINT: + this->metalFormat = MTLPixelFormatDepth32Float; this->actualFormatId = angle::FormatID::D32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D32_UNORM: + this->metalFormat = MTLPixelFormatDepth32Float; this->actualFormatId = angle::FormatID::D32_FLOAT; - break; + this->initFunction = nullptr; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::L16A16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA16Float; - this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::L16A16_FLOAT: + this->metalFormat = MTLPixelFormatRGBA16Float; this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - break; + this->initFunction = nullptr; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::L16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA16Float; - this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::L16_FLOAT: + this->metalFormat = MTLPixelFormatRGBA16Float; this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - break; + this->initFunction = + Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::L32A32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA32Float; - this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::L32A32_FLOAT: + this->metalFormat = MTLPixelFormatRGBA32Float; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - break; + this->initFunction = nullptr; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::L32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA32Float; - this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::L32_FLOAT: + this->metalFormat = MTLPixelFormatRGBA32Float; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->initFunction = Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, + 0x00000000, gl::Float32One>; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::L8A8_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::L8_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; - break; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R16G16B16_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA16Float; - this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R16G16B16_FLOAT: + this->metalFormat = MTLPixelFormatRGBA16Float; this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; + this->initFunction = + Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST -#if TARGET_OS_OSX || TARGET_OS_MACCATALYST - case angle::FormatID::R32G32B32_FLOAT: - if (metalDevice.depth24Stencil8PixelFormatSupported) - { - this->metalFormat = MTLPixelFormatRGBA32Float; - this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; - } - else - { - this->metalFormat = MTLPixelFormatInvalid; - this->actualFormatId = angle::FormatID::NONE; - } + case angle::FormatID::R16G16B16_SINT: + + this->metalFormat = MTLPixelFormatRGBA16Sint; + this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; + this->initFunction = Initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001>; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16_SNORM: + + this->metalFormat = MTLPixelFormatRGBA16Snorm; + this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; + this->initFunction = Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x7FFF>; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16_UINT: + + this->metalFormat = MTLPixelFormatRGBA16Uint; + this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; + this->initFunction = Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001>; + + this->swizzled = false; + break; + + case angle::FormatID::R16G16B16_UNORM: + + this->metalFormat = MTLPixelFormatRGBA16Unorm; + this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x0000, 0x0000, 0x0000, 0xFFFF>; + + this->swizzled = false; break; -#else // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R32G32B32_FLOAT: + this->metalFormat = MTLPixelFormatRGBA32Float; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->initFunction = Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, + 0x00000000, gl::Float32One>; + + this->swizzled = false; + break; + + case angle::FormatID::R32G32B32_SINT: + + this->metalFormat = MTLPixelFormatRGBA32Sint; + this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; + this->initFunction = + Initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>; + + this->swizzled = false; + break; + + case angle::FormatID::R32G32B32_UINT: + + this->metalFormat = MTLPixelFormatRGBA32Uint; + this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; + this->initFunction = + Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8_SINT: + + this->metalFormat = MTLPixelFormatRGBA8Sint; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->initFunction = Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01>; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8_SNORM: + + this->metalFormat = MTLPixelFormatRGBA8Snorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; + this->initFunction = Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x7F>; + + this->swizzled = false; + break; + + case angle::FormatID::R8G8B8_UINT: + + this->metalFormat = MTLPixelFormatRGBA8Uint; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01>; + + this->swizzled = false; break; -#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::R8G8B8_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; break; case angle::FormatID::R8G8B8_UNORM_SRGB: + this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; break; #if TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::BC1_RGBA_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC1_RGBA; this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK; - break; + this->initFunction = nullptr; - case angle::FormatID::BC1_RGB_UNORM_BLOCK: - this->metalFormat = MTLPixelFormatBC1_RGBA; - this->actualFormatId = angle::FormatID::BC1_RGB_UNORM_BLOCK; - break; - - case angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK: - this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; - this->actualFormatId = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK; + this->swizzled = false; break; case angle::FormatID::BC2_RGBA_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC2_RGBA; this->actualFormatId = angle::FormatID::BC2_RGBA_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatBC2_RGBA_sRGB; this->actualFormatId = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC3_RGBA_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC3_RGBA; this->actualFormatId = angle::FormatID::BC3_RGBA_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatBC3_RGBA_sRGB; this->actualFormatId = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC4_RED_SNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC4_RSnorm; this->actualFormatId = angle::FormatID::BC4_RED_SNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC4_RED_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC4_RUnorm; this->actualFormatId = angle::FormatID::BC4_RED_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC5_RG_SNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC5_RGSnorm; this->actualFormatId = angle::FormatID::BC5_RG_SNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::BC5_RG_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatBC5_RGUnorm; this->actualFormatId = angle::FormatID::BC5_RG_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D16_UNORM: + this->metalFormat = MTLPixelFormatDepth16Unorm; this->actualFormatId = angle::FormatID::D16_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D24_UNORM_S8_UINT: + if (metalDevice.depth24Stencil8PixelFormatSupported) { this->metalFormat = MTLPixelFormatDepth24Unorm_Stencil8; this->actualFormatId = angle::FormatID::D24_UNORM_S8_UINT; + this->initFunction = nullptr; } else { this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; + this->initFunction = nullptr; + } + + this->swizzled = false; + break; + + case angle::FormatID::BC1_RGB_UNORM_BLOCK: +# if defined(__IPHONE_13_0) || defined(__MAC_10_15) + if (display->getFeatures().hasTextureSwizzle.enabled) + { + + this->metalFormat = MTLPixelFormatBC1_RGBA; + this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = true; + this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; + } + else +# endif // #if defined(__IPHONE_13_0) || defined(__MAC_10_15) + { + + this->metalFormat = MTLPixelFormatInvalid; + this->actualFormatId = angle::FormatID::NONE; + this->initFunction = nullptr; + + this->swizzled = false; + } + break; + + case angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK: +# if defined(__IPHONE_13_0) || defined(__MAC_10_15) + if (display->getFeatures().hasTextureSwizzle.enabled) + { + + this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; + this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = true; + this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; + } + else +# endif // #if defined(__IPHONE_13_0) || defined(__MAC_10_15) + { + + this->metalFormat = MTLPixelFormatInvalid; + this->actualFormatId = angle::FormatID::NONE; + this->initFunction = nullptr; + + this->swizzled = false; } break; + case angle::FormatID::EAC_R11G11_SNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRG16Snorm; + this->actualFormatId = angle::FormatID::R16G16_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::EAC_R11G11_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRG16Unorm; + this->actualFormatId = angle::FormatID::R16G16_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::EAC_R11_SNORM_BLOCK: + + this->metalFormat = MTLPixelFormatR16Snorm; + this->actualFormatId = angle::FormatID::R16_SNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::EAC_R11_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatR16Unorm; + this->actualFormatId = angle::FormatID::R16_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; + break; + + case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatRGBA8Unorm; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; + break; + case angle::FormatID::R4G4B4A4_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R5G5B5A1_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R5G6B5_UNORM: + this->metalFormat = MTLPixelFormatRGBA8Unorm; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; break; -#elif TARGET_OS_IOS // TARGET_OS_OSX || TARGET_OS_MACCATALYST +#elif TARGET_OS_IOS || TARGET_OS_TV // TARGET_OS_OSX || TARGET_OS_MACCATALYST case angle::FormatID::EAC_R11G11_SNORM_BLOCK: + this->metalFormat = MTLPixelFormatEAC_RG11Snorm; this->actualFormatId = angle::FormatID::EAC_R11G11_SNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::EAC_R11G11_UNORM_BLOCK: - this->metalFormat = MTLPixelFormatEAC_R11Unorm; + + this->metalFormat = MTLPixelFormatEAC_RG11Unorm; this->actualFormatId = angle::FormatID::EAC_R11G11_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::EAC_R11_SNORM_BLOCK: + this->metalFormat = MTLPixelFormatEAC_R11Snorm; this->actualFormatId = angle::FormatID::EAC_R11_SNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::EAC_R11_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatEAC_R11Unorm; this->actualFormatId = angle::FormatID::EAC_R11_UNORM_BLOCK; - break; + this->initFunction = nullptr; - case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: - this->metalFormat = MTLPixelFormatETC2_RGB8; - this->actualFormatId = angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK; + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatETC2_RGB8A1_sRGB; this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatETC2_RGB8A1; this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK; + this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; + + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatEAC_RGBA8_sRGB; this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatEAC_RGBA8; this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatETC2_RGB8_sRGB; this->actualFormatId = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatETC2_RGB8; this->actualFormatId = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP; this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP_sRGB; this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP; this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP_sRGB; this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP; this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB; this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP; this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK: + this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB; this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R4G4B4A4_UNORM: + this->metalFormat = MTLPixelFormatABGR4Unorm; this->actualFormatId = angle::FormatID::R4G4B4A4_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R5G5B5A1_UNORM: - this->metalFormat = MTLPixelFormatBGR5A1Unorm; + + this->metalFormat = MTLPixelFormatA1BGR5Unorm; this->actualFormatId = angle::FormatID::R5G5B5A1_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::R5G6B5_UNORM: + this->metalFormat = MTLPixelFormatB5G6R5Unorm; this->actualFormatId = angle::FormatID::R5G6B5_UNORM; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D16_UNORM: + this->metalFormat = MTLPixelFormatDepth32Float; this->actualFormatId = angle::FormatID::D32_FLOAT; + this->initFunction = nullptr; + + this->swizzled = false; break; case angle::FormatID::D24_UNORM_S8_UINT: + this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; + this->initFunction = nullptr; + + this->swizzled = false; + break; + + case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: + + this->metalFormat = MTLPixelFormatETC2_RGB8; + this->actualFormatId = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK; + this->initFunction = nullptr; + + this->swizzled = false; break; #endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST @@ -646,257 +1215,403 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) this->metalFormat = MTLVertexFormatInvalid; this->actualFormatId = angle::FormatID::NONE; this->vertexLoadFunction = nullptr; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R10G10B10A2_SNORM: + this->metalFormat = MTLVertexFormatInt1010102Normalized; + this->actualFormatId = angle::FormatID::R10G10B10A2_SNORM; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R10G10B10A2_UNORM: + this->metalFormat = MTLVertexFormatUInt1010102Normalized; + this->actualFormatId = angle::FormatID::R10G10B10A2_UNORM; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R16G16B16A16_FLOAT: + this->metalFormat = MTLVertexFormatHalf4; + this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_SINT: this->metalFormat = MTLVertexFormatShort4; this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_SNORM: this->metalFormat = MTLVertexFormatShort4Normalized; this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_SSCALED: this->metalFormat = MTLVertexFormatShort4; this->actualFormatId = angle::FormatID::R16G16B16A16_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_UINT: this->metalFormat = MTLVertexFormatUShort4; this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_UNORM: this->metalFormat = MTLVertexFormatUShort4Normalized; this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16B16A16_USCALED: this->metalFormat = MTLVertexFormatUShort4; this->actualFormatId = angle::FormatID::R16G16B16A16_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R16G16B16_FLOAT: + if (tightlyPacked) + { + this->metalFormat = MTLVertexFormatHalf4; + this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>; + this->defaultAlpha = gl::Float16One; + this->actualSameGLType = true; + } + else + { + this->metalFormat = MTLVertexFormatHalf3; + this->actualFormatId = angle::FormatID::R16G16B16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + } break; case angle::FormatID::R16G16B16_SINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 3, 3, false>; + this->metalFormat = MTLVertexFormatShort4; + this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShort3; this->actualFormatId = angle::FormatID::R16G16B16_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16G16B16_SNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 3, 3, true>; + this->metalFormat = MTLVertexFormatShort4Normalized; + this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLshort, 3, 4, std::numeric_limits<GLshort>::max()>; + this->defaultAlpha = std::numeric_limits<GLshort>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShort3Normalized; this->actualFormatId = angle::FormatID::R16G16B16_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16G16B16_SSCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 3, 3, false>; + this->metalFormat = MTLVertexFormatShort4; + this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShort3; this->actualFormatId = angle::FormatID::R16G16B16_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16G16B16_UINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 3, 3, false>; + this->metalFormat = MTLVertexFormatUShort4; + this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShort3; this->actualFormatId = angle::FormatID::R16G16B16_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16G16B16_UNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 3, 3, true>; + this->metalFormat = MTLVertexFormatUShort4Normalized; + this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLushort, 3, 4, std::numeric_limits<GLushort>::max()>; + this->defaultAlpha = std::numeric_limits<GLushort>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShort3Normalized; this->actualFormatId = angle::FormatID::R16G16B16_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16G16B16_USCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 3, 3, false>; + this->metalFormat = MTLVertexFormatUShort4; + this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShort3; this->actualFormatId = angle::FormatID::R16G16B16_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; + case angle::FormatID::R16G16_FLOAT: + this->metalFormat = MTLVertexFormatHalf2; + this->actualFormatId = angle::FormatID::R16G16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + case angle::FormatID::R16G16_SINT: this->metalFormat = MTLVertexFormatShort2; this->actualFormatId = angle::FormatID::R16G16_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16_SNORM: this->metalFormat = MTLVertexFormatShort2Normalized; this->actualFormatId = angle::FormatID::R16G16_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16_SSCALED: this->metalFormat = MTLVertexFormatShort2; this->actualFormatId = angle::FormatID::R16G16_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16_UINT: this->metalFormat = MTLVertexFormatUShort2; this->actualFormatId = angle::FormatID::R16G16_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16_UNORM: this->metalFormat = MTLVertexFormatUShort2Normalized; this->actualFormatId = angle::FormatID::R16G16_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R16G16_USCALED: this->metalFormat = MTLVertexFormatUShort2; this->actualFormatId = angle::FormatID::R16G16_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R16_FLOAT: + if (tightlyPacked) + { + this->metalFormat = MTLVertexFormatHalf2; + this->actualFormatId = angle::FormatID::R16G16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + } + else + { + this->metalFormat = MTLVertexFormatHalf; + this->actualFormatId = angle::FormatID::R16_FLOAT; + this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + } break; case angle::FormatID::R16_SINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 1, 1, false>; + this->metalFormat = MTLVertexFormatShort2; + this->actualFormatId = angle::FormatID::R16G16_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShort; this->actualFormatId = angle::FormatID::R16_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16_SNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 1, 1, true>; + this->metalFormat = MTLVertexFormatShort2Normalized; + this->actualFormatId = angle::FormatID::R16G16_SNORM; + this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShortNormalized; this->actualFormatId = angle::FormatID::R16_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16_SSCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLshort, 1, 1, false>; + this->metalFormat = MTLVertexFormatShort2; + this->actualFormatId = angle::FormatID::R16G16_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatShort; this->actualFormatId = angle::FormatID::R16_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16_UINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 1, 1, false>; + this->metalFormat = MTLVertexFormatUShort2; + this->actualFormatId = angle::FormatID::R16G16_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShort; this->actualFormatId = angle::FormatID::R16_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16_UNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 1, 1, true>; + this->metalFormat = MTLVertexFormatUShort2Normalized; + this->actualFormatId = angle::FormatID::R16G16_UNORM; + this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShortNormalized; this->actualFormatId = angle::FormatID::R16_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R16_USCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLushort, 1, 1, false>; + this->metalFormat = MTLVertexFormatUShort2; + this->actualFormatId = angle::FormatID::R16G16_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUShort; this->actualFormatId = angle::FormatID::R16_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; @@ -904,362 +1619,957 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) this->metalFormat = MTLVertexFormatFloat4; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32B32A32_SINT: + this->metalFormat = MTLVertexFormatInt4; + this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLint, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32B32A32_UINT: + this->metalFormat = MTLVertexFormatUInt4; + this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R32G32B32_FLOAT: this->metalFormat = MTLVertexFormatFloat3; this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32B32_SINT: + this->metalFormat = MTLVertexFormatInt3; + this->actualFormatId = angle::FormatID::R32G32B32_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLint, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32B32_UINT: + this->metalFormat = MTLVertexFormatUInt3; + this->actualFormatId = angle::FormatID::R32G32B32_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R32G32_FLOAT: this->metalFormat = MTLVertexFormatFloat2; this->actualFormatId = angle::FormatID::R32G32_FLOAT; this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32_SINT: + this->metalFormat = MTLVertexFormatInt2; + this->actualFormatId = angle::FormatID::R32G32_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLint, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32G32_UINT: + this->metalFormat = MTLVertexFormatUInt2; + this->actualFormatId = angle::FormatID::R32G32_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R32_FLOAT: this->metalFormat = MTLVertexFormatFloat; this->actualFormatId = angle::FormatID::R32_FLOAT; this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32_SINT: + this->metalFormat = MTLVertexFormatInt; + this->actualFormatId = angle::FormatID::R32_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLint, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; + break; + + case angle::FormatID::R32_UINT: + this->metalFormat = MTLVertexFormatUInt; + this->actualFormatId = angle::FormatID::R32_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_SINT: this->metalFormat = MTLVertexFormatChar4; this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_SNORM: this->metalFormat = MTLVertexFormatChar4Normalized; this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_SSCALED: this->metalFormat = MTLVertexFormatChar4; this->actualFormatId = angle::FormatID::R8G8B8A8_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_UINT: this->metalFormat = MTLVertexFormatUChar4; this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_UNORM: this->metalFormat = MTLVertexFormatUChar4Normalized; this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8A8_USCALED: this->metalFormat = MTLVertexFormatUChar4; this->actualFormatId = angle::FormatID::R8G8B8A8_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; break; case angle::FormatID::R8G8B8_SINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 3, 3, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar3; this->actualFormatId = angle::FormatID::R8G8B8_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8B8_SNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 3, 3, true>; + this->metalFormat = MTLVertexFormatChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLbyte, 3, 4, std::numeric_limits<GLbyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLbyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar3Normalized; this->actualFormatId = angle::FormatID::R8G8B8_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8B8_SSCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 3, 3, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar3; this->actualFormatId = angle::FormatID::R8G8B8_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8B8_UINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 3, 3, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar3; this->actualFormatId = angle::FormatID::R8G8B8_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8B8_UNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 3, 3, true>; + this->metalFormat = MTLVertexFormatUChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLubyte, 3, 4, std::numeric_limits<GLubyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLubyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar3Normalized; this->actualFormatId = angle::FormatID::R8G8B8_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8B8_USCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat3; - this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 3, 3, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar3; this->actualFormatId = angle::FormatID::R8G8B8_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_SINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 2, 2, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar2; this->actualFormatId = angle::FormatID::R8G8_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_SNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 2, 2, true>; + this->metalFormat = MTLVertexFormatChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLbyte, 2, 4, std::numeric_limits<GLbyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLbyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar2Normalized; this->actualFormatId = angle::FormatID::R8G8_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_SSCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 2, 2, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar2; this->actualFormatId = angle::FormatID::R8G8_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_UINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 2, 2, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar2; this->actualFormatId = angle::FormatID::R8G8_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_UNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 2, 2, true>; + this->metalFormat = MTLVertexFormatUChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLubyte, 2, 4, std::numeric_limits<GLubyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLubyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar2Normalized; this->actualFormatId = angle::FormatID::R8G8_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8G8_USCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat2; - this->actualFormatId = angle::FormatID::R32G32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 2, 2, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar2; this->actualFormatId = angle::FormatID::R8G8_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_SINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 1, 1, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar; this->actualFormatId = angle::FormatID::R8_SINT; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_SNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 1, 1, true>; + this->metalFormat = MTLVertexFormatChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLbyte, 1, 4, std::numeric_limits<GLbyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLbyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatCharNormalized; this->actualFormatId = angle::FormatID::R8_SNORM; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_SSCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLbyte, 1, 1, false>; + this->metalFormat = MTLVertexFormatChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; + this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatChar; this->actualFormatId = angle::FormatID::R8_SSCALED; this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_UINT: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 1, 1, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar; this->actualFormatId = angle::FormatID::R8_UINT; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_UNORM: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 1, 1, true>; + this->metalFormat = MTLVertexFormatUChar4Normalized; + this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; + this->vertexLoadFunction = + CopyNativeVertexData<GLubyte, 1, 4, std::numeric_limits<GLubyte>::max()>; + this->defaultAlpha = std::numeric_limits<GLubyte>::max(); + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUCharNormalized; this->actualFormatId = angle::FormatID::R8_UNORM; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; case angle::FormatID::R8_USCALED: if (tightlyPacked) { - this->metalFormat = MTLVertexFormatFloat; - this->actualFormatId = angle::FormatID::R32_FLOAT; - this->vertexLoadFunction = CopyTo32FVertexData<GLubyte, 1, 1, false>; + this->metalFormat = MTLVertexFormatUChar4; + this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; + this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 4, 1>; + this->defaultAlpha = 1; + this->actualSameGLType = true; } else { this->metalFormat = MTLVertexFormatUChar; this->actualFormatId = angle::FormatID::R8_USCALED; this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; + this->defaultAlpha = 0; + this->actualSameGLType = true; } break; + case angle::FormatID::R10G10B10A2_SINT: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyXYZ10W2ToXYZW32FVertexData<true, false, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R10G10B10A2_SSCALED: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyXYZ10W2ToXYZW32FVertexData<true, false, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R10G10B10A2_UINT: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyXYZ10W2ToXYZW32FVertexData<false, false, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R10G10B10A2_USCALED: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyXYZ10W2ToXYZW32FVertexData<false, false, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + case angle::FormatID::R32G32B32A32_FIXED: this->metalFormat = MTLVertexFormatFloat4; this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; this->vertexLoadFunction = Copy32FixedTo32FVertexData<4, 4>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32A32_SNORM: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 4, 4, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32A32_SSCALED: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 4, 4, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32A32_UNORM: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 4, 4, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32A32_USCALED: + this->metalFormat = MTLVertexFormatFloat4; + this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 4, 4, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; break; case angle::FormatID::R32G32B32_FIXED: this->metalFormat = MTLVertexFormatFloat3; this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; this->vertexLoadFunction = Copy32FixedTo32FVertexData<3, 3>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32_SNORM: + this->metalFormat = MTLVertexFormatFloat3; + this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 3, 3, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32_SSCALED: + this->metalFormat = MTLVertexFormatFloat3; + this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 3, 3, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32_UNORM: + this->metalFormat = MTLVertexFormatFloat3; + this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 3, 3, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32B32_USCALED: + this->metalFormat = MTLVertexFormatFloat3; + this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 3, 3, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; break; case angle::FormatID::R32G32_FIXED: this->metalFormat = MTLVertexFormatFloat2; this->actualFormatId = angle::FormatID::R32G32_FLOAT; this->vertexLoadFunction = Copy32FixedTo32FVertexData<2, 2>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32_SNORM: + this->metalFormat = MTLVertexFormatFloat2; + this->actualFormatId = angle::FormatID::R32G32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 2, 2, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32_SSCALED: + this->metalFormat = MTLVertexFormatFloat2; + this->actualFormatId = angle::FormatID::R32G32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 2, 2, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32_UNORM: + this->metalFormat = MTLVertexFormatFloat2; + this->actualFormatId = angle::FormatID::R32G32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 2, 2, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32G32_USCALED: + this->metalFormat = MTLVertexFormatFloat2; + this->actualFormatId = angle::FormatID::R32G32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 2, 2, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; break; case angle::FormatID::R32_FIXED: this->metalFormat = MTLVertexFormatFloat; this->actualFormatId = angle::FormatID::R32_FLOAT; this->vertexLoadFunction = Copy32FixedTo32FVertexData<1, 1>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32_SNORM: + this->metalFormat = MTLVertexFormatFloat; + this->actualFormatId = angle::FormatID::R32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 1, 1, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32_SSCALED: + this->metalFormat = MTLVertexFormatFloat; + this->actualFormatId = angle::FormatID::R32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLint, 1, 1, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32_UNORM: + this->metalFormat = MTLVertexFormatFloat; + this->actualFormatId = angle::FormatID::R32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 1, 1, true>; + this->defaultAlpha = 0; + this->actualSameGLType = false; + break; + + case angle::FormatID::R32_USCALED: + this->metalFormat = MTLVertexFormatFloat; + this->actualFormatId = angle::FormatID::R32_FLOAT; + this->vertexLoadFunction = CopyTo32FVertexData<GLuint, 1, 1, false>; + this->defaultAlpha = 0; + this->actualSameGLType = false; break; default: this->metalFormat = MTLVertexFormatInvalid; this->actualFormatId = angle::FormatID::NONE; this->vertexLoadFunction = nullptr; + this->defaultAlpha = 0; + this->actualSameGLType = false; } } +void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display) +{ + const angle::FeaturesMtl &featuresMtl = display->getFeatures(); + // Skip auto resolve if either hasDepth/StencilAutoResolve or allowMultisampleStoreAndResolve + // feature are disabled. + bool supportDepthAutoResolve = featuresMtl.hasDepthAutoResolve.enabled && + featuresMtl.allowMultisampleStoreAndResolve.enabled; + bool supportStencilAutoResolve = featuresMtl.hasStencilAutoResolve.enabled && + featuresMtl.allowMultisampleStoreAndResolve.enabled; + bool supportDepthStencilAutoResolve = supportDepthAutoResolve && supportStencilAutoResolve; + + // Source: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf + setFormatCaps(MTLPixelFormatA8Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ false, /** multisample*/ false, /** resolve*/ false, + /** colorRenderable*/ false, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatBGR10A2Unorm, /** filterable*/ true, + /** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true, + /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatBGRA8Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatBGRA8Unorm_sRGB, /** filterable*/ true, + /** writable*/ display->supportsIOSGPUFamily(2), /** blendable*/ true, + /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatDepth32Float, /** filterable*/ display->supportsMacGPUFamily(1), + /** writable*/ false, /** blendable*/ false, /** multisample*/ true, + /** resolve*/ supportDepthAutoResolve, /** colorRenderable*/ false, + /** depthRenderable*/ true); + + setFormatCaps(MTLPixelFormatDepth32Float_Stencil8, + /** filterable*/ display->supportsMacGPUFamily(1), /** writable*/ false, + /** blendable*/ false, /** multisample*/ true, + /** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false, + /** depthRenderable*/ true); + + setFormatCaps(MTLPixelFormatR16Float, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR16Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR16Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR16Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR16Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR32Float, /** filterable*/ display->supportsMacGPUFamily(1), + /** writable*/ true, /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR32Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR32Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR8Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR8Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR8Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatR8Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG11B10Float, /** filterable*/ true, + /** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true, + /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG16Float, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG16Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG16Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG16Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG16Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG32Float, /** filterable*/ display->supportsMacGPUFamily(1), + /** writable*/ true, /** blendable*/ true, + /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG32Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG32Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG8Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG8Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG8Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRG8Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGB10A2Uint, /** filterable*/ false, + /** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ false, + /** multisample*/ true, /** resolve*/ false, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGB10A2Unorm, /** filterable*/ true, + /** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true, + /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGB9E5Float, /** filterable*/ true, + /** writable*/ display->supportsIOSGPUFamily(3), + /** blendable*/ display->supportsIOSGPUFamily(1), + /** multisample*/ display->supportsIOSGPUFamily(1), + /** resolve*/ display->supportsIOSGPUFamily(1), + /** colorRenderable*/ display->supportsIOSGPUFamily(1), + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA16Float, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA16Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA16Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA16Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA16Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA32Float, /** filterable*/ display->supportsMacGPUFamily(1), + /** writable*/ true, /** blendable*/ display->supportsMacGPUFamily(1), + /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA32Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA32Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1), + /** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA8Sint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA8Snorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, + /** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA8Uint, /** filterable*/ false, /** writable*/ true, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA8Unorm, /** filterable*/ true, /** writable*/ true, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatRGBA8Unorm_sRGB, /** filterable*/ true, + /** writable*/ display->supportsIOSGPUFamily(2), /** blendable*/ true, + /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, + /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatStencil8, /** filterable*/ false, /** writable*/ false, + /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, + /** colorRenderable*/ false, /** depthRenderable*/ true); + +#if TARGET_OS_OSX || TARGET_OS_MACCATALYST + setFormatCaps(MTLPixelFormatDepth16Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ false, /** multisample*/ true, + /** resolve*/ supportDepthAutoResolve, /** colorRenderable*/ false, + /** depthRenderable*/ true); + + setFormatCaps(MTLPixelFormatDepth24Unorm_Stencil8, + /** filterable*/ display->supportsMacGPUFamily(1), /** writable*/ false, + /** blendable*/ false, /** multisample*/ true, + /** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false, + /** depthRenderable*/ display->supportsMacGPUFamily(1)); + +#elif TARGET_OS_IOS || TARGET_OS_TV // TARGET_OS_OSX || TARGET_OS_MACCATALYST + setFormatCaps(MTLPixelFormatA1BGR5Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatABGR4Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatB5G6R5Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + + setFormatCaps(MTLPixelFormatBGR5A1Unorm, /** filterable*/ true, /** writable*/ false, + /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, + /** colorRenderable*/ true, /** depthRenderable*/ false); + +#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST +} + } // namespace mtl } // namespace rx |