sdl2-compat: render: Improve accuracy of SDL_GetRenderDriverInfo()

From 4453e2d05881c3616af8ca71f7c4267c60f993d8 Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Sun, 16 Mar 2025 21:22:35 -0500
Subject: [PATCH] render: Improve accuracy of SDL_GetRenderDriverInfo()

- Software renderer lacked supported texture formats
- Vita, PS2, and PSP renderers lacked handling entirely
- Vulkan and GPU renderers from SDL3 also lacked full support
---
 src/sdl2_compat.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index dbb3586..b5f4f9b 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -5440,7 +5440,8 @@ SDL_GetRenderDriverInfo(int idx, SDL2_RendererInfo *info)
     SDL3_zerop(info);
     info->name = name;
 
-    /* these are the values that SDL2 returns. */
+    /* For render drivers present in SDL2, these are the exact values SDL2 returns.
+       For render drivers new to SDL3, we return only the subset of formats SDL2 supports. */
     if ((SDL3_strcmp(name, "opengl") == 0) || (SDL3_strcmp(name, "opengles2") == 0)) {
         info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
         info->num_texture_formats = 4;
@@ -5485,8 +5486,62 @@ SDL_GetRenderDriverInfo(int idx, SDL2_RendererInfo *info)
         info->texture_formats[3] = SDL_PIXELFORMAT_IYUV;
         info->texture_formats[4] = SDL_PIXELFORMAT_NV12;
         info->texture_formats[5] = SDL_PIXELFORMAT_NV21;
+    } else if (SDL3_strcmp(name, "PS2 gsKit") == 0) {
+        info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 2;
+        info->texture_formats[0] = SDL_PIXELFORMAT_ABGR1555;
+        info->texture_formats[1] = SDL_PIXELFORMAT_ABGR8888;
+        info->max_texture_width = 1024;
+        info->max_texture_height = 1024;
+    } else if (SDL3_strcmp(name, "PSP") == 0) {
+        info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 4;
+        info->texture_formats[0] = SDL_PIXELFORMAT_BGR565;
+        info->texture_formats[1] = SDL_PIXELFORMAT_ABGR1555;
+        info->texture_formats[2] = SDL_PIXELFORMAT_ABGR4444;
+        info->texture_formats[3] = SDL_PIXELFORMAT_ABGR8888;
+        info->max_texture_width = 512;
+        info->max_texture_height = 512;
+    } else if (SDL3_strcmp(name, "VITA gxm") == 0) {
+        info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 8;
+        info->texture_formats[0] = SDL_PIXELFORMAT_ABGR8888;
+        info->texture_formats[1] = SDL_PIXELFORMAT_ARGB8888;
+        info->texture_formats[2] = SDL_PIXELFORMAT_RGB565;
+        info->texture_formats[3] = SDL_PIXELFORMAT_BGR565;
+        info->texture_formats[4] = SDL_PIXELFORMAT_YV12;
+        info->texture_formats[5] = SDL_PIXELFORMAT_IYUV;
+        info->texture_formats[6] = SDL_PIXELFORMAT_NV12;
+        info->texture_formats[7] = SDL_PIXELFORMAT_NV21;
+        info->max_texture_width = 4096;
+        info->max_texture_height = 4096;
+    } else if (SDL3_strcmp(name, "vulkan") == 0) {
+        info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 2;
+        info->texture_formats[0] = SDL_PIXELFORMAT_ARGB8888;
+        info->texture_formats[1] = SDL_PIXELFORMAT_ABGR8888;
+        info->max_texture_width = 16384;
+        info->max_texture_height = 16384;
+    } else if (SDL3_strcmp(name, "gpu") == 0) {
+        info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 4;
+        info->texture_formats[0] = SDL_PIXELFORMAT_BGRA32;
+        info->texture_formats[1] = SDL_PIXELFORMAT_RGBA32;
+        info->texture_formats[2] = SDL_PIXELFORMAT_BGRX32;
+        info->texture_formats[3] = SDL_PIXELFORMAT_RGBX32;
+        info->max_texture_width = 16384;
+        info->max_texture_height = 16384;
     } else if (SDL3_strcmp(name, "software") == 0) {
         info->flags = SDL2_RENDERER_SOFTWARE | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
+        info->num_texture_formats = 8;
+        info->texture_formats[0] = SDL_PIXELFORMAT_ARGB8888;
+        info->texture_formats[1] = SDL_PIXELFORMAT_ABGR8888;
+        info->texture_formats[2] = SDL_PIXELFORMAT_RGBA8888;
+        info->texture_formats[3] = SDL_PIXELFORMAT_BGRA8888;
+        info->texture_formats[4] = SDL_PIXELFORMAT_XRGB8888;
+        info->texture_formats[5] = SDL_PIXELFORMAT_XBGR8888;
+        info->texture_formats[6] = SDL_PIXELFORMAT_RGB565;
+        info->texture_formats[7] = SDL_PIXELFORMAT_XRGB1555;
     } else {  /* this seems reasonable if something currently-unknown shows up in SDL3. */
         info->flags = SDL2_RENDERER_ACCELERATED | SDL2_RENDERER_PRESENTVSYNC | SDL2_RENDERER_TARGETTEXTURE;
         info->num_texture_formats = 1;