Call AddRef() on the device so it doesn't accidentally get released from underneath the caller.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
diff --git a/include/SDL_system.h b/include/SDL_system.h
index 1ca607f..9af2a4c 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 36205eb..33665e3 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 */