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

@@ -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 */