Removed the limit on the number of supported renderer texture formats

Fixes https://github.com/libsdl-org/SDL/issues/9056
This commit is contained in:
Sam Lantinga
2024-05-09 12:10:42 -07:00
parent f3d79ad75f
commit 598b4e0a1f
14 changed files with 162 additions and 206 deletions

View File

@@ -87,7 +87,7 @@ typedef struct SDL_RendererInfo
const char *name; /**< The name of the renderer */
SDL_RendererFlags flags; /**< Supported ::SDL_RendererFlags */
int num_texture_formats; /**< The number of available texture formats */
SDL_PixelFormatEnum texture_formats[16]; /**< The available texture formats */
const SDL_PixelFormatEnum *texture_formats; /**< The available texture formats */
int max_texture_width; /**< The maximum texture width */
int max_texture_height; /**< The maximum texture height */
} SDL_RendererInfo;

View File

@@ -137,6 +137,17 @@ char SDL_renderer_magic;
char SDL_texture_magic;
int SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormatEnum format)
{
SDL_PixelFormatEnum *texture_formats = (SDL_PixelFormatEnum *)SDL_realloc((void *)renderer->info.texture_formats, (renderer->info.num_texture_formats + 1) * sizeof(SDL_PixelFormatEnum));
if (!texture_formats) {
return -1;
}
texture_formats[renderer->info.num_texture_formats++] = format;
renderer->info.texture_formats = texture_formats;
return 0;
}
void SDL_SetupRendererColorspace(SDL_Renderer *renderer, SDL_PropertiesID props)
{
renderer->output_colorspace = (SDL_Colorspace)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER, SDL_COLORSPACE_SRGB);
@@ -780,7 +791,7 @@ const char *SDL_GetRenderDriver(int index)
SDL_GetNumRenderDrivers() - 1);
return NULL;
}
return render_drivers[index]->info.name;
return render_drivers[index]->name;
#else
SDL_SetError("SDL not built with rendering support");
return NULL;
@@ -979,7 +990,7 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
if (name) {
for (i = 0; i < n; i++) {
const SDL_RenderDriver *driver = render_drivers[i];
if (SDL_strcasecmp(name, driver->info.name) == 0) {
if (SDL_strcasecmp(name, driver->name) == 0) {
// Create a new renderer instance
++attempted;
rc = driver->CreateRenderer(renderer, window, props);
@@ -1104,6 +1115,7 @@ error:
#ifdef SDL_PLATFORM_ANDROID
Android_ActivityMutex_Unlock();
#endif
SDL_free((void *)renderer->info.texture_formats);
SDL_free(renderer);
return NULL;
@@ -4588,6 +4600,7 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer)
renderer->magic = NULL; // It's no longer magical...
}
SDL_free((void *)renderer->info.texture_formats);
SDL_free(renderer);
}

View File

@@ -299,8 +299,7 @@ struct SDL_RenderDriver
{
int (*CreateRenderer)(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID props);
/* Info about the renderer capabilities */
SDL_RendererInfo info;
const char *name;
};
/* Not all of these are available in a given build. Use #ifdefs, etc. */
@@ -316,6 +315,9 @@ extern SDL_RenderDriver PSP_RenderDriver;
extern SDL_RenderDriver SW_RenderDriver;
extern SDL_RenderDriver VITA_GXM_RenderDriver;
/* Add a supported texture format to a renderer */
extern int SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormatEnum format);
/* Setup colorspace conversion */
extern void SDL_SetupRendererColorspace(SDL_Renderer *renderer, SDL_PropertiesID props);

View File

@@ -1617,10 +1617,12 @@ int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propertie
renderer->DestroyTexture = D3D_DestroyTexture;
renderer->DestroyRenderer = D3D_DestroyRenderer;
renderer->SetVSync = D3D_SetVSync;
renderer->info = D3D_RenderDriver.info;
renderer->driverdata = data;
D3D_InvalidateCachedState(renderer);
renderer->info.name = D3D_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_GetWindowSizeInPixels(window, &w, &h);
if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) {
fullscreen_mode = SDL_GetWindowFullscreenMode(window);
@@ -1717,8 +1719,8 @@ int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propertie
}
}
if (data->shaders[SHADER_YUV]) {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
}
}
#endif
@@ -1729,12 +1731,6 @@ int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propertie
}
SDL_RenderDriver D3D_RenderDriver = {
D3D_CreateRenderer,
{ "direct3d",
SDL_RENDERER_PRESENTVSYNC,
1,
{ SDL_PIXELFORMAT_ARGB8888 },
0,
0 }
D3D_CreateRenderer, "direct3d"
};
#endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */

View File

@@ -2801,10 +2801,20 @@ static int D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
renderer->RenderPresent = D3D11_RenderPresent;
renderer->DestroyTexture = D3D11_DestroyTexture;
renderer->DestroyRenderer = D3D11_DestroyRenderer;
renderer->info = D3D11_RenderDriver.info;
renderer->driverdata = data;
D3D11_InvalidateCachedState(renderer);
renderer->info.name = D3D11_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
#if SDL_WINAPI_FAMILY_PHONE
/* VSync is required in Windows Phone, at least for Win Phone 8.0 and 8.1.
* Failure to use it seems to either result in:
@@ -2844,24 +2854,7 @@ static int D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
}
SDL_RenderDriver D3D11_RenderDriver = {
D3D11_CreateRenderer,
{
"direct3d11",
SDL_RENDERER_PRESENTVSYNC, /* flags. see SDL_RendererFlags */
9, /* num_texture_formats */
{ /* texture_formats */
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_XBGR2101010,
SDL_PIXELFORMAT_RGBA64_FLOAT,
SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12,
SDL_PIXELFORMAT_NV21,
SDL_PIXELFORMAT_P010 },
0, /* max_texture_width: will be filled in later */
0 /* max_texture_height: will be filled in later */
}
D3D11_CreateRenderer, "direct3d11"
};
#endif /* SDL_VIDEO_RENDER_D3D11 && !SDL_RENDER_DISABLED */

View File

@@ -3219,10 +3219,22 @@ int D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propert
renderer->RenderPresent = D3D12_RenderPresent;
renderer->DestroyTexture = D3D12_DestroyTexture;
renderer->DestroyRenderer = D3D12_DestroyRenderer;
renderer->info = D3D12_RenderDriver.info;
renderer->driverdata = data;
D3D12_InvalidateCachedState(renderer);
renderer->info.name = D3D12_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
renderer->info.max_texture_width = 16384;
renderer->info.max_texture_height = 16384;
if (SDL_GetBooleanProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) {
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
@@ -3247,24 +3259,7 @@ int D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propert
}
SDL_RenderDriver D3D12_RenderDriver = {
D3D12_CreateRenderer,
{
"direct3d12",
SDL_RENDERER_PRESENTVSYNC, /* flags. see SDL_RendererFlags */
9, /* num_texture_formats */
{ /* texture_formats */
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_XBGR2101010,
SDL_PIXELFORMAT_RGBA64_FLOAT,
SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12,
SDL_PIXELFORMAT_NV21,
SDL_PIXELFORMAT_P010 },
16384, /* max_texture_width */
16384 /* max_texture_height */
}
D3D12_CreateRenderer, "direct3d12"
};
/* Ends C function definitions when using C++ */

View File

@@ -2139,7 +2139,17 @@ static int METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
renderer->GetMetalLayer = METAL_GetMetalLayer;
renderer->GetMetalCommandEncoder = METAL_GetMetalCommandEncoder;
renderer->info = METAL_RenderDriver.info;
renderer->info.name = METAL_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA128_FLOAT);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
#if (defined(SDL_PLATFORM_MACOS) && defined(MAC_OS_X_VERSION_10_13)) || TARGET_OS_MACCATALYST
if (@available(macOS 10.13, *)) {
@@ -2195,24 +2205,7 @@ static int METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
}
SDL_RenderDriver METAL_RenderDriver = {
METAL_CreateRenderer,
{
"metal",
SDL_RENDERER_PRESENTVSYNC,
10,
{ SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_ABGR8888,
SDL_PIXELFORMAT_XBGR2101010,
SDL_PIXELFORMAT_RGBA64_FLOAT,
SDL_PIXELFORMAT_RGBA128_FLOAT,
SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12,
SDL_PIXELFORMAT_NV21,
SDL_PIXELFORMAT_P010 },
0,
0,
}
METAL_CreateRenderer, "metal"
};
#endif /* SDL_VIDEO_RENDER_METAL */

View File

@@ -1678,12 +1678,18 @@ static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
renderer->DestroyTexture = GL_DestroyTexture;
renderer->DestroyRenderer = GL_DestroyRenderer;
renderer->SetVSync = GL_SetVSync;
renderer->info = GL_RenderDriver.info;
renderer->info.flags = 0; /* will set some flags below. */
renderer->driverdata = data;
GL_InvalidateCachedState(renderer);
renderer->window = window;
renderer->info.name = GL_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
data->context = SDL_GL_CreateContext(window);
if (!data->context) {
goto error;
@@ -1793,18 +1799,18 @@ static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
#if SDL_HAVE_YUV
/* We support YV12 textures using 3 textures and a shader */
if (data->shaders && data->num_texture_units >= 3) {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
}
/* We support NV12 textures using 2 textures and a shader */
if (data->shaders && data->num_texture_units >= 2) {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV21;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
}
#endif
#ifdef SDL_PLATFORM_MACOS
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_UYVY;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_UYVY);
#endif
renderer->rect_index_order[0] = 0;
@@ -1871,16 +1877,7 @@ error:
}
SDL_RenderDriver GL_RenderDriver = {
GL_CreateRenderer,
{ "opengl",
SDL_RENDERER_PRESENTVSYNC,
4,
{ SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_ABGR8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_XBGR8888 },
0,
0 }
GL_CreateRenderer, "opengl"
};
#endif /* SDL_VIDEO_RENDER_OGL */

View File

@@ -2087,11 +2087,16 @@ static int GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
if (!data) {
goto error;
}
renderer->info = GLES2_RenderDriver.info;
renderer->driverdata = data;
GLES2_InvalidateCachedState(renderer);
renderer->window = window;
renderer->info.name = GLES2_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
/* Create an OpenGL ES 2.0 context */
data->context = SDL_GL_CreateContext(window);
if (!data->context) {
@@ -2183,14 +2188,14 @@ static int GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
renderer->DestroyRenderer = GLES2_DestroyRenderer;
renderer->SetVSync = GLES2_SetVSync;
#if SDL_HAVE_YUV
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV21;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
#endif
#ifdef GL_TEXTURE_EXTERNAL_OES
if (GLES2_CacheShader(data, GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES, GL_FRAGMENT_SHADER)) {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_EXTERNAL_OES;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_EXTERNAL_OES);
}
#endif
@@ -2243,16 +2248,7 @@ error:
}
SDL_RenderDriver GLES2_RenderDriver = {
GLES2_CreateRenderer,
{ "opengles2",
SDL_RENDERER_PRESENTVSYNC,
4,
{ SDL_PIXELFORMAT_RGBA32,
SDL_PIXELFORMAT_BGRA32,
SDL_PIXELFORMAT_BGRX32,
SDL_PIXELFORMAT_RGBX32 },
0,
0 }
GLES2_CreateRenderer, "opengles2"
};
#endif /* SDL_VIDEO_RENDER_OGL_ES2 */

View File

@@ -692,11 +692,16 @@ static int PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
renderer->DestroyTexture = PS2_DestroyTexture;
renderer->DestroyRenderer = PS2_DestroyRenderer;
renderer->SetVSync = PS2_SetVSync;
renderer->info = PS2_RenderDriver.info;
renderer->driverdata = data;
PS2_InvalidateCachedState(renderer);
renderer->window = window;
renderer->info.name = PS2_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
renderer->info.max_texture_width = 1024;
renderer->info.max_texture_height = 1024;
if (data->vsync) {
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
@@ -704,18 +709,7 @@ static int PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
}
SDL_RenderDriver PS2_RenderDriver = {
.CreateRenderer = PS2_CreateRenderer,
.info = {
.name = "PS2 gsKit",
.flags = SDL_RENDERER_PRESENTVSYNC,
.num_texture_formats = 2,
.texture_formats = {
[0] = SDL_PIXELFORMAT_ABGR1555,
[1] = SDL_PIXELFORMAT_ABGR8888,
},
.max_texture_width = 1024,
.max_texture_height = 1024,
}
PS2_CreateRenderer, "PS2 gsKit"
};
#endif /* SDL_VIDEO_RENDER_PS2 */

View File

@@ -1324,11 +1324,18 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
renderer->DestroyTexture = PSP_DestroyTexture;
renderer->DestroyRenderer = PSP_DestroyRenderer;
renderer->SetVSync = PSP_SetVSync;
renderer->info = PSP_RenderDriver.info;
renderer->driverdata = data;
PSP_InvalidateCachedState(renderer);
renderer->window = window;
renderer->info.name = PSP_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGR565);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR4444);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
renderer->info.max_texture_width = 512;
renderer->info.max_texture_height = 512;
data->initialized = SDL_TRUE;
data->most_recent_target = NULL;
data->least_recent_target = NULL;
@@ -1399,20 +1406,7 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
}
SDL_RenderDriver PSP_RenderDriver = {
.CreateRenderer = PSP_CreateRenderer,
.info = {
.name = "PSP",
.flags = SDL_RENDERER_PRESENTVSYNC,
.num_texture_formats = 4,
.texture_formats = {
[0] = SDL_PIXELFORMAT_BGR565,
[1] = SDL_PIXELFORMAT_ABGR1555,
[2] = SDL_PIXELFORMAT_ABGR4444,
[3] = SDL_PIXELFORMAT_ABGR8888,
},
.max_texture_width = 512,
.max_texture_height = 512,
}
PSP_CreateRenderer, "PSP"
};
#endif /* SDL_VIDEO_RENDER_PSP */

View File

@@ -1023,58 +1023,58 @@ static void SW_DestroyRenderer(SDL_Renderer *renderer)
static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormatEnum format)
{
/* Prefer the format used by the framebuffer by default. */
renderer->info.texture_formats[renderer->info.num_texture_formats++] = format;
SDL_AddSupportedTextureFormat(renderer, format);
switch (format) {
case SDL_PIXELFORMAT_XRGB4444:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ARGB4444;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB4444);
break;
case SDL_PIXELFORMAT_XBGR4444:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ABGR4444;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR4444);
break;
case SDL_PIXELFORMAT_ARGB4444:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XRGB4444;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB4444);
break;
case SDL_PIXELFORMAT_ABGR4444:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XBGR4444;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR4444);
break;
case SDL_PIXELFORMAT_XRGB1555:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ARGB1555;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB1555);
break;
case SDL_PIXELFORMAT_XBGR1555:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ABGR1555;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
break;
case SDL_PIXELFORMAT_ARGB1555:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XRGB1555;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB1555);
break;
case SDL_PIXELFORMAT_ABGR1555:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XBGR1555;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR1555);
break;
case SDL_PIXELFORMAT_XRGB8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ARGB8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
break;
case SDL_PIXELFORMAT_RGBX8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_RGBA8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA8888);
break;
case SDL_PIXELFORMAT_XBGR8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ABGR8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
break;
case SDL_PIXELFORMAT_BGRX8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_BGRA8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA8888);
break;
case SDL_PIXELFORMAT_ARGB8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XRGB8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
break;
case SDL_PIXELFORMAT_RGBA8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_RGBX8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX8888);
break;
case SDL_PIXELFORMAT_ABGR8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XBGR8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
break;
case SDL_PIXELFORMAT_BGRA8888:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_BGRX8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX8888);
break;
default:
break;
@@ -1088,30 +1088,30 @@ static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormatEnum for
switch (SDL_PIXELORDER(format)) {
case SDL_PACKEDORDER_BGRX:
case SDL_PACKEDORDER_BGRA:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_BGRX8888;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_BGRA8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA8888);
break;
case SDL_PACKEDORDER_RGBX:
case SDL_PACKEDORDER_RGBA:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_RGBX8888;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_RGBA8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA8888);
break;
case SDL_PACKEDORDER_XBGR:
case SDL_PACKEDORDER_ABGR:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XBGR8888;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ABGR8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
break;
case SDL_PACKEDORDER_XRGB:
case SDL_PACKEDORDER_ARGB:
default:
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XRGB8888;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ARGB8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
break;
}
}
} else {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_XRGB8888;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_ARGB8888;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
}
}
@@ -1155,10 +1155,11 @@ int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SD
renderer->RenderPresent = SW_RenderPresent;
renderer->DestroyTexture = SW_DestroyTexture;
renderer->DestroyRenderer = SW_DestroyRenderer;
renderer->info = SW_RenderDriver.info;
renderer->driverdata = data;
SW_InvalidateCachedState(renderer);
renderer->info.name = SW_RenderDriver.name;
SW_SelectBestFormats(renderer, surface->format->format);
SDL_SetupRendererColorspace(renderer, create_props);
@@ -1200,14 +1201,7 @@ static int SW_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
}
SDL_RenderDriver SW_RenderDriver = {
SW_CreateRenderer,
{ SDL_SOFTWARE_RENDERER,
SDL_RENDERER_PRESENTVSYNC,
0,
{ /* formats filled in later */
SDL_PIXELFORMAT_UNKNOWN },
0,
0 }
SW_CreateRenderer, SDL_SOFTWARE_RENDERER
};
#endif /* SDL_VIDEO_RENDER_SW */

View File

@@ -100,24 +100,7 @@ static void VITA_GXM_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture
static void VITA_GXM_DestroyRenderer(SDL_Renderer *renderer);
SDL_RenderDriver VITA_GXM_RenderDriver = {
.CreateRenderer = VITA_GXM_CreateRenderer,
.info = {
.name = "VITA gxm",
.flags = SDL_RENDERER_PRESENTVSYNC,
.num_texture_formats = 8,
.texture_formats = {
[0] = SDL_PIXELFORMAT_ABGR8888,
[1] = SDL_PIXELFORMAT_ARGB8888,
[2] = SDL_PIXELFORMAT_RGB565,
[3] = SDL_PIXELFORMAT_BGR565,
[4] = SDL_PIXELFORMAT_YV12,
[5] = SDL_PIXELFORMAT_IYUV,
[6] = SDL_PIXELFORMAT_NV12,
[7] = SDL_PIXELFORMAT_NV21,
},
.max_texture_width = 4096,
.max_texture_height = 4096,
}
VITA_GXM_CreateRenderer, "VITA gxm"
};
static int PixelFormatToVITAFMT(Uint32 format)
@@ -250,11 +233,22 @@ static int VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, S
renderer->DestroyRenderer = VITA_GXM_DestroyRenderer;
renderer->SetVSync = VITA_GXM_SetVSync;
renderer->info = VITA_GXM_RenderDriver.info;
renderer->driverdata = data;
VITA_GXM_InvalidateCachedState(renderer);
renderer->window = window;
renderer->info.name = VITA_GXM_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGB565);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGR565);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
renderer->info.max_texture_width = 4096;
renderer->info.max_texture_height = 4096;
data->initialized = SDL_TRUE;
if (SDL_GetBooleanProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) {

View File

@@ -4083,10 +4083,17 @@ static int VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
renderer->RenderPresent = VULKAN_RenderPresent;
renderer->DestroyTexture = VULKAN_DestroyTexture;
renderer->DestroyRenderer = VULKAN_DestroyRenderer;
renderer->info = VULKAN_RenderDriver.info;
renderer->driverdata = rendererData;
VULKAN_InvalidateCachedState(renderer);
renderer->info.name = VULKAN_RenderDriver.name;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
renderer->info.max_texture_width = 16384;
renderer->info.max_texture_height = 16384;
if (SDL_GetBooleanProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) {
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
@@ -4108,11 +4115,11 @@ static int VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
#if SDL_HAVE_YUV
if (rendererData->supportsKHRSamplerYCbCrConversion) {
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV12;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_NV21;
renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_P010;
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
}
#endif
@@ -4120,19 +4127,7 @@ static int VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
}
SDL_RenderDriver VULKAN_RenderDriver = {
VULKAN_CreateRenderer,
{
"vulkan",
SDL_RENDERER_PRESENTVSYNC, /* flags. see SDL_RendererFlags */
4, /* num_texture_formats */
{ /* texture_formats */
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_XRGB8888,
SDL_PIXELFORMAT_XBGR2101010,
SDL_PIXELFORMAT_RGBA64_FLOAT },
16384, /* max_texture_width */
16384 /* max_texture_height */
}
VULKAN_CreateRenderer, "vulkan"
};
#endif /* SDL_VIDEO_RENDER_VULKAN */