diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 8ffe304b4..2131da194 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -900,12 +900,18 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) SDL_Window *window = (SDL_Window *)SDL_GetProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, NULL); SDL_Surface *surface = (SDL_Surface *)SDL_GetProperty(props, SDL_PROP_RENDERER_CREATE_SURFACE_POINTER, NULL); const char *name = SDL_GetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, NULL); - SDL_Renderer *renderer = NULL; const int n = SDL_GetNumRenderDrivers(); const char *hint; int i, attempted = 0; SDL_PropertiesID new_props; + SDL_Renderer *renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); + if (!renderer) { + return NULL; + } + + renderer->magic = &SDL_renderer_magic; + #ifdef SDL_PLATFORM_ANDROID Android_ActivityMutex_Lock_Running(); #endif @@ -932,15 +938,15 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) if (surface) { #if SDL_VIDEO_RENDER_SW - renderer = SW_CreateRendererForSurface(surface, props); + const int rc = SW_CreateRendererForSurface(renderer, surface, props); #else - renderer = NULL; - SDL_SetError("SDL not built with software renderer"); + const int rc = SDL_SetError("SDL not built with software renderer"); #endif - if (!renderer) { + if (rc == -1) { goto error; } } else { + int rc = -1; if (!name) { name = SDL_GetHint(SDL_HINT_RENDER_DRIVER); } @@ -949,26 +955,27 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) for (i = 0; i < n; i++) { const SDL_RenderDriver *driver = render_drivers[i]; if (SDL_strcasecmp(name, driver->info.name) == 0) { - /* Create a new renderer instance */ + // Create a new renderer instance ++attempted; - renderer = driver->CreateRenderer(window, props); + rc = driver->CreateRenderer(renderer, 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; - renderer = driver->CreateRenderer(window, props); - if (renderer) { - /* Yay, we got one! */ - break; + rc = driver->CreateRenderer(renderer, window, props); + if (rc == 0) { + break; // Yay, we got one! } + SDL_zerop(renderer); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct. + renderer->magic = &SDL_renderer_magic; } } - if (!renderer) { + if (rc == -1) { if (!name || !attempted) { SDL_SetError("Couldn't find matching render driver"); } @@ -1072,6 +1079,7 @@ error: #ifdef SDL_PLATFORM_ANDROID Android_ActivityMutex_Unlock(); #endif + SDL_free(renderer); return NULL; #else @@ -4522,7 +4530,6 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer) /* Free existing textures for this renderer */ while (renderer->textures) { SDL_Texture *tex = renderer->textures; - (void)tex; SDL_DestroyTextureInternal(renderer->textures, SDL_TRUE /* is_destroying */); SDL_assert(tex != renderer->textures); /* satisfy static analysis. */ } @@ -4540,8 +4547,10 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer) SDL_DestroyMutex(renderer->target_mutex); renderer->target_mutex = NULL; - /* Free the renderer instance */ + /* Clean up renderer-specific resources */ renderer->DestroyRenderer(renderer); + + SDL_free(renderer); } void *SDL_GetRenderMetalLayer(SDL_Renderer *renderer) diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index 6ff18020f..3ab7a269a 100644 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -295,7 +295,7 @@ struct SDL_Renderer /* Define the SDL render driver structure */ struct SDL_RenderDriver { - SDL_Renderer *(*CreateRenderer)(SDL_Window *window, SDL_PropertiesID props); + int (*CreateRenderer)(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID props); /* Info about the renderer capabilities */ SDL_RendererInfo info; diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 9384bd6d0..51d4c4bad 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1469,7 +1469,6 @@ static void D3D_DestroyRenderer(SDL_Renderer *renderer) } SDL_free(data); } - SDL_free(renderer); } static int D3D_Reset(SDL_Renderer *renderer) @@ -1567,9 +1566,8 @@ static int D3D_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; D3D_RenderData *data; HRESULT result; D3DPRESENT_PARAMETERS pparams; @@ -1580,31 +1578,20 @@ SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_pro SDL_DisplayID displayID; const SDL_DisplayMode *fullscreen_mode = NULL; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (D3D_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - SDL_free(renderer); - return NULL; + return -1; } if (!D3D_LoadDLL(&data->d3dDLL, &data->d3d)) { - SDL_SetError("Unable to create Direct3D interface"); - SDL_free(renderer); SDL_free(data); - return NULL; + return SDL_SetError("Unable to create Direct3D interface"); } renderer->WindowEvent = D3D_WindowEvent; @@ -1685,23 +1672,20 @@ SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_pro &pparams, &data->device); if (FAILED(result)) { D3D_DestroyRenderer(renderer); - D3D_SetError("CreateDevice()", result); - return NULL; + return D3D_SetError("CreateDevice()", result); } /* Get presentation parameters to fill info */ result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain); if (FAILED(result)) { D3D_DestroyRenderer(renderer); - D3D_SetError("GetSwapChain()", result); - return NULL; + return D3D_SetError("GetSwapChain()", result); } result = IDirect3DSwapChain9_GetPresentParameters(chain, &pparams); if (FAILED(result)) { IDirect3DSwapChain9_Release(chain); D3D_DestroyRenderer(renderer); - D3D_SetError("GetPresentParameters()", result); - return NULL; + return D3D_SetError("GetPresentParameters()", result); } IDirect3DSwapChain9_Release(chain); if (pparams.PresentationInterval == D3DPRESENT_INTERVAL_ONE) { @@ -1741,7 +1725,7 @@ SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_pro SDL_SetProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D9_DEVICE_POINTER, data->device); - return renderer; + return 0; } SDL_RenderDriver D3D_RenderDriver = { diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 8498d3741..14e4ac334 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -413,7 +413,6 @@ static void D3D11_DestroyRenderer(SDL_Renderer *renderer) if (data) { SDL_free(data); } - SDL_free(renderer); } static D3D11_BLEND GetBlendFunc(SDL_BlendFactor factor) @@ -2741,31 +2740,21 @@ static int D3D11_SetVSync(SDL_Renderer *renderer, const int vsync) } #endif -SDL_Renderer *D3D11_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; D3D11_RenderData *data; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB && renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR /*&& renderer->output_colorspace != SDL_COLORSPACE_HDR10*/) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (D3D11_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - SDL_free(renderer); - return NULL; + return -1; } data->identity = MatrixIdentity(); @@ -2825,14 +2814,14 @@ SDL_Renderer *D3D11_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_p /* Initialize Direct3D resources */ if (FAILED(D3D11_CreateDeviceResources(renderer))) { D3D11_DestroyRenderer(renderer); - return NULL; + return -1; } if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) { D3D11_DestroyRenderer(renderer); - return NULL; + return -1; } - return renderer; + return 0; } SDL_RenderDriver D3D11_RenderDriver = { diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 74d08a45b..f74c68657 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -587,7 +587,6 @@ static void D3D12_DestroyRenderer(SDL_Renderer *renderer) if (data) { SDL_free(data); } - SDL_free(renderer); } static D3D12_BLEND GetBlendFunc(SDL_BlendFactor factor) @@ -3173,37 +3172,26 @@ static int D3D12_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -SDL_Renderer *D3D12_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +int D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; D3D12_RenderData *data; if (SDL_GetWindowFlags(window) & SDL_WINDOW_TRANSPARENT) { /* D3D12 removed the swap effect needed to support transparent windows, use D3D11 instead */ - SDL_SetError("The direct3d12 renderer doesn't work with transparent windows"); - return NULL; + return SDL_SetError("The direct3d12 renderer doesn't work with transparent windows"); } - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB && renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR /*&& renderer->output_colorspace != SDL_COLORSPACE_HDR10*/) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (D3D12_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - SDL_free(renderer); - return NULL; + return -1; } data->identity = MatrixIdentity(); @@ -3248,14 +3236,14 @@ SDL_Renderer *D3D12_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_p /* Initialize Direct3D resources */ if (FAILED(D3D12_CreateDeviceResources(renderer))) { D3D12_DestroyRenderer(renderer); - return NULL; + return -1; } if (FAILED(D3D12_CreateWindowSizeDependentResources(renderer))) { D3D12_DestroyRenderer(renderer); - return NULL; + return -1; } - return renderer; + return 0; } SDL_RenderDriver D3D12_RenderDriver = { diff --git a/src/render/metal/SDL_render_metal.m b/src/render/metal/SDL_render_metal.m index 51b1c9591..81d1edb60 100644 --- a/src/render/metal/SDL_render_metal.m +++ b/src/render/metal/SDL_render_metal.m @@ -1800,8 +1800,6 @@ static void METAL_DestroyRenderer(SDL_Renderer *renderer) /* SDL_Metal_DestroyView(data.mtlview); */ CFBridgingRelease(data.mtlview); } - - SDL_free(renderer); } } @@ -1874,10 +1872,9 @@ static SDL_MetalView GetWindowView(SDL_Window *window) return nil; } -static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { @autoreleasepool { - SDL_Renderer *renderer = NULL; METAL_RenderData *data = NULL; id mtldevice = nil; SDL_MetalView view = NULL; @@ -1939,15 +1936,9 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c const size_t YCbCr_shader_matrix_size = 4 * 4 * sizeof(float); if (!IsMetalAvailable()) { - return NULL; + return -1; } - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); #ifndef SDL_PLATFORM_TVOS @@ -1959,9 +1950,7 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR && scRGB_supported) { /* This colorspace is supported */ } else { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } } @@ -1983,9 +1972,7 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c } if (mtldevice == nil) { - SDL_free(renderer); - SDL_SetError("Failed to obtain Metal device"); - return NULL; + return SDL_SetError("Failed to obtain Metal device"); } view = GetWindowView(window); @@ -1994,8 +1981,7 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c } if (view == NULL) { - SDL_free(renderer); - return NULL; + return -1; } // !!! FIXME: error checking on all of this. @@ -2007,8 +1993,7 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c */ /* SDL_Metal_DestroyView(view); */ CFBridgingRelease(view); - SDL_free(renderer); - return NULL; + return SDL_SetError("METAL_RenderData alloc/init failed"); } renderer->driverdata = (void *)CFBridgingRetain(data); @@ -2205,7 +2190,7 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window *window, SDL_PropertiesID c renderer->info.max_texture_width = maxtexsize; renderer->info.max_texture_height = maxtexsize; - return renderer; + return 0; } } diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 1b16c5188..82cd82cbd 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -1583,7 +1583,6 @@ static void GL_DestroyRenderer(SDL_Renderer *renderer) } SDL_free(data); } - SDL_free(renderer); } static int GL_SetVSync(SDL_Renderer *renderer, const int vsync) @@ -1612,10 +1611,9 @@ static int GL_SetVSync(SDL_Renderer *renderer, const int vsync) return retval; } -static SDL_Renderer *GL_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; - GL_RenderData *data; + GL_RenderData *data = NULL; GLint value; SDL_WindowFlags window_flags; int profile_mask = 0, major = 0, minor = 0; @@ -1644,22 +1642,15 @@ static SDL_Renderer *GL_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea } #endif - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - goto error; - } - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); goto error; } data = (GL_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - SDL_free(renderer); goto error; } @@ -1695,21 +1686,15 @@ static SDL_Renderer *GL_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea data->context = SDL_GL_CreateContext(window); if (!data->context) { - SDL_free(renderer); - SDL_free(data); goto error; } if (SDL_GL_MakeCurrent(window, data->context) < 0) { SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } if (GL_LoadFunctions(data) < 0) { SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } @@ -1844,8 +1829,6 @@ static SDL_Renderer *GL_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea } else { SDL_SetError("Can't create render targets, GL_EXT_framebuffer_object not available"); SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } @@ -1870,9 +1853,10 @@ static SDL_Renderer *GL_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea data->drawstate.clear_color.b = 1.0f; data->drawstate.clear_color.a = 1.0f; - return renderer; + return 0; error: + SDL_free(data); if (changed_window) { /* Uh oh, better try to put it back... */ char *error = SDL_strdup(SDL_GetError()); @@ -1883,7 +1867,7 @@ error: SDL_SetError("%s", error); SDL_free(error); } - return NULL; + return -1; } SDL_RenderDriver GL_RenderDriver = { diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index 2c0aa42ec..294317237 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -1445,7 +1445,6 @@ static void GLES2_DestroyRenderer(SDL_Renderer *renderer) SDL_free(data); } - SDL_free(renderer); } static int GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props) @@ -2041,10 +2040,9 @@ static int GLES2_SetVSync(SDL_Renderer *renderer, const int vsync) * Renderer instantiation * *************************************************************************************************/ -static SDL_Renderer *GLES2_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; - GLES2_RenderData *data; + GLES2_RenderData *data = NULL; SDL_WindowFlags window_flags = 0; /* -Wconditional-uninitialized */ GLint window_framebuffer; GLint value; @@ -2078,24 +2076,15 @@ static SDL_Renderer *GLES2_CreateRenderer(SDL_Window *window, SDL_PropertiesID c } } - /* Create the renderer struct */ - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(SDL_Renderer)); - if (!renderer) { - goto error; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); goto error; } data = (GLES2_RenderData *)SDL_calloc(1, sizeof(GLES2_RenderData)); if (!data) { - SDL_free(renderer); goto error; } renderer->info = GLES2_RenderDriver.info; @@ -2106,28 +2095,20 @@ static SDL_Renderer *GLES2_CreateRenderer(SDL_Window *window, SDL_PropertiesID c /* Create an OpenGL ES 2.0 context */ data->context = SDL_GL_CreateContext(window); if (!data->context) { - SDL_free(renderer); - SDL_free(data); goto error; } if (SDL_GL_MakeCurrent(window, data->context) < 0) { SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } if (GLES2_LoadFunctions(data) < 0) { SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } if (GLES2_CacheShaders(data) < 0) { SDL_GL_DeleteContext(data->context); - SDL_free(renderer); - SDL_free(data); goto error; } @@ -2244,9 +2225,10 @@ static SDL_Renderer *GLES2_CreateRenderer(SDL_Window *window, SDL_PropertiesID c GL_CheckError("", renderer); - return renderer; + return 0; error: + SDL_free(data); if (changed_window) { /* Uh oh, better try to put it back... */ char *error = SDL_strdup(SDL_GetError()); @@ -2257,7 +2239,7 @@ error: SDL_SetError("%s", error); SDL_free(error); } - return NULL; + return -1; } SDL_RenderDriver GLES2_RenderDriver = { diff --git a/src/render/ps2/SDL_render_ps2.c b/src/render/ps2/SDL_render_ps2.c index 32267fc27..978190efd 100644 --- a/src/render/ps2/SDL_render_ps2.c +++ b/src/render/ps2/SDL_render_ps2.c @@ -602,8 +602,6 @@ static void PS2_DestroyRenderer(SDL_Renderer *renderer) if (vsync_sema_id >= 0) { DeleteSema(vsync_sema_id); } - - SDL_free(renderer); } static int PS2_SetVSync(SDL_Renderer *renderer, const int vsync) @@ -614,32 +612,23 @@ static int PS2_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -static SDL_Renderer *PS2_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; PS2_RenderData *data; GSGLOBAL *gsGlobal; ee_sema_t sema; SDL_bool dynamicVsync; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (PS2_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - PS2_DestroyRenderer(renderer); - return NULL; + return -1; } /* Specific gsKit init */ @@ -711,7 +700,7 @@ static SDL_Renderer *PS2_CreateRenderer(SDL_Window *window, SDL_PropertiesID cre if (data->vsync) { renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; } - return renderer; + return 0; } SDL_RenderDriver PS2_RenderDriver = { diff --git a/src/render/psp/SDL_render_psp.c b/src/render/psp/SDL_render_psp.c index 8ca0f1583..600a98158 100644 --- a/src/render/psp/SDL_render_psp.c +++ b/src/render/psp/SDL_render_psp.c @@ -1277,7 +1277,6 @@ static void PSP_DestroyRenderer(SDL_Renderer *renderer) data->displayListAvail = SDL_FALSE; SDL_free(data); } - SDL_free(renderer); } static int PSP_SetVSync(SDL_Renderer *renderer, const int vsync) @@ -1287,31 +1286,21 @@ static int PSP_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -SDL_Renderer *PSP_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; PSP_RenderData *data; int pixelformat; void *doublebuffer = NULL; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (PSP_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { - PSP_DestroyRenderer(renderer); - return NULL; + return -1; } renderer->WindowEvent = PSP_WindowEvent; @@ -1406,7 +1395,7 @@ SDL_Renderer *PSP_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_pro if (data->vsync) { renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; } - return renderer; + return 0; } SDL_RenderDriver PSP_RenderDriver = { diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index 6c6fef331..552a76109 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -1018,7 +1018,6 @@ static void SW_DestroyRenderer(SDL_Renderer *renderer) SDL_DestroyWindowSurface(window); } SDL_free(data); - SDL_free(renderer); } static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormatEnum format) @@ -1116,27 +1115,20 @@ static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormatEnum for } } -SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface, SDL_PropertiesID create_props) +int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; SW_RenderData *data; if (!surface) { - SDL_InvalidParamError("surface"); - return NULL; + return SDL_InvalidParamError("surface"); } - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; renderer->software = SDL_TRUE; data = (SW_RenderData *)SDL_calloc(1, sizeof(*data)); if (!data) { SW_DestroyRenderer(renderer); - return NULL; + return -1; } data->surface = surface; data->window = surface; @@ -1172,27 +1164,18 @@ SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface, SDL_PropertiesID SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); SW_DestroyRenderer(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } - return renderer; + return 0; } -static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int SW_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - const char *hint; - SDL_Surface *surface; - SDL_bool no_hint_set; - /* Set the vsync hint based on our flags, if it's not already set */ - hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC); - if (!hint || !*hint) { - no_hint_set = SDL_TRUE; - } else { - no_hint_set = SDL_FALSE; - } + const char *hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC); + const SDL_bool no_hint_set = (!hint || !*hint); if (no_hint_set) { if (SDL_GetBooleanProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_BOOLEAN, SDL_FALSE)) { @@ -1202,7 +1185,7 @@ static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea } } - surface = SDL_GetWindowSurface(window); + SDL_Surface *surface = SDL_GetWindowSurface(window); /* Reset the vsync hint if we set it above */ if (no_hint_set) { @@ -1210,10 +1193,10 @@ static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, SDL_PropertiesID crea } if (!surface) { - return NULL; + return -1; } - return SW_CreateRendererForSurface(surface, create_props); + return SW_CreateRendererForSurface(renderer, surface, create_props); } SDL_RenderDriver SW_RenderDriver = { diff --git a/src/render/software/SDL_render_sw_c.h b/src/render/software/SDL_render_sw_c.h index 40966d181..27eb84ded 100644 --- a/src/render/software/SDL_render_sw_c.h +++ b/src/render/software/SDL_render_sw_c.h @@ -22,6 +22,6 @@ #ifndef SDL_render_sw_c_h_ #define SDL_render_sw_c_h_ -extern SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface, SDL_PropertiesID create_props); +extern int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SDL_PropertiesID create_props); #endif /* SDL_render_sw_c_h_ */ diff --git a/src/render/vitagxm/SDL_render_vita_gxm.c b/src/render/vitagxm/SDL_render_vita_gxm.c index dfd4d3ac1..52cc8eb26 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm.c +++ b/src/render/vitagxm/SDL_render_vita_gxm.c @@ -42,7 +42,7 @@ #include #endif -static SDL_Renderer *VITA_GXM_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props); +static int VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props); static void VITA_GXM_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event); @@ -210,29 +210,19 @@ static int VITA_GXM_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -SDL_Renderer *VITA_GXM_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; VITA_GXM_RenderData *data; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; - SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } data = (VITA_GXM_RenderData *)SDL_calloc(1, sizeof(VITA_GXM_RenderData)); if (!data) { - SDL_free(renderer); - return NULL; + return -1; } renderer->WindowEvent = VITA_GXM_WindowEvent; @@ -281,11 +271,10 @@ SDL_Renderer *VITA_GXM_CreateRenderer(SDL_Window *window, SDL_PropertiesID creat if (gxm_init(renderer) != 0) { SDL_free(data); - SDL_free(renderer); - return NULL; + return SDL_SetError("gxm_init failed"); } - return renderer; + return 0; } static void VITA_GXM_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event) @@ -1230,7 +1219,6 @@ static void VITA_GXM_DestroyRenderer(SDL_Renderer *renderer) data->drawing = SDL_FALSE; SDL_free(data); } - SDL_free(renderer); } #endif /* SDL_VIDEO_RENDER_VITA_GXM */ diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index 65c7baa11..c230ab9d7 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -1061,14 +1061,13 @@ static VkResult VULKAN_IssueBatch(VULKAN_RenderData *rendererData) static void VULKAN_DestroyRenderer(SDL_Renderer *renderer) { VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->driverdata; - if (rendererData->device != VK_NULL_HANDLE) { - vkDeviceWaitIdle(rendererData->device); - VULKAN_DestroyAll(renderer); - } if (rendererData) { + if (rendererData->device != VK_NULL_HANDLE) { + vkDeviceWaitIdle(rendererData->device); + VULKAN_DestroyAll(renderer); + } SDL_free(rendererData); } - SDL_free(renderer); } static VkBlendFactor GetBlendFactor(SDL_BlendFactor factor) @@ -4037,30 +4036,21 @@ static int VULKAN_SetVSync(SDL_Renderer *renderer, const int vsync) return 0; } -SDL_Renderer *VULKAN_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_props) +static int VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props) { - SDL_Renderer *renderer; VULKAN_RenderData *rendererData; - renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer)); - if (!renderer) { - return NULL; - } - renderer->magic = &SDL_renderer_magic; SDL_SetupRendererColorspace(renderer, create_props); if (renderer->output_colorspace != SDL_COLORSPACE_SRGB && renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR && renderer->output_colorspace != SDL_COLORSPACE_HDR10) { - SDL_SetError("Unsupported output colorspace"); - SDL_free(renderer); - return NULL; + return SDL_SetError("Unsupported output colorspace"); } rendererData = (VULKAN_RenderData *)SDL_calloc(1, sizeof(*rendererData)); if (!rendererData) { - SDL_free(renderer); - return NULL; + return -1; } rendererData->identity = MatrixIdentity(); @@ -4110,11 +4100,10 @@ SDL_Renderer *VULKAN_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_ /* Initialize Vulkan resources */ if (VULKAN_CreateDeviceResources(renderer, create_props) != VK_SUCCESS) { VULKAN_DestroyRenderer(renderer); - return NULL; - } - if (VULKAN_CreateWindowSizeDependentResources(renderer) != VK_SUCCESS) { + return -1; + } else if (VULKAN_CreateWindowSizeDependentResources(renderer) != VK_SUCCESS) { VULKAN_DestroyRenderer(renderer); - return NULL; + return -1; } #if SDL_HAVE_YUV @@ -4127,7 +4116,7 @@ SDL_Renderer *VULKAN_CreateRenderer(SDL_Window *window, SDL_PropertiesID create_ } #endif - return renderer; + return 0; } SDL_RenderDriver VULKAN_RenderDriver = {