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

This commit is contained in:
Sam Lantinga 2013-09-28 14:07:17 -07:00
parent 25f607a3c2
commit 202528a48f
2 changed files with 10 additions and 2 deletions

View File

@ -49,7 +49,9 @@ extern "C" {
*/ */
extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); 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; typedef struct IDirect3DDevice9 IDirect3DDevice9;
extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer);

View File

@ -1887,13 +1887,19 @@ IDirect3DDevice9 *
SDL_RenderGetD3D9Device(SDL_Renderer * renderer) SDL_RenderGetD3D9Device(SDL_Renderer * renderer)
{ {
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
IDirect3DDevice9 *device;
// Make sure that this is a D3D renderer // Make sure that this is a D3D renderer
if (renderer->DestroyRenderer != D3D_DestroyRenderer) { if (renderer->DestroyRenderer != D3D_DestroyRenderer) {
SDL_SetError("Renderer is not a D3D renderer"); SDL_SetError("Renderer is not a D3D renderer");
return NULL; return NULL;
} }
return data->device;
device = data->device;
if (device) {
IDirect3DDevice9_AddRef( device );
}
return device;
} }
#endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */ #endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */