Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions include/SDL3/SDL_gpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -4420,6 +4420,26 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize(
Uint32 height,
Uint32 depth_or_layer_count);

/**
* Get the SDL pixel format corresponding to a GPU texture format.
*
* \param format a texture format.
* \returns the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
*
* \since This function is available since SDL 3.4.0.
*/
extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatFromGPUTextureFormat(SDL_GPUTextureFormat format);

/**
* Get the GPU texture format corresponding to an SDL pixel format.
*
* \param format a pixel format.
* \returns the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
*
* \since This function is available since SDL 3.4.0.
*/
extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUTextureFormatFromPixelFormat(SDL_PixelFormat format);

#ifdef SDL_PLATFORM_GDK

/**
Expand Down
2 changes: 2 additions & 0 deletions src/dynapi/SDL_dynapi.sym
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,8 @@ SDL3_0.0.0 {
SDL_PutAudioStreamDataNoCopy;
SDL_AddAtomicU32;
SDL_hid_get_properties;
SDL_GetPixelFormatFromGPUTextureFormat;
SDL_GetGPUTextureFormatFromPixelFormat;
# extra symbols go here (don't modify this line)
local: *;
};
2 changes: 2 additions & 0 deletions src/dynapi/SDL_dynapi_overrides.h
Original file line number Diff line number Diff line change
Expand Up @@ -1280,3 +1280,5 @@
#define SDL_PutAudioStreamDataNoCopy SDL_PutAudioStreamDataNoCopy_REAL
#define SDL_AddAtomicU32 SDL_AddAtomicU32_REAL
#define SDL_hid_get_properties SDL_hid_get_properties_REAL
#define SDL_GetPixelFormatFromGPUTextureFormat SDL_GetPixelFormatFromGPUTextureFormat_REAL
#define SDL_GetGPUTextureFormatFromPixelFormat SDL_GetGPUTextureFormatFromPixelFormat_REAL
2 changes: 2 additions & 0 deletions src/dynapi/SDL_dynapi_procs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1288,3 +1288,5 @@ SDL_DYNAPI_PROC(int,SDL_GetEventDescription,(const SDL_Event *a,char *b,int c),(
SDL_DYNAPI_PROC(bool,SDL_PutAudioStreamDataNoCopy,(SDL_AudioStream *a,const void *b,int c,SDL_AudioStreamDataCompleteCallback d,void *e),(a,b,c,d,e),return)
SDL_DYNAPI_PROC(Uint32,SDL_AddAtomicU32,(SDL_AtomicU32 *a,int b),(a,b),return)
SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_hid_get_properties,(SDL_hid_device *a),(a),return)
SDL_DYNAPI_PROC(SDL_PixelFormat,SDL_GetPixelFormatFromGPUTextureFormat,(SDL_GPUTextureFormat a),(a),return)
SDL_DYNAPI_PROC(SDL_GPUTextureFormat,SDL_GetGPUTextureFormatFromPixelFormat,(SDL_PixelFormat a),(a),return)
65 changes: 65 additions & 0 deletions src/gpu/SDL_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -3344,3 +3344,68 @@ Uint32 SDL_CalculateGPUTextureFormatSize(
Uint32 blocksPerColumn = (height + blockHeight - 1) / blockHeight;
return depth_or_layer_count * blocksPerRow * blocksPerColumn * SDL_GPUTextureFormatTexelBlockSize(format);
}

SDL_PixelFormat SDL_GetPixelFormatFromGPUTextureFormat(SDL_GPUTextureFormat format)
{
switch (format) {
case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
return SDL_PIXELFORMAT_BGRA4444;
case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
return SDL_PIXELFORMAT_BGR565;
case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
return SDL_PIXELFORMAT_BGRA5551;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
return SDL_PIXELFORMAT_BGRA32;
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
return SDL_PIXELFORMAT_BGRA32;
case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
return SDL_PIXELFORMAT_ABGR2101010;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
return SDL_PIXELFORMAT_RGBA64;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
return SDL_PIXELFORMAT_RGBA64;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
return SDL_PIXELFORMAT_RGBA64_FLOAT;
case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
return SDL_PIXELFORMAT_RGBA128_FLOAT;
default:
return SDL_PIXELFORMAT_UNKNOWN;
}
}

SDL_GPUTextureFormat SDL_GetGPUTextureFormatFromPixelFormat(SDL_PixelFormat format)
{
switch (format) {
case SDL_PIXELFORMAT_BGRA4444:
return SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM;
case SDL_PIXELFORMAT_BGR565:
return SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM;
case SDL_PIXELFORMAT_BGRA5551:
return SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM;
case SDL_PIXELFORMAT_BGRA32:
case SDL_PIXELFORMAT_BGRX32:
return SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM;
case SDL_PIXELFORMAT_RGBA32:
case SDL_PIXELFORMAT_RGBX32:
return SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM;
case SDL_PIXELFORMAT_ABGR2101010:
return SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM;
case SDL_PIXELFORMAT_RGBA64:
return SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM;
case SDL_PIXELFORMAT_RGBA64_FLOAT:
return SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT;
case SDL_PIXELFORMAT_RGBA128_FLOAT:
return SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT;
default:
return SDL_GPU_TEXTUREFORMAT_INVALID;
}
}

61 changes: 2 additions & 59 deletions src/render/gpu/SDL_render_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,71 +117,14 @@ static bool GPU_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMod
return true;
}

static SDL_GPUTextureFormat PixFormatToTexFormat(SDL_PixelFormat pixel_format)
{
switch (pixel_format) {
case SDL_PIXELFORMAT_BGRA32:
case SDL_PIXELFORMAT_BGRX32:
return SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM;
case SDL_PIXELFORMAT_RGBA32:
case SDL_PIXELFORMAT_RGBX32:
return SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM;

// YUV TODO
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
case SDL_PIXELFORMAT_NV12:
case SDL_PIXELFORMAT_NV21:
case SDL_PIXELFORMAT_UYVY:
default:
return SDL_GPU_TEXTUREFORMAT_INVALID;
}
}

static SDL_PixelFormat TexFormatToPixFormat(SDL_GPUTextureFormat tex_format)
{
switch (tex_format) {
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
return SDL_PIXELFORMAT_BGRA32;
case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
return SDL_PIXELFORMAT_BGR565;
case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
return SDL_PIXELFORMAT_BGRA5551;
case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
return SDL_PIXELFORMAT_BGRA4444;
case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
return SDL_PIXELFORMAT_ABGR2101010;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
return SDL_PIXELFORMAT_RGBA64;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
return SDL_PIXELFORMAT_RGBA64_FLOAT;
case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
return SDL_PIXELFORMAT_RGBA128_FLOAT;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
return SDL_PIXELFORMAT_RGBA64;
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
return SDL_PIXELFORMAT_RGBA32;
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
return SDL_PIXELFORMAT_BGRA32;
default:
return SDL_PIXELFORMAT_UNKNOWN;
}
}

static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
{
GPU_RenderData *renderdata = (GPU_RenderData *)renderer->internal;
GPU_TextureData *data;
SDL_GPUTextureFormat format;
SDL_GPUTextureUsageFlags usage = SDL_GPU_TEXTUREUSAGE_SAMPLER;

format = PixFormatToTexFormat(texture->format);
format = SDL_GetGPUTextureFormatFromPixelFormat(texture->format);

if (format == SDL_GPU_TEXTUREFORMAT_INVALID) {
return SDL_SetError("Texture format %s not supported by SDL_GPU",
Expand Down Expand Up @@ -948,7 +891,7 @@ static SDL_Surface *GPU_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect
pixfmt = texture->format;
} else {
gpu_tex = data->backbuffer.texture;
pixfmt = TexFormatToPixFormat(data->backbuffer.format);
pixfmt = SDL_GetPixelFormatFromGPUTextureFormat(data->backbuffer.format);

if (pixfmt == SDL_PIXELFORMAT_UNKNOWN) {
SDL_SetError("Unsupported backbuffer format");
Expand Down
Loading