mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-05-21 12:18:28 +00:00
Unified the software renderer creation path
Previously there were two different paths for renderer creation, and the HDR metadata initialization was missing when creating a software renderer for a surface. Now all the cases are handled in a single path, so regardless of whether you create a software renderer by name, a software renderer for a surface, or fall back to a software renderer, you'll get the correct initialization in all cases. Fixes https://github.com/libsdl-org/SDL/issues/9221
This commit is contained in:
parent
b9ab326982
commit
ed463b41e1
3 changed files with 65 additions and 76 deletions
|
@ -906,25 +906,21 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
int i, attempted = 0;
|
int i, attempted = 0;
|
||||||
SDL_PropertiesID new_props;
|
SDL_PropertiesID new_props;
|
||||||
|
|
||||||
if (!window && surface) {
|
|
||||||
return SDL_CreateSoftwareRenderer(surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SDL_PLATFORM_ANDROID
|
#ifdef SDL_PLATFORM_ANDROID
|
||||||
Android_ActivityMutex_Lock_Running();
|
Android_ActivityMutex_Lock_Running();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!window) {
|
if ((!window && !surface) || (window && surface)) {
|
||||||
SDL_InvalidParamError("window");
|
SDL_InvalidParamError("window");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_WindowHasSurface(window)) {
|
if (window && SDL_WindowHasSurface(window)) {
|
||||||
SDL_SetError("Surface already associated with window");
|
SDL_SetError("Surface already associated with window");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_GetRenderer(window)) {
|
if (window && SDL_GetRenderer(window)) {
|
||||||
SDL_SetError("Renderer already associated with window");
|
SDL_SetError("Renderer already associated with window");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -934,38 +930,45 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
SDL_SetBooleanProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE));
|
SDL_SetBooleanProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name) {
|
if (surface) {
|
||||||
name = SDL_GetHint(SDL_HINT_RENDER_DRIVER);
|
renderer = SW_CreateRendererForSurface(surface, props);
|
||||||
}
|
if (!renderer) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!name) {
|
||||||
|
name = SDL_GetHint(SDL_HINT_RENDER_DRIVER);
|
||||||
|
}
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
const SDL_RenderDriver *driver = render_drivers[i];
|
const SDL_RenderDriver *driver = render_drivers[i];
|
||||||
if (SDL_strcasecmp(name, driver->info.name) == 0) {
|
if (SDL_strcasecmp(name, driver->info.name) == 0) {
|
||||||
|
/* Create a new renderer instance */
|
||||||
|
++attempted;
|
||||||
|
renderer = driver->CreateRenderer(window, props);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
const SDL_RenderDriver *driver = render_drivers[i];
|
||||||
/* Create a new renderer instance */
|
/* Create a new renderer instance */
|
||||||
++attempted;
|
++attempted;
|
||||||
renderer = driver->CreateRenderer(window, props);
|
renderer = driver->CreateRenderer(window, props);
|
||||||
break;
|
if (renderer) {
|
||||||
|
/* Yay, we got one! */
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
const SDL_RenderDriver *driver = render_drivers[i];
|
|
||||||
/* Create a new renderer instance */
|
|
||||||
++attempted;
|
|
||||||
renderer = driver->CreateRenderer(window, props);
|
|
||||||
if (renderer) {
|
|
||||||
/* Yay, we got one! */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!renderer) {
|
if (!renderer) {
|
||||||
if (!name || !attempted) {
|
if (!name || !attempted) {
|
||||||
SDL_SetError("Couldn't find matching render driver");
|
SDL_SetError("Couldn't find matching render driver");
|
||||||
|
}
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_GetBooleanProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) {
|
if (SDL_GetBooleanProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) {
|
||||||
|
@ -983,6 +986,10 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
renderer->magic = &SDL_renderer_magic;
|
renderer->magic = &SDL_renderer_magic;
|
||||||
renderer->window = window;
|
renderer->window = window;
|
||||||
renderer->target_mutex = SDL_CreateMutex();
|
renderer->target_mutex = SDL_CreateMutex();
|
||||||
|
if (surface) {
|
||||||
|
renderer->main_view.pixel_w = surface->w;
|
||||||
|
renderer->main_view.pixel_h = surface->h;
|
||||||
|
}
|
||||||
renderer->main_view.viewport.w = -1;
|
renderer->main_view.viewport.w = -1;
|
||||||
renderer->main_view.viewport.h = -1;
|
renderer->main_view.viewport.h = -1;
|
||||||
renderer->main_view.scale.x = 1.0f;
|
renderer->main_view.scale.x = 1.0f;
|
||||||
|
@ -1005,7 +1012,12 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
/* new textures start at zero, so we start at 1 so first render doesn't flush by accident. */
|
/* new textures start at zero, so we start at 1 so first render doesn't flush by accident. */
|
||||||
renderer->render_command_generation = 1;
|
renderer->render_command_generation = 1;
|
||||||
|
|
||||||
renderer->line_method = SDL_GetRenderLineMethod();
|
if (renderer->info.flags & SDL_RENDERER_SOFTWARE) {
|
||||||
|
/* Software renderer always uses line method, for speed */
|
||||||
|
renderer->line_method = SDL_RENDERLINEMETHOD_LINES;
|
||||||
|
} else {
|
||||||
|
renderer->line_method = SDL_GetRenderLineMethod();
|
||||||
|
}
|
||||||
|
|
||||||
renderer->SDR_white_point = 1.0f;
|
renderer->SDR_white_point = 1.0f;
|
||||||
renderer->HDR_headroom = 1.0f;
|
renderer->HDR_headroom = 1.0f;
|
||||||
|
@ -1032,11 +1044,15 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
SDL_SetNumberProperty(new_props, SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER, renderer->output_colorspace);
|
SDL_SetNumberProperty(new_props, SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER, renderer->output_colorspace);
|
||||||
UpdateHDRProperties(renderer);
|
UpdateHDRProperties(renderer);
|
||||||
|
|
||||||
SDL_SetProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_RENDERER_POINTER, renderer);
|
if (window) {
|
||||||
|
SDL_SetProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_RENDERER_POINTER, renderer);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_SetRenderViewport(renderer, NULL);
|
SDL_SetRenderViewport(renderer, NULL);
|
||||||
|
|
||||||
SDL_AddEventWatch(SDL_RendererEventWatch, renderer);
|
if (window) {
|
||||||
|
SDL_AddEventWatch(SDL_RendererEventWatch, renderer);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,
|
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,
|
||||||
"Created renderer: %s", renderer->info.name);
|
"Created renderer: %s", renderer->info.name);
|
||||||
|
@ -1081,31 +1097,10 @@ SDL_Renderer *SDL_CreateSoftwareRenderer(SDL_Surface *surface)
|
||||||
{
|
{
|
||||||
#if SDL_VIDEO_RENDER_SW
|
#if SDL_VIDEO_RENDER_SW
|
||||||
SDL_Renderer *renderer;
|
SDL_Renderer *renderer;
|
||||||
|
SDL_PropertiesID props = SDL_CreateProperties();
|
||||||
renderer = SW_CreateRendererForSurface(surface);
|
SDL_SetProperty(props, SDL_PROP_RENDERER_CREATE_SURFACE_POINTER, surface);
|
||||||
|
renderer = SDL_CreateRendererWithProperties(props);
|
||||||
if (renderer) {
|
SDL_DestroyProperties(props);
|
||||||
VerifyDrawQueueFunctions(renderer);
|
|
||||||
renderer->magic = &SDL_renderer_magic;
|
|
||||||
renderer->target_mutex = SDL_CreateMutex();
|
|
||||||
renderer->main_view.pixel_w = surface->w;
|
|
||||||
renderer->main_view.pixel_h = surface->h;
|
|
||||||
renderer->main_view.viewport.w = -1;
|
|
||||||
renderer->main_view.viewport.h = -1;
|
|
||||||
renderer->main_view.scale.x = 1.0f;
|
|
||||||
renderer->main_view.scale.y = 1.0f;
|
|
||||||
renderer->view = &renderer->main_view;
|
|
||||||
renderer->dpi_scale.x = 1.0f;
|
|
||||||
renderer->dpi_scale.y = 1.0f;
|
|
||||||
|
|
||||||
/* new textures start at zero, so we start at 1 so first render doesn't flush by accident. */
|
|
||||||
renderer->render_command_generation = 1;
|
|
||||||
|
|
||||||
/* Software renderer always uses line method, for speed */
|
|
||||||
renderer->line_method = SDL_RENDERLINEMETHOD_LINES;
|
|
||||||
|
|
||||||
SDL_SetRenderViewport(renderer, NULL);
|
|
||||||
}
|
|
||||||
return renderer;
|
return renderer;
|
||||||
#else
|
#else
|
||||||
SDL_SetError("SDL not built with rendering support");
|
SDL_SetError("SDL not built with rendering support");
|
||||||
|
|
|
@ -1116,7 +1116,7 @@ static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormatEnum for
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface)
|
SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface, SDL_PropertiesID create_props)
|
||||||
{
|
{
|
||||||
SDL_Renderer *renderer;
|
SDL_Renderer *renderer;
|
||||||
SW_RenderData *data;
|
SW_RenderData *data;
|
||||||
|
@ -1168,12 +1168,19 @@ SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface)
|
||||||
|
|
||||||
SW_SelectBestFormats(renderer, surface->format->format);
|
SW_SelectBestFormats(renderer, surface->format->format);
|
||||||
|
|
||||||
|
SDL_SetupRendererColorspace(renderer, create_props);
|
||||||
|
|
||||||
|
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
||||||
|
SDL_SetError("Unsupported output colorspace");
|
||||||
|
SW_DestroyRenderer(renderer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props)
|
static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props)
|
||||||
{
|
{
|
||||||
SDL_Renderer *renderer;
|
|
||||||
const char *hint;
|
const char *hint;
|
||||||
SDL_Surface *surface;
|
SDL_Surface *surface;
|
||||||
SDL_bool no_hint_set;
|
SDL_bool no_hint_set;
|
||||||
|
@ -1205,20 +1212,7 @@ static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer = SW_CreateRendererForSurface(surface);
|
return SW_CreateRendererForSurface(surface, create_props);
|
||||||
if (!renderer) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_SetupRendererColorspace(renderer, create_props);
|
|
||||||
|
|
||||||
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
|
||||||
SDL_SetError("Unsupported output colorspace");
|
|
||||||
SW_DestroyRenderer(renderer);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return renderer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_RenderDriver SW_RenderDriver = {
|
SDL_RenderDriver SW_RenderDriver = {
|
||||||
|
|
|
@ -22,6 +22,6 @@
|
||||||
#ifndef SDL_render_sw_c_h_
|
#ifndef SDL_render_sw_c_h_
|
||||||
#define SDL_render_sw_c_h_
|
#define SDL_render_sw_c_h_
|
||||||
|
|
||||||
extern SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface);
|
extern SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface, SDL_PropertiesID create_props);
|
||||||
|
|
||||||
#endif /* SDL_render_sw_c_h_ */
|
#endif /* SDL_render_sw_c_h_ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue