Support 16-bit packed texture formats with the Metal renderer

This commit is contained in:
Cameron Cawley
2026-01-16 23:15:50 +00:00
committed by Sam Lantinga
parent b1aaa41921
commit 4af4c97e44

View File

@@ -682,7 +682,7 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
{
@autoreleasepool {
SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
MTLPixelFormat pixfmt;
MTLPixelFormat pixfmt = MTLPixelFormatInvalid;
MTLTextureDescriptor *mtltexdesc;
id<MTLTexture> mtltexture = nil, mtltextureUv = nil;
SDL3METAL_TextureData *texturedata;
@@ -715,6 +715,26 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
case SDL_PIXELFORMAT_ABGR2101010:
pixfmt = MTLPixelFormatRGB10A2Unorm;
break;
case SDL_PIXELFORMAT_RGB565:
if (@available(macOS 11.0, *)) {
pixfmt = MTLPixelFormatB5G6R5Unorm;
}
break;
case SDL_PIXELFORMAT_RGBA5551:
if (@available(macOS 11.0, *)) {
pixfmt = MTLPixelFormatA1BGR5Unorm;
}
break;
case SDL_PIXELFORMAT_ARGB1555:
if (@available(macOS 11.0, *)) {
pixfmt = MTLPixelFormatBGR5A1Unorm;
}
break;
case SDL_PIXELFORMAT_RGBA4444:
if (@available(macOS 11.0, *)) {
pixfmt = MTLPixelFormatABGR4Unorm;
}
break;
case SDL_PIXELFORMAT_INDEX8:
case SDL_PIXELFORMAT_IYUV:
case SDL_PIXELFORMAT_YV12:
@@ -732,6 +752,10 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
pixfmt = MTLPixelFormatRGBA32Float;
break;
default:
break;
}
if (pixfmt == MTLPixelFormatInvalid) {
return SDL_SetError("Texture format %s not supported by Metal", SDL_GetPixelFormatName(texture->format));
}
@@ -1949,6 +1973,18 @@ static SDL_Surface *METAL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
case MTLPixelFormatRGBA16Float:
format = SDL_PIXELFORMAT_RGBA64_FLOAT;
break;
case MTLPixelFormatB5G6R5Unorm:
format = SDL_PIXELFORMAT_RGB565;
break;
case MTLPixelFormatA1BGR5Unorm:
format = SDL_PIXELFORMAT_RGBA5551;
break;
case MTLPixelFormatBGR5A1Unorm:
format = SDL_PIXELFORMAT_ARGB1555;
break;
case MTLPixelFormatABGR4Unorm:
format = SDL_PIXELFORMAT_RGBA4444;
break;
default:
SDL_SetError("Unknown framebuffer pixel format");
return NULL;
@@ -2365,6 +2401,14 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA128_FLOAT);
if (@available(macOS 11.0, iOS 13.0, tvOS 13.0, *)) {
if ([mtldevice supportsFamily:MTLGPUFamilyApple1]) {
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGB565);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA5551);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB1555);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA4444);
}
}
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);