From 202528a48f9d716fc3b8e432d347b4cc917b8d5c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 28 Sep 2013 14:07:17 -0700 Subject: [PATCH] Call AddRef() on the device so it doesn't accidentally get released from underneath the caller. --- include/SDL_system.h | 4 +++- src/render/direct3d/SDL_render_d3d.c | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/SDL_system.h b/include/SDL_system.h index 1ca607fbf..9af2a4c2c 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -49,7 +49,9 @@ extern "C" { */ extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); -/* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. */ +/* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. + Once you are done using the device, you should release it to avoid a resource leak. + */ typedef struct IDirect3DDevice9 IDirect3DDevice9; extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 36205eb87..33665e370 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1887,13 +1887,19 @@ IDirect3DDevice9 * SDL_RenderGetD3D9Device(SDL_Renderer * renderer) { D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; + IDirect3DDevice9 *device; // Make sure that this is a D3D renderer if (renderer->DestroyRenderer != D3D_DestroyRenderer) { SDL_SetError("Renderer is not a D3D renderer"); return NULL; } - return data->device; + + device = data->device; + if (device) { + IDirect3DDevice9_AddRef( device ); + } + return device; } #endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */