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 */