mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-17 15:21:43 +00:00
Fixed memory leak if the GPU renderer can't be initialized
DestroyRenderer needs to be set before we return false from GPU_CreateRenderer()
This commit is contained in:
@@ -1170,20 +1170,40 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
|||||||
{
|
{
|
||||||
GPU_RenderData *data = NULL;
|
GPU_RenderData *data = NULL;
|
||||||
|
|
||||||
|
SDL_SetupRendererColorspace(renderer, create_props);
|
||||||
|
|
||||||
|
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
||||||
|
// TODO
|
||||||
|
return SDL_SetError("Unsupported output colorspace");
|
||||||
|
}
|
||||||
|
|
||||||
data = (GPU_RenderData *)SDL_calloc(1, sizeof(*data));
|
data = (GPU_RenderData *)SDL_calloc(1, sizeof(*data));
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer->SupportsBlendMode = GPU_SupportsBlendMode;
|
||||||
|
renderer->CreateTexture = GPU_CreateTexture;
|
||||||
|
renderer->UpdateTexture = GPU_UpdateTexture;
|
||||||
|
renderer->LockTexture = GPU_LockTexture;
|
||||||
|
renderer->UnlockTexture = GPU_UnlockTexture;
|
||||||
|
renderer->SetTextureScaleMode = GPU_SetTextureScaleMode;
|
||||||
|
renderer->SetRenderTarget = GPU_SetRenderTarget;
|
||||||
|
renderer->QueueSetViewport = GPU_QueueNoOp;
|
||||||
|
renderer->QueueSetDrawColor = GPU_QueueNoOp;
|
||||||
|
renderer->QueueDrawPoints = GPU_QueueDrawPoints;
|
||||||
|
renderer->QueueDrawLines = GPU_QueueDrawPoints; // lines and points queue vertices the same way.
|
||||||
|
renderer->QueueGeometry = GPU_QueueGeometry;
|
||||||
|
renderer->InvalidateCachedState = GPU_InvalidateCachedState;
|
||||||
|
renderer->RunCommandQueue = GPU_RunCommandQueue;
|
||||||
|
renderer->RenderReadPixels = GPU_RenderReadPixels;
|
||||||
|
renderer->RenderPresent = GPU_RenderPresent;
|
||||||
|
renderer->DestroyTexture = GPU_DestroyTexture;
|
||||||
|
renderer->DestroyRenderer = GPU_DestroyRenderer;
|
||||||
|
renderer->SetVSync = GPU_SetVSync;
|
||||||
renderer->internal = data;
|
renderer->internal = data;
|
||||||
|
renderer->window = window;
|
||||||
SDL_SetupRendererColorspace(renderer, create_props);
|
renderer->name = GPU_RenderDriver.name;
|
||||||
|
|
||||||
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
|
||||||
// TODO
|
|
||||||
SDL_SetError("Unsupported output colorspace");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool debug = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL, false);
|
bool debug = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL, false);
|
||||||
bool lowpower = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL, false);
|
bool lowpower = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL, false);
|
||||||
@@ -1219,29 +1239,6 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->SupportsBlendMode = GPU_SupportsBlendMode;
|
|
||||||
renderer->CreateTexture = GPU_CreateTexture;
|
|
||||||
renderer->UpdateTexture = GPU_UpdateTexture;
|
|
||||||
renderer->LockTexture = GPU_LockTexture;
|
|
||||||
renderer->UnlockTexture = GPU_UnlockTexture;
|
|
||||||
renderer->SetTextureScaleMode = GPU_SetTextureScaleMode;
|
|
||||||
renderer->SetRenderTarget = GPU_SetRenderTarget;
|
|
||||||
renderer->QueueSetViewport = GPU_QueueNoOp;
|
|
||||||
renderer->QueueSetDrawColor = GPU_QueueNoOp;
|
|
||||||
renderer->QueueDrawPoints = GPU_QueueDrawPoints;
|
|
||||||
renderer->QueueDrawLines = GPU_QueueDrawPoints; // lines and points queue vertices the same way.
|
|
||||||
renderer->QueueGeometry = GPU_QueueGeometry;
|
|
||||||
renderer->InvalidateCachedState = GPU_InvalidateCachedState;
|
|
||||||
renderer->RunCommandQueue = GPU_RunCommandQueue;
|
|
||||||
renderer->RenderReadPixels = GPU_RenderReadPixels;
|
|
||||||
renderer->RenderPresent = GPU_RenderPresent;
|
|
||||||
renderer->DestroyTexture = GPU_DestroyTexture;
|
|
||||||
renderer->DestroyRenderer = GPU_DestroyRenderer;
|
|
||||||
renderer->SetVSync = GPU_SetVSync;
|
|
||||||
GPU_InvalidateCachedState(renderer);
|
|
||||||
renderer->window = window;
|
|
||||||
renderer->name = GPU_RenderDriver.name;
|
|
||||||
|
|
||||||
if (!SDL_ClaimGPUWindow(data->device, window)) {
|
if (!SDL_ClaimGPUWindow(data->device, window)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user