render: Manage memory for SDL_Renderer* at higher level.

Previously, each backend would allocate and free the renderer struct. Now
the higher level does it, so the backends only manage their private resources.

This removes some boilerplate and avoids some potential accidents.

(Manually cherry-picked from 39c8434f5f)

Reference Issue #10174.
This commit is contained in:
Ryan C. Gordon
2024-07-04 18:17:20 -04:00
parent 845ebbbe96
commit 944dc4701c
14 changed files with 93 additions and 190 deletions

View File

@@ -987,30 +987,20 @@ static void SW_DestroyRenderer(SDL_Renderer *renderer)
SDL_DestroyWindowSurface(window);
}
SDL_free(data);
SDL_free(renderer);
}
SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface)
int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface)
{
SDL_Renderer *renderer;
SW_RenderData *data;
if (!surface) {
SDL_InvalidParamError("surface");
return NULL;
}
renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer));
if (!renderer) {
SDL_OutOfMemory();
return NULL;
return SDL_InvalidParamError("surface");
}
data = (SW_RenderData *)SDL_calloc(1, sizeof(*data));
if (!data) {
SW_DestroyRenderer(renderer);
SDL_OutOfMemory();
return NULL;
return SDL_OutOfMemory();
}
data->surface = surface;
data->window = surface;
@@ -1039,10 +1029,10 @@ SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface)
renderer->info = SW_RenderDriver.info;
renderer->driverdata = data;
return renderer;
return 0;
}
static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, Uint32 flags)
static int SW_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32 flags)
{
const char *hint;
SDL_Surface *surface;
@@ -1068,9 +1058,9 @@ static SDL_Renderer *SW_CreateRenderer(SDL_Window *window, Uint32 flags)
}
if (!surface) {
return NULL;
return -1;
}
return SW_CreateRendererForSurface(surface);
return SW_CreateRendererForSurface(renderer, surface);
}
SDL_RenderDriver SW_RenderDriver = {

View File

@@ -22,7 +22,7 @@
#ifndef SDL_render_sw_c_h_
#define SDL_render_sw_c_h_
extern SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface);
extern int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface);
#endif /* SDL_render_sw_c_h_ */