From 10774868721648fcd3a671719e994596eabee30e Mon Sep 17 00:00:00 2001
From: Cameron Cawley <[EMAIL REDACTED]>
Date: Fri, 16 Jan 2026 17:44:55 +0000
Subject: [PATCH] Support more texture formats with the Direct3D 9 renderer
---
src/render/direct3d/SDL_render_d3d.c | 57 ++++++++++++++++++++--------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c
index 730a65d39f118..d54348b8fb55c 100644
--- a/src/render/direct3d/SDL_render_d3d.c
+++ b/src/render/direct3d/SDL_render_d3d.c
@@ -198,15 +198,25 @@ static bool D3D_SetError(const char *prefix, HRESULT result)
return SDL_SetError("%s: %s", prefix, error);
}
+static const struct {
+ Uint32 sdl;
+ D3DFORMAT d3d;
+} d3d_format_map[] = {
+ { SDL_PIXELFORMAT_ARGB8888, D3DFMT_A8R8G8B8 },
+ { SDL_PIXELFORMAT_XRGB8888, D3DFMT_X8R8G8B8 },
+ { SDL_PIXELFORMAT_ABGR8888, D3DFMT_A8B8G8R8 },
+ { SDL_PIXELFORMAT_XBGR8888, D3DFMT_X8B8G8R8 },
+ { SDL_PIXELFORMAT_ARGB2101010, D3DFMT_A2R10G10B10 },
+ { SDL_PIXELFORMAT_RGB565, D3DFMT_R5G6B5 },
+ { SDL_PIXELFORMAT_ARGB1555, D3DFMT_A1R5G5B5 },
+ { SDL_PIXELFORMAT_XRGB1555, D3DFMT_X1R5G5B5 },
+ { SDL_PIXELFORMAT_ARGB4444, D3DFMT_A4R4G4B4 },
+ { SDL_PIXELFORMAT_XRGB4444, D3DFMT_X4R4G4B4 }
+};
+
static D3DFORMAT PixelFormatToD3DFMT(Uint32 format)
{
switch (format) {
- case SDL_PIXELFORMAT_RGB565:
- return D3DFMT_R5G6B5;
- case SDL_PIXELFORMAT_XRGB8888:
- return D3DFMT_X8R8G8B8;
- case SDL_PIXELFORMAT_ARGB8888:
- return D3DFMT_A8R8G8B8;
case SDL_PIXELFORMAT_INDEX8:
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
@@ -214,22 +224,23 @@ static D3DFORMAT PixelFormatToD3DFMT(Uint32 format)
case SDL_PIXELFORMAT_NV21:
return D3DFMT_L8;
default:
+ for (int i = 0; i < SDL_arraysize(d3d_format_map); i++) {
+ if (d3d_format_map[i].sdl == format) {
+ return d3d_format_map[i].d3d;
+ }
+ }
return D3DFMT_UNKNOWN;
}
}
static SDL_PixelFormat D3DFMTToPixelFormat(D3DFORMAT format)
{
- switch (format) {
- case D3DFMT_R5G6B5:
- return SDL_PIXELFORMAT_RGB565;
- case D3DFMT_X8R8G8B8:
- return SDL_PIXELFORMAT_XRGB8888;
- case D3DFMT_A8R8G8B8:
- return SDL_PIXELFORMAT_ARGB8888;
- default:
- return SDL_PIXELFORMAT_UNKNOWN;
+ for (int i = 0; i < SDL_arraysize(d3d_format_map); i++) {
+ if (d3d_format_map[i].d3d == format) {
+ return d3d_format_map[i].sdl;
+ }
}
+ return SDL_PIXELFORMAT_UNKNOWN;
}
static void D3D_InitRenderState(D3D_RenderData *data)
@@ -1815,6 +1826,7 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
D3D_RenderData *data;
HRESULT result;
HWND hwnd;
+ D3DDISPLAYMODE displayMode;
D3DPRESENT_PARAMETERS pparams;
IDirect3DSwapChain9 *chain;
D3DCAPS9 caps;
@@ -1873,7 +1885,6 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
D3D_InvalidateCachedState(renderer);
renderer->name = D3D_RenderDriver.name;
- SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_GetWindowSizeInPixels(window, &w, &h);
if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) {
@@ -1958,6 +1969,20 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget);
data->currentRenderTarget = NULL;
+ // Detect the supported texture formats
+ IDirect3D9_GetAdapterDisplayMode(data->d3d, data->adapter, &displayMode);
+ for (int i = 0; i < SDL_arraysize(d3d_format_map); i++) {
+ if (SUCCEEDED(IDirect3D9_CheckDeviceFormat(data->d3d,
+ data->adapter,
+ D3DDEVTYPE_HAL,
+ displayMode.Format,
+ 0,
+ D3DRTYPE_TEXTURE,
+ d3d_format_map[i].d3d))) {
+ SDL_AddSupportedTextureFormat(renderer, d3d_format_map[i].sdl);
+ }
+ }
+
// Set up parameters for rendering
D3D_InitRenderState(data);
for (int i = SHADER_NONE + 1; i < SDL_arraysize(data->shaders); ++i) {