mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-05-28 15:39:10 +00:00
Do a full cleanup if renderer creation fails during autodetection
This commit is contained in:
parent
ebd059e6eb
commit
95dd8781ce
10 changed files with 5 additions and 26 deletions
|
@ -1029,6 +1029,7 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
break; // Yay, we got one!
|
break; // Yay, we got one!
|
||||||
}
|
}
|
||||||
|
SDL_DestroyRendererWithoutFreeing(renderer);
|
||||||
SDL_zerop(renderer); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct.
|
SDL_zerop(renderer); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1703,7 +1703,6 @@ int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propertie
|
||||||
|
|
||||||
result = IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps);
|
result = IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
D3D_DestroyRenderer(renderer);
|
|
||||||
return D3D_SetError("GetDeviceCaps()", result);
|
return D3D_SetError("GetDeviceCaps()", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1724,20 +1723,17 @@ int D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propertie
|
||||||
device_flags,
|
device_flags,
|
||||||
&pparams, &data->device);
|
&pparams, &data->device);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
D3D_DestroyRenderer(renderer);
|
|
||||||
return D3D_SetError("CreateDevice()", result);
|
return D3D_SetError("CreateDevice()", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get presentation parameters to fill info */
|
/* Get presentation parameters to fill info */
|
||||||
result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain);
|
result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
D3D_DestroyRenderer(renderer);
|
|
||||||
return D3D_SetError("GetSwapChain()", result);
|
return D3D_SetError("GetSwapChain()", result);
|
||||||
}
|
}
|
||||||
result = IDirect3DSwapChain9_GetPresentParameters(chain, &pparams);
|
result = IDirect3DSwapChain9_GetPresentParameters(chain, &pparams);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
IDirect3DSwapChain9_Release(chain);
|
IDirect3DSwapChain9_Release(chain);
|
||||||
D3D_DestroyRenderer(renderer);
|
|
||||||
return D3D_SetError("GetPresentParameters()", result);
|
return D3D_SetError("GetPresentParameters()", result);
|
||||||
}
|
}
|
||||||
IDirect3DSwapChain9_Release(chain);
|
IDirect3DSwapChain9_Release(chain);
|
||||||
|
|
|
@ -421,8 +421,8 @@ static void D3D11_ReleaseAll(SDL_Renderer *renderer)
|
||||||
static void D3D11_DestroyRenderer(SDL_Renderer *renderer)
|
static void D3D11_DestroyRenderer(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
|
D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
|
||||||
D3D11_ReleaseAll(renderer);
|
|
||||||
if (data) {
|
if (data) {
|
||||||
|
D3D11_ReleaseAll(renderer);
|
||||||
SDL_free(data);
|
SDL_free(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -744,7 +744,7 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create samplers to use when drawing textures: */
|
/* Create samplers to use when drawing textures: */
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
D3D11_FILTER filter;
|
D3D11_FILTER filter;
|
||||||
D3D11_TEXTURE_ADDRESS_MODE address;
|
D3D11_TEXTURE_ADDRESS_MODE address;
|
||||||
|
@ -2880,11 +2880,9 @@ static int D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
|
||||||
|
|
||||||
/* Initialize Direct3D resources */
|
/* Initialize Direct3D resources */
|
||||||
if (FAILED(D3D11_CreateDeviceResources(renderer))) {
|
if (FAILED(D3D11_CreateDeviceResources(renderer))) {
|
||||||
D3D11_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) {
|
if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) {
|
||||||
D3D11_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -644,9 +644,9 @@ static int D3D12_IssueBatch(D3D12_RenderData *data)
|
||||||
static void D3D12_DestroyRenderer(SDL_Renderer *renderer)
|
static void D3D12_DestroyRenderer(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
|
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
|
||||||
D3D12_WaitForGPU(data);
|
|
||||||
D3D12_ReleaseAll(renderer);
|
|
||||||
if (data) {
|
if (data) {
|
||||||
|
D3D12_WaitForGPU(data);
|
||||||
|
D3D12_ReleaseAll(renderer);
|
||||||
SDL_free(data);
|
SDL_free(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3343,11 +3343,9 @@ int D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Propert
|
||||||
|
|
||||||
/* Initialize Direct3D resources */
|
/* Initialize Direct3D resources */
|
||||||
if (FAILED(D3D12_CreateDeviceResources(renderer))) {
|
if (FAILED(D3D12_CreateDeviceResources(renderer))) {
|
||||||
D3D12_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (FAILED(D3D12_CreateWindowSizeDependentResources(renderer))) {
|
if (FAILED(D3D12_CreateWindowSizeDependentResources(renderer))) {
|
||||||
D3D12_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1698,12 +1698,10 @@ static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
|
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GL_LoadFunctions(data) < 0) {
|
if (GL_LoadFunctions(data) < 0) {
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1819,7 +1817,6 @@ static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
|
||||||
SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
|
SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
|
||||||
} else {
|
} else {
|
||||||
SDL_SetError("Can't create render targets, GL_EXT_framebuffer_object not available");
|
SDL_SetError("Can't create render targets, GL_EXT_framebuffer_object not available");
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1847,7 +1844,6 @@ static int GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pro
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
SDL_free(data);
|
|
||||||
if (changed_window) {
|
if (changed_window) {
|
||||||
/* Uh oh, better try to put it back... */
|
/* Uh oh, better try to put it back... */
|
||||||
char *error = SDL_strdup(SDL_GetError());
|
char *error = SDL_strdup(SDL_GetError());
|
||||||
|
|
|
@ -2133,17 +2133,14 @@ static int GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
|
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLES2_LoadFunctions(data) < 0) {
|
if (GLES2_LoadFunctions(data) < 0) {
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLES2_CacheShaders(data) < 0) {
|
if (GLES2_CacheShaders(data) < 0) {
|
||||||
SDL_GL_DestroyContext(data->context);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2237,7 +2234,6 @@ static int GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
SDL_free(data);
|
|
||||||
if (changed_window) {
|
if (changed_window) {
|
||||||
/* Uh oh, better try to put it back... */
|
/* Uh oh, better try to put it back... */
|
||||||
char *error = SDL_strdup(SDL_GetError());
|
char *error = SDL_strdup(SDL_GetError());
|
||||||
|
|
|
@ -643,7 +643,6 @@ static int PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
|
||||||
SDL_SetupRendererColorspace(renderer, create_props);
|
SDL_SetupRendererColorspace(renderer, create_props);
|
||||||
|
|
||||||
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
||||||
SDL_free(renderer);
|
|
||||||
return SDL_SetError("Unsupported output colorspace");
|
return SDL_SetError("Unsupported output colorspace");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1124,7 +1124,6 @@ int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SD
|
||||||
|
|
||||||
data = (SW_RenderData *)SDL_calloc(1, sizeof(*data));
|
data = (SW_RenderData *)SDL_calloc(1, sizeof(*data));
|
||||||
if (!data) {
|
if (!data) {
|
||||||
SW_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
data->surface = surface;
|
data->surface = surface;
|
||||||
|
@ -1162,7 +1161,6 @@ int SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SD
|
||||||
SDL_SetupRendererColorspace(renderer, create_props);
|
SDL_SetupRendererColorspace(renderer, create_props);
|
||||||
|
|
||||||
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
|
||||||
SW_DestroyRenderer(renderer);
|
|
||||||
return SDL_SetError("Unsupported output colorspace");
|
return SDL_SetError("Unsupported output colorspace");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,6 @@ static int VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, S
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (gxm_init(renderer) != 0) {
|
if (gxm_init(renderer) != 0) {
|
||||||
SDL_free(data);
|
|
||||||
return SDL_SetError("gxm_init failed");
|
return SDL_SetError("gxm_init failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4151,10 +4151,8 @@ static int VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
|
||||||
|
|
||||||
/* Initialize Vulkan resources */
|
/* Initialize Vulkan resources */
|
||||||
if (VULKAN_CreateDeviceResources(renderer, create_props) != VK_SUCCESS) {
|
if (VULKAN_CreateDeviceResources(renderer, create_props) != VK_SUCCESS) {
|
||||||
VULKAN_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
} else if (VULKAN_CreateWindowSizeDependentResources(renderer) != VK_SUCCESS) {
|
} else if (VULKAN_CreateWindowSizeDependentResources(renderer) != VK_SUCCESS) {
|
||||||
VULKAN_DestroyRenderer(renderer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue