Commit 202528a48f9d716fc3b8e432d347b4cc917b8d5c

Sam Lantinga 2013-09-28T14:07:17

Call AddRef() on the device so it doesn't accidentally get released from underneath the caller.

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