From fb7245fb93fa8fd332771e020cd11fdde6556cc6 Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev Date: Tue, 3 Sep 2024 03:14:48 +0300 Subject: [PATCH] GPU: Add support for more texture formats (#10641) --- include/SDL3/SDL_gpu.h | 62 ++++++++++++++++------ src/gpu/SDL_gpu.c | 25 ++++++--- src/gpu/SDL_sysgpu.h | 36 ++++++++++--- src/gpu/d3d11/SDL_gpu_d3d11.c | 31 ++++++++--- src/gpu/d3d12/SDL_gpu_d3d12.c | 31 ++++++++--- src/gpu/metal/SDL_gpu_metal.m | 55 +++++++++++++++----- src/gpu/vulkan/SDL_gpu_vulkan.c | 92 ++++++++++++++++++++++++--------- 7 files changed, 256 insertions(+), 76 deletions(-) diff --git a/include/SDL3/SDL_gpu.h b/include/SDL3/SDL_gpu.h index 8937fc2cd..7f6520072 100644 --- a/include/SDL3/SDL_gpu.h +++ b/include/SDL3/SDL_gpu.h @@ -94,6 +94,8 @@ typedef enum SDL_GPUIndexElementSize * - R8G8B8A8_UNORM * - B8G8R8A8_UNORM * - R8_UNORM + * - R8_SNORM + * - R8G8_UNORM * - R8G8_SNORM * - R8G8B8A8_SNORM * - R16_FLOAT @@ -102,6 +104,7 @@ typedef enum SDL_GPUIndexElementSize * - R32_FLOAT * - R32G32_FLOAT * - R32G32B32A32_FLOAT + * - R11G11B10_UFLOAT * - R8G8B8A8_UNORM_SRGB * - B8G8R8A8_UNORM_SRGB * - D16_UNORM @@ -122,6 +125,12 @@ typedef enum SDL_GPUIndexElementSize * - R16_UINT * - R16G16_UINT * - R16G16B16A16_UINT + * - R8_INT + * - R8G8_INT + * - R8G8B8A8_INT + * - R16_INT + * - R16G16_INT + * - R16G16B16A16_INT * - R8G8B8A8_UNORM_SRGB * - B8G8R8A8_UNORM_SRGB * @@ -132,12 +141,10 @@ typedef enum SDL_GPUIndexElementSize * - R32_FLOAT * - R32G32_FLOAT * - R32G32B32A32_FLOAT - * - R8_UINT - * - R8G8_UINT * - R8G8B8A8_UINT - * - R16_UINT - * - R16G16_UINT * - R16G16B16A16_UINT + * - R8G8B8A8_INT + * - R16G16B16A16_IINT * * For DEPTH_STENCIL_TARGET usage, the following formats are universally supported: * - D16_UNORM @@ -152,24 +159,36 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_INVALID = -1, /* Unsigned Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8G8_UNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, - SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, + SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM, SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM, SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM, - SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, - SDL_GPU_TEXTUREFORMAT_R8_UNORM, - SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, /* Compressed Unsigned Normalized Float Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC1_UNORM, - SDL_GPU_TEXTUREFORMAT_BC2_UNORM, - SDL_GPU_TEXTUREFORMAT_BC3_UNORM, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM, + SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM, + /* Compressed Signed Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT, + /* Compressed Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT, /* Signed Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM, + SDL_GPU_TEXTUREFORMAT_R16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM, /* Signed Float Color Formats */ SDL_GPU_TEXTUREFORMAT_R16_FLOAT, SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT, @@ -177,6 +196,8 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT, + /* Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT, /* Unsigned Integer Color Formats */ SDL_GPU_TEXTUREFORMAT_R8_UINT, SDL_GPU_TEXTUREFORMAT_R8G8_UINT, @@ -184,12 +205,21 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT, + /* Signed Integer Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT, + SDL_GPU_TEXTUREFORMAT_R16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT, /* SRGB Unsigned Normalized Color Formats */ SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB, SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, /* Compressed SRGB Unsigned Normalized Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB, /* Depth Formats */ SDL_GPU_TEXTUREFORMAT_D16_UNORM, SDL_GPU_TEXTUREFORMAT_D24_UNORM, diff --git a/src/gpu/SDL_gpu.c b/src/gpu/SDL_gpu.c index 811216ff0..6f12b8883 100644 --- a/src/gpu/SDL_gpu.c +++ b/src/gpu/SDL_gpu.c @@ -502,15 +502,22 @@ Uint32 SDL_GPUTextureFormatTexelBlockSize( SDL_GPUTextureFormat textureFormat) { switch (textureFormat) { - case SDL_GPU_TEXTUREFORMAT_BC1_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: return 8; - case SDL_GPU_TEXTUREFORMAT_BC2_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: + case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: return 16; case SDL_GPU_TEXTUREFORMAT_R8_UNORM: + case SDL_GPU_TEXTUREFORMAT_R8_SNORM: case SDL_GPU_TEXTUREFORMAT_A8_UNORM: case SDL_GPU_TEXTUREFORMAT_R8_UINT: return 1; @@ -519,7 +526,10 @@ Uint32 SDL_GPUTextureFormatTexelBlockSize( case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: case SDL_GPU_TEXTUREFORMAT_R16_FLOAT: case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM: + case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM: case SDL_GPU_TEXTUREFORMAT_R8G8_UINT: + case SDL_GPU_TEXTUREFORMAT_R16_UNORM: + case SDL_GPU_TEXTUREFORMAT_R16_SNORM: case SDL_GPU_TEXTUREFORMAT_R16_UINT: return 2; case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: @@ -528,14 +538,17 @@ Uint32 SDL_GPUTextureFormatTexelBlockSize( case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: case SDL_GPU_TEXTUREFORMAT_R32_FLOAT: case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT: + case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT: case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM: + case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM: return 4; case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: + case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: return 8; diff --git a/src/gpu/SDL_sysgpu.h b/src/gpu/SDL_sysgpu.h index 79e1ea09a..720acb43c 100644 --- a/src/gpu/SDL_sysgpu.h +++ b/src/gpu/SDL_sysgpu.h @@ -77,12 +77,17 @@ static inline Sint32 Texture_GetBlockSize( SDL_GPUTextureFormat format) { switch (format) { - case SDL_GPU_TEXTUREFORMAT_BC1_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC2_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: return 4; case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM: @@ -90,24 +95,37 @@ static inline Sint32 Texture_GetBlockSize( case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM: case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: + case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM: case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: case SDL_GPU_TEXTUREFORMAT_R8_UNORM: + case SDL_GPU_TEXTUREFORMAT_R16_UNORM: case SDL_GPU_TEXTUREFORMAT_A8_UNORM: + case SDL_GPU_TEXTUREFORMAT_R8_SNORM: case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM: case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: + case SDL_GPU_TEXTUREFORMAT_R16_SNORM: + case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM: + case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: case SDL_GPU_TEXTUREFORMAT_R16_FLOAT: case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: case SDL_GPU_TEXTUREFORMAT_R32_FLOAT: case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT: case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT: + case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT: case SDL_GPU_TEXTUREFORMAT_R8_UINT: case SDL_GPU_TEXTUREFORMAT_R8G8_UINT: case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: case SDL_GPU_TEXTUREFORMAT_R16_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: + case SDL_GPU_TEXTUREFORMAT_R8_INT: + case SDL_GPU_TEXTUREFORMAT_R8G8_INT: + case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: + case SDL_GPU_TEXTUREFORMAT_R16_INT: + case SDL_GPU_TEXTUREFORMAT_R16G16_INT: + case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB: case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: return 1; @@ -156,6 +174,12 @@ static inline bool IsIntegerFormat( case SDL_GPU_TEXTUREFORMAT_R16_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: + case SDL_GPU_TEXTUREFORMAT_R8_INT: + case SDL_GPU_TEXTUREFORMAT_R8G8_INT: + case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: + case SDL_GPU_TEXTUREFORMAT_R16_INT: + case SDL_GPU_TEXTUREFORMAT_R16G16_INT: + case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: return true; default: diff --git a/src/gpu/d3d11/SDL_gpu_d3d11.c b/src/gpu/d3d11/SDL_gpu_d3d11.c index c23100598..f59630eab 100644 --- a/src/gpu/d3d11/SDL_gpu_d3d11.c +++ b/src/gpu/d3d11/SDL_gpu_d3d11.c @@ -169,36 +169,55 @@ static DXGI_COLOR_SPACE_TYPE SwapchainCompositionToColorSpace[] = { }; static DXGI_FORMAT SDLToD3D11_TextureFormat[] = { + DXGI_FORMAT_A8_UNORM, // A8_UNORM + DXGI_FORMAT_R8_UNORM, // R8_UNORM + DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM, // R8G8B8A8_UNORM - DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM + DXGI_FORMAT_R16_UNORM, // R16_UNORM + DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM + DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM + DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM DXGI_FORMAT_B5G6R5_UNORM, // B5G6R5_UNORM DXGI_FORMAT_B5G5R5A1_UNORM, // B5G5R5A1_UNORM DXGI_FORMAT_B4G4R4A4_UNORM, // B4G4R4A4_UNORM - DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM - DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM - DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM - DXGI_FORMAT_R8_UNORM, // R8_UNORM - DXGI_FORMAT_A8_UNORM, // A8_UNORM + DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM DXGI_FORMAT_BC1_UNORM, // BC1_UNORM DXGI_FORMAT_BC2_UNORM, // BC2_UNORM DXGI_FORMAT_BC3_UNORM, // BC3_UNORM + DXGI_FORMAT_BC4_UNORM, // BC4_UNORM + DXGI_FORMAT_BC5_UNORM, // BC5_UNORM DXGI_FORMAT_BC7_UNORM, // BC7_UNORM + DXGI_FORMAT_BC6H_SF16, // BC6H_FLOAT + DXGI_FORMAT_BC6H_UF16, // BC6H_UFLOAT + DXGI_FORMAT_R8_SNORM, // R8_SNORM DXGI_FORMAT_R8G8_SNORM, // R8G8_SNORM DXGI_FORMAT_R8G8B8A8_SNORM, // R8G8B8A8_SNORM + DXGI_FORMAT_R16_SNORM, // R16_SNORM + DXGI_FORMAT_R16G16_SNORM, // R16G16_SNORM + DXGI_FORMAT_R16G16B16A16_SNORM, // R16G16B16A16_SNORM DXGI_FORMAT_R16_FLOAT, // R16_FLOAT DXGI_FORMAT_R16G16_FLOAT, // R16G16_FLOAT DXGI_FORMAT_R16G16B16A16_FLOAT, // R16G16B16A16_FLOAT DXGI_FORMAT_R32_FLOAT, // R32_FLOAT DXGI_FORMAT_R32G32_FLOAT, // R32G32_FLOAT DXGI_FORMAT_R32G32B32A32_FLOAT, // R32G32B32A32_FLOAT + DXGI_FORMAT_R11G11B10_FLOAT, // R11G11B10_UFLOAT DXGI_FORMAT_R8_UINT, // R8_UINT DXGI_FORMAT_R8G8_UINT, // R8G8_UINT DXGI_FORMAT_R8G8B8A8_UINT, // R8G8B8A8_UINT DXGI_FORMAT_R16_UINT, // R16_UINT DXGI_FORMAT_R16G16_UINT, // R16G16_UINT DXGI_FORMAT_R16G16B16A16_UINT, // R16G16B16A16_UINT + DXGI_FORMAT_R8_SINT, // R8_INT + DXGI_FORMAT_R8G8_SINT, // R8G8_INT + DXGI_FORMAT_R8G8B8A8_SINT, // R8G8B8A8_INT + DXGI_FORMAT_R16_SINT, // R16_INT + DXGI_FORMAT_R16G16_SINT, // R16G16_INT + DXGI_FORMAT_R16G16B16A16_SINT, // R16G16B16A16_INT DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, // R8G8B8A8_UNORM_SRGB DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, // B8G8R8A8_UNORM_SRGB + DXGI_FORMAT_BC1_UNORM_SRGB, // BC1_UNORM_SRGB + DXGI_FORMAT_BC2_UNORM_SRGB, // BC2_UNORM_SRGB DXGI_FORMAT_BC3_UNORM_SRGB, // BC3_UNORM_SRGB DXGI_FORMAT_BC7_UNORM_SRGB, // BC7_UNORM_SRGB DXGI_FORMAT_D16_UNORM, // D16_UNORM diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c index 2c19b365a..fbd270b69 100644 --- a/src/gpu/d3d12/SDL_gpu_d3d12.c +++ b/src/gpu/d3d12/SDL_gpu_d3d12.c @@ -225,36 +225,55 @@ static D3D12_BLEND_OP SDLToD3D12_BlendOp[] = { }; static DXGI_FORMAT SDLToD3D12_TextureFormat[] = { + DXGI_FORMAT_A8_UNORM, // A8_UNORM + DXGI_FORMAT_R8_UNORM, // R8_UNORM + DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM, // R8G8B8A8_UNORM - DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM + DXGI_FORMAT_R16_UNORM, // R16_UNORM + DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM + DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM + DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM DXGI_FORMAT_B5G6R5_UNORM, // B5G6R5_UNORM DXGI_FORMAT_B5G5R5A1_UNORM, // B5G5R5A1_UNORM DXGI_FORMAT_B4G4R4A4_UNORM, // B4G4R4A4_UNORM - DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM - DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM - DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM - DXGI_FORMAT_R8_UNORM, // R8_UNORM - DXGI_FORMAT_A8_UNORM, // A8_UNORM + DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM DXGI_FORMAT_BC1_UNORM, // BC1_UNORM DXGI_FORMAT_BC2_UNORM, // BC2_UNORM DXGI_FORMAT_BC3_UNORM, // BC3_UNORM + DXGI_FORMAT_BC4_UNORM, // BC4_UNORM + DXGI_FORMAT_BC5_UNORM, // BC5_UNORM DXGI_FORMAT_BC7_UNORM, // BC7_UNORM + DXGI_FORMAT_BC6H_SF16, // BC6H_FLOAT + DXGI_FORMAT_BC6H_UF16, // BC6H_UFLOAT + DXGI_FORMAT_R8_SNORM, // R8_SNORM DXGI_FORMAT_R8G8_SNORM, // R8G8_SNORM DXGI_FORMAT_R8G8B8A8_SNORM, // R8G8B8A8_SNORM + DXGI_FORMAT_R16_SNORM, // R16_SNORM + DXGI_FORMAT_R16G16_SNORM, // R16G16_SNORM + DXGI_FORMAT_R16G16B16A16_SNORM, // R16G16B16A16_SNORM DXGI_FORMAT_R16_FLOAT, // R16_FLOAT DXGI_FORMAT_R16G16_FLOAT, // R16G16_FLOAT DXGI_FORMAT_R16G16B16A16_FLOAT, // R16G16B16A16_FLOAT DXGI_FORMAT_R32_FLOAT, // R32_FLOAT DXGI_FORMAT_R32G32_FLOAT, // R32G32_FLOAT DXGI_FORMAT_R32G32B32A32_FLOAT, // R32G32B32A32_FLOAT + DXGI_FORMAT_R11G11B10_FLOAT, // R11G11B10_UFLOAT DXGI_FORMAT_R8_UINT, // R8_UINT DXGI_FORMAT_R8G8_UINT, // R8G8_UINT DXGI_FORMAT_R8G8B8A8_UINT, // R8G8B8A8_UINT DXGI_FORMAT_R16_UINT, // R16_UINT DXGI_FORMAT_R16G16_UINT, // R16G16_UINT DXGI_FORMAT_R16G16B16A16_UINT, // R16G16B16A16_UINT + DXGI_FORMAT_R8_SINT, // R8_INT + DXGI_FORMAT_R8G8_SINT, // R8G8_INT + DXGI_FORMAT_R8G8B8A8_SINT, // R8G8B8A8_INT + DXGI_FORMAT_R16_SINT, // R16_INT + DXGI_FORMAT_R16G16_SINT, // R16G16_INT + DXGI_FORMAT_R16G16B16A16_SINT, // R16G16B16A16_INT DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, // R8G8B8A8_UNORM_SRGB DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, // B8G8R8A8_UNORM_SRGB + DXGI_FORMAT_BC1_UNORM_SRGB, // BC1_UNORM_SRGB + DXGI_FORMAT_BC2_UNORM_SRGB, // BC2_UNORM_SRGB DXGI_FORMAT_BC3_UNORM_SRGB, // BC3_UNORM_SRGB DXGI_FORMAT_BC7_UNORM_SRGB, // BC7_UNORM_SRGB DXGI_FORMAT_D16_UNORM, // D16_UNORM diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m index ad55e7499..b0f20f2a3 100644 --- a/src/gpu/metal/SDL_gpu_metal.m +++ b/src/gpu/metal/SDL_gpu_metal.m @@ -68,47 +68,72 @@ static void METAL_INTERNAL_DestroyBlitResources(SDL_GPURenderer *driverData); // Conversions static MTLPixelFormat SDLToMetal_SurfaceFormat[] = { + MTLPixelFormatA8Unorm, // A8_UNORM + MTLPixelFormatR8Unorm, // R8_UNORM + MTLPixelFormatRG8Unorm, // R8G8_UNORM MTLPixelFormatRGBA8Unorm, // R8G8B8A8_UNORM - MTLPixelFormatBGRA8Unorm, // B8G8R8A8_UNORM + MTLPixelFormatR16Unorm, // R16_UNORM + MTLPixelFormatRG16Unorm, // R16G16_UNORM + MTLPixelFormatRGBA16Unorm, // R16G16B16A16_UNORM + MTLPixelFormatRGB10A2Unorm, // A2R10G10B10_UNORM MTLPixelFormatB5G6R5Unorm, // B5G6R5_UNORM MTLPixelFormatBGR5A1Unorm, // B5G5R5A1_UNORM MTLPixelFormatABGR4Unorm, // B4G4R4A4_UNORM - MTLPixelFormatRGB10A2Unorm, // A2R10G10B10_UNORM - MTLPixelFormatRG16Unorm, // R16G16_UNORM - MTLPixelFormatRGBA16Unorm, // R16G16B16A16_UNORM - MTLPixelFormatR8Unorm, // R8_UNORM - MTLPixelFormatA8Unorm, // A8_UNORM + MTLPixelFormatBGRA8Unorm, // B8G8R8A8_UNORM #ifdef SDL_PLATFORM_MACOS MTLPixelFormatBC1_RGBA, // BC1_UNORM MTLPixelFormatBC2_RGBA, // BC2_UNORM MTLPixelFormatBC3_RGBA, // BC3_UNORM + MTLPixelFormatBC4_RUnorm, // BC4_UNORM + MTLPixelFormatBC5_RGUnorm, // BC5_UNORM MTLPixelFormatBC7_RGBAUnorm, // BC7_UNORM + MTLPixelFormatBC6H_RGBFloat, // BC6H_FLOAT + MTLPixelFormatBC6H_RGBUfloat,// BC6H_UFLOAT #else MTLPixelFormatInvalid, // BC1_UNORM MTLPixelFormatInvalid, // BC2_UNORM MTLPixelFormatInvalid, // BC3_UNORM + MTLPixelFormatInvalid, // BC4_UNORM + MTLPixelFormatInvalid, // BC5_UNORM MTLPixelFormatInvalid, // BC7_UNORM + MTLPixelFormatInvalid, // BC6H_FLOAT + MTLPixelFormatInvalid, // BC6H_UFLOAT #endif + MTLPixelFormatR8Snorm, // R8_SNORM MTLPixelFormatRG8Snorm, // R8G8_SNORM MTLPixelFormatRGBA8Snorm, // R8G8B8A8_SNORM + MTLPixelFormatR16Snorm, // R16_SNORM + MTLPixelFormatRG16Snorm, // R16G16_SNORM + MTLPixelFormatRGBA16Snorm, // R16G16B16A16_SNORM MTLPixelFormatR16Float, // R16_FLOAT MTLPixelFormatRG16Float, // R16G16_FLOAT MTLPixelFormatRGBA16Float, // R16G16B16A16_FLOAT MTLPixelFormatR32Float, // R32_FLOAT MTLPixelFormatRG32Float, // R32G32_FLOAT MTLPixelFormatRGBA32Float, // R32G32B32A32_FLOAT + MTLPixelFormatRG11B10Float, // R11G11B10_UFLOAT MTLPixelFormatR8Uint, // R8_UINT MTLPixelFormatRG8Uint, // R8G8_UINT MTLPixelFormatRGBA8Uint, // R8G8B8A8_UINT MTLPixelFormatR16Uint, // R16_UINT MTLPixelFormatRG16Uint, // R16G16_UINT MTLPixelFormatRGBA16Uint, // R16G16B16A16_UINT + MTLPixelFormatR8Sint, // R8_UINT + MTLPixelFormatRG8Sint, // R8G8_UINT + MTLPixelFormatRGBA8Sint, // R8G8B8A8_UINT + MTLPixelFormatR16Sint, // R16_UINT + MTLPixelFormatRG16Sint, // R16G16_UINT + MTLPixelFormatRGBA16Sint, // R16G16B16A16_UINT MTLPixelFormatRGBA8Unorm_sRGB, // R8G8B8A8_UNORM_SRGB MTLPixelFormatBGRA8Unorm_sRGB, // B8G8R8A8_UNORM_SRGB #ifdef SDL_PLATFORM_MACOS + MTLPixelFormatBC1_RGBA_sRGB, // BC1_UNORM_SRGB + MTLPixelFormatBC2_RGBA_sRGB, // BC2_UNORM_SRGB MTLPixelFormatBC3_RGBA_sRGB, // BC3_UNORM_SRGB MTLPixelFormatBC7_RGBAUnorm_sRGB, // BC7_UNORM_SRGB #else + MTLPixelFormatInvalid, // BC1_UNORM_SRGB + MTLPixelFormatInvalid, // BC2_UNORM_SRGB MTLPixelFormatInvalid, // BC3_UNORM_SRGB MTLPixelFormatInvalid, // BC7_UNORM_SRGB #endif @@ -3697,12 +3722,18 @@ static bool METAL_SupportsTextureFormat( return [renderer->device supportsFamily:MTLGPUFamilyApple1]; // Requires BC compression support - case SDL_GPU_TEXTUREFORMAT_BC1_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC2_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM: - case SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB: - case SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: + case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: + case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: + case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: #ifdef SDL_PLATFORM_MACOS if (@available(macOS 11.0, *)) { return ( diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c index e841b5a9e..de236b79a 100644 --- a/src/gpu/vulkan/SDL_gpu_vulkan.c +++ b/src/gpu/vulkan/SDL_gpu_vulkan.c @@ -136,36 +136,55 @@ static VkPresentModeKHR SDLToVK_PresentMode[] = { }; static VkFormat SDLToVK_SurfaceFormat[] = { + VK_FORMAT_R8_UNORM, // A8_UNORM + VK_FORMAT_R8_UNORM, // R8_UNORM + VK_FORMAT_R8G8_UNORM, // R8G8_UNORM VK_FORMAT_R8G8B8A8_UNORM, // R8G8B8A8_UNORM - VK_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM + VK_FORMAT_R16_UNORM, // R16_UNORM + VK_FORMAT_R16G16_UNORM, // R16G16_UNORM + VK_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM + VK_FORMAT_A2B10G10R10_UNORM_PACK32, // R10G10B10A2_UNORM VK_FORMAT_R5G6B5_UNORM_PACK16, // B5G6R5_UNORM VK_FORMAT_A1R5G5B5_UNORM_PACK16, // B5G5R5A1_UNORM VK_FORMAT_B4G4R4A4_UNORM_PACK16, // B4G4R4A4_UNORM - VK_FORMAT_A2B10G10R10_UNORM_PACK32, // R10G10B10A2_UNORM - VK_FORMAT_R16G16_UNORM, // R16G16_UNORM - VK_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM - VK_FORMAT_R8_UNORM, // R8_UNORM - VK_FORMAT_R8_UNORM, // A8_UNORM + VK_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM VK_FORMAT_BC1_RGBA_UNORM_BLOCK, // BC1_UNORM VK_FORMAT_BC2_UNORM_BLOCK, // BC2_UNORM VK_FORMAT_BC3_UNORM_BLOCK, // BC3_UNORM + VK_FORMAT_BC4_UNORM_BLOCK, // BC4_UNORM + VK_FORMAT_BC5_UNORM_BLOCK, // BC5_UNORM VK_FORMAT_BC7_UNORM_BLOCK, // BC7_UNORM + VK_FORMAT_BC6H_SFLOAT_BLOCK, // BC6H_FLOAT + VK_FORMAT_BC6H_UFLOAT_BLOCK, // BC6H_UFLOAT + VK_FORMAT_R8_SNORM, // R8_SNORM VK_FORMAT_R8G8_SNORM, // R8G8_SNORM VK_FORMAT_R8G8B8A8_SNORM, // R8G8B8A8_SNORM + VK_FORMAT_R16_SNORM, // R16_SNORM + VK_FORMAT_R16G16_SNORM, // R16G16_SNORM + VK_FORMAT_R16G16B16A16_SNORM, // R16G16B16A16_SNORM VK_FORMAT_R16_SFLOAT, // R16_FLOAT VK_FORMAT_R16G16_SFLOAT, // R16G16_FLOAT VK_FORMAT_R16G16B16A16_SFLOAT, // R16G16B16A16_FLOAT VK_FORMAT_R32_SFLOAT, // R32_FLOAT VK_FORMAT_R32G32_SFLOAT, // R32G32_FLOAT VK_FORMAT_R32G32B32A32_SFLOAT, // R32G32B32A32_FLOAT + VK_FORMAT_B10G11R11_UFLOAT_PACK32, // R11G11B10_UFLOAT VK_FORMAT_R8_UINT, // R8_UINT VK_FORMAT_R8G8_UINT, // R8G8_UINT VK_FORMAT_R8G8B8A8_UINT, // R8G8B8A8_UINT VK_FORMAT_R16_UINT, // R16_UINT VK_FORMAT_R16G16_UINT, // R16G16_UINT VK_FORMAT_R16G16B16A16_UINT, // R16G16B16A16_UINT + VK_FORMAT_R8_SINT, // R8_INT + VK_FORMAT_R8G8_SINT, // R8G8_INT + VK_FORMAT_R8G8B8A8_SINT, // R8G8B8A8_INT + VK_FORMAT_R16_SINT, // R16_INT + VK_FORMAT_R16G16_SINT, // R16G16_INT + VK_FORMAT_R16G16B16A16_SINT, // R16G16B16A16_INT VK_FORMAT_R8G8B8A8_SRGB, // R8G8B8A8_UNORM_SRGB VK_FORMAT_B8G8R8A8_SRGB, // B8G8R8A8_UNORM_SRGB + VK_FORMAT_BC1_RGBA_SRGB_BLOCK, // BC1_UNORM_SRGB + VK_FORMAT_BC2_SRGB_BLOCK, // BC3_UNORM_SRGB VK_FORMAT_BC3_SRGB_BLOCK, // BC3_UNORM_SRGB VK_FORMAT_BC7_SRGB_BLOCK, // BC7_UNORM_SRGB VK_FORMAT_D16_UNORM, // D16_UNORM @@ -177,8 +196,26 @@ static VkFormat SDLToVK_SurfaceFormat[] = { SDL_COMPILE_TIME_ASSERT(SDLToVK_SurfaceFormat, SDL_arraysize(SDLToVK_SurfaceFormat) == SDL_GPU_TEXTUREFORMAT_MAX); static VkComponentMapping SDLToVK_SurfaceSwizzle[] = { + { + // A8 + VK_COMPONENT_SWIZZLE_ZERO, + VK_COMPONENT_SWIZZLE_ZERO, + VK_COMPONENT_SWIZZLE_ZERO, + VK_COMPONENT_SWIZZLE_R, + }, + IDENTITY_SWIZZLE, // R8 + IDENTITY_SWIZZLE, // R8G8 IDENTITY_SWIZZLE, // R8G8B8A8 - IDENTITY_SWIZZLE, // B8G8R8A8 + IDENTITY_SWIZZLE, // R16 + IDENTITY_SWIZZLE, // R16G16 + IDENTITY_SWIZZLE, // R16G16B16A16 + { + // R10G10B10A2 + VK_COMPONENT_SWIZZLE_R, + VK_COMPONENT_SWIZZLE_G, + VK_COMPONENT_SWIZZLE_B, + VK_COMPONENT_SWIZZLE_A, + }, { // B5G6R5 VK_COMPONENT_SWIZZLE_B, @@ -194,43 +231,50 @@ static VkComponentMapping SDLToVK_SurfaceSwizzle[] = { VK_COMPONENT_SWIZZLE_A, }, IDENTITY_SWIZZLE, // B4G4R4A4 - { - // R10G10B10A2 - VK_COMPONENT_SWIZZLE_R, - VK_COMPONENT_SWIZZLE_G, - VK_COMPONENT_SWIZZLE_B, - VK_COMPONENT_SWIZZLE_A, - }, - IDENTITY_SWIZZLE, // R16G16 - IDENTITY_SWIZZLE, // R16G16B16A16 - IDENTITY_SWIZZLE, // R8 - { - // A8 - VK_COMPONENT_SWIZZLE_ZERO, - VK_COMPONENT_SWIZZLE_ZERO, - VK_COMPONENT_SWIZZLE_ZERO, - VK_COMPONENT_SWIZZLE_R, - }, + IDENTITY_SWIZZLE, // B8G8R8A8 IDENTITY_SWIZZLE, // BC1 IDENTITY_SWIZZLE, // BC2 IDENTITY_SWIZZLE, // BC3 + IDENTITY_SWIZZLE, // BC4 + IDENTITY_SWIZZLE, // BC5 IDENTITY_SWIZZLE, // BC7 + IDENTITY_SWIZZLE, // BC6H_FLOAT + IDENTITY_SWIZZLE, // BC6H_UFLOAT + IDENTITY_SWIZZLE, // R8_SNORM IDENTITY_SWIZZLE, // R8G8_SNORM IDENTITY_SWIZZLE, // R8G8B8A8_SNORM + IDENTITY_SWIZZLE, // R16_SNORM + IDENTITY_SWIZZLE, // R16G16_SNORM + IDENTITY_SWIZZLE, // R16G16B16A16_SNORM IDENTITY_SWIZZLE, // R16_SFLOAT IDENTITY_SWIZZLE, // R16G16_SFLOAT IDENTITY_SWIZZLE, // R16G16B16A16_SFLOAT IDENTITY_SWIZZLE, // R32_SFLOAT IDENTITY_SWIZZLE, // R32G32_SFLOAT IDENTITY_SWIZZLE, // R32G32B32A32_SFLOAT + { + // R11G11B10_UFLOAT + VK_COMPONENT_SWIZZLE_R, + VK_COMPONENT_SWIZZLE_G, + VK_COMPONENT_SWIZZLE_B, + VK_COMPONENT_SWIZZLE_ONE, + }, IDENTITY_SWIZZLE, // R8_UINT IDENTITY_SWIZZLE, // R8G8_UINT IDENTITY_SWIZZLE, // R8G8B8A8_UINT IDENTITY_SWIZZLE, // R16_UINT IDENTITY_SWIZZLE, // R16G16_UINT IDENTITY_SWIZZLE, // R16G16B16A16_UINT + IDENTITY_SWIZZLE, // R8_INT + IDENTITY_SWIZZLE, // R8G8_INT + IDENTITY_SWIZZLE, // R8G8B8A8_INT + IDENTITY_SWIZZLE, // R16_INT + IDENTITY_SWIZZLE, // R16G16_INT + IDENTITY_SWIZZLE, // R16G16B16A16_INT IDENTITY_SWIZZLE, // R8G8B8A8_SRGB IDENTITY_SWIZZLE, // B8G8R8A8_SRGB + IDENTITY_SWIZZLE, // BC1_SRGB + IDENTITY_SWIZZLE, // BC2_SRGB IDENTITY_SWIZZLE, // BC3_SRGB IDENTITY_SWIZZLE, // BC7_SRGB IDENTITY_SWIZZLE, // D16_UNORM