From a1941fad6ceedfa9e90839aaff922a9185e592e9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 7 Nov 2023 10:44:33 -0800 Subject: [PATCH] Replaced SDL_RenderGetD3D11Device(), SDL_RenderGetD3D12Device(), and SDL_RenderGetD3D9Device() with renderer properties. --- docs/README-migration.md | 7 ++-- include/SDL3/SDL_oldnames.h | 8 ---- include/SDL3/SDL_render.h | 5 +++ include/SDL3/SDL_system.h | 52 ------------------------ src/dynapi/SDL_dynapi.sym | 3 -- src/dynapi/SDL_dynapi_overrides.h | 3 -- src/dynapi/SDL_dynapi_procs.h | 3 -- src/render/SDL_render.c | 14 +++---- src/render/SDL_render_unsupported.c | 27 ------------ src/render/SDL_sysrender.h | 2 + src/render/direct3d/SDL_render_d3d.c | 28 ++----------- src/render/direct3d11/SDL_render_d3d11.c | 28 ++----------- src/render/direct3d12/SDL_render_d3d12.c | 33 ++------------- test/testffmpeg.c | 3 +- 14 files changed, 30 insertions(+), 186 deletions(-) diff --git a/docs/README-migration.md b/docs/README-migration.md index 7ddd7fb90..60b9209c7 100644 --- a/docs/README-migration.md +++ b/docs/README-migration.md @@ -1152,9 +1152,10 @@ The following functions have been renamed: SDL_AndroidGetExternalStorageState() takes the state as an output parameter and returns 0 if the function succeeds or a negative error code if there was an error. -The following functions have been renamed: -* SDL_RenderGetD3D11Device() => SDL_GetRenderD3D11Device() -* SDL_RenderGetD3D9Device() => SDL_GetRenderD3D9Device() +The following functions have been removed: +* SDL_RenderGetD3D11Device() - replaced with the "SDL.renderer.d3d11.device" property +* SDL_RenderGetD3D12Device() - replaced with the "SDL.renderer.d3d12.device" property +* SDL_RenderGetD3D9Device() - replaced with the "SDL.renderer.d3d9.device" property ## SDL_syswm.h diff --git a/include/SDL3/SDL_oldnames.h b/include/SDL3/SDL_oldnames.h index bf5fd2a0a..5e266c115 100644 --- a/include/SDL3/SDL_oldnames.h +++ b/include/SDL3/SDL_oldnames.h @@ -462,10 +462,6 @@ #define SDL_UpperBlit SDL_BlitSurface #define SDL_UpperBlitScaled SDL_BlitSurfaceScaled -/* ##SDL_system.h */ -#define SDL_RenderGetD3D11Device SDL_GetRenderD3D11Device -#define SDL_RenderGetD3D9Device SDL_GetRenderD3D9Device - /* ##SDL_thread.h */ #define SDL_TLSCleanup SDL_CleanupTLS #define SDL_TLSCreate SDL_CreateTLS @@ -911,10 +907,6 @@ #define SDL_UpperBlit SDL_UpperBlit_renamed_SDL_BlitSurface #define SDL_UpperBlitScaled SDL_UpperBlitScaled_renamed_SDL_BlitSurfaceScaled -/* ##SDL_system.h */ -#define SDL_RenderGetD3D11Device SDL_RenderGetD3D11Device_renamed_SDL_GetRenderD3D11Device -#define SDL_RenderGetD3D9Device SDL_RenderGetD3D9Device_renamed_SDL_GetRenderD3D9Device - /* ##SDL_thread.h */ #define SDL_TLSCleanup SDL_TLSCleanup_renamed_SDL_CleanupTLS #define SDL_TLSCreate SDL_TLSCreate_renamed_SDL_CreateTLS diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h index 0a58fadf5..9fde47f2c 100644 --- a/include/SDL3/SDL_render.h +++ b/include/SDL3/SDL_render.h @@ -309,6 +309,11 @@ extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer *renderer, SDL_Rend /** * Get the properties associated with a renderer. * + * The following properties are provided by SDL: + * "SDL.renderer.d3d9.device" - the IDirect3DDevice9 associated with the renderer + * "SDL.renderer.d3d11.device" - the ID3D11Device associated with the renderer + * "SDL.renderer.d3d12.device" - the ID3D12Device associated with the renderer + * * \param renderer the rendering context * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. diff --git a/include/SDL3/SDL_system.h b/include/SDL3/SDL_system.h index f2c822112..14a25e00a 100644 --- a/include/SDL3/SDL_system.h +++ b/include/SDL3/SDL_system.h @@ -73,60 +73,8 @@ extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook ca */ extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex(SDL_DisplayID displayID); -typedef struct IDirect3DDevice9 IDirect3DDevice9; - -/** - * Get the D3D9 device associated with a renderer. - * - * Once you are done using the device, you should release it to avoid a - * resource leak. - * - * \param renderer the renderer from which to get the associated D3D device - * \returns the D3D9 device associated with given renderer or NULL if it is - * not a D3D9 renderer; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - */ -extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_GetRenderD3D9Device(SDL_Renderer * renderer); - -typedef struct ID3D11Device ID3D11Device; - -/** - * Get the D3D11 device associated with a renderer. - * - * Once you are done using the device, you should release it to avoid a - * resource leak. - * - * \param renderer the renderer from which to get the associated D3D11 device - * \returns the D3D11 device associated with given renderer or NULL if it is - * not a D3D11 renderer; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - */ -extern DECLSPEC ID3D11Device* SDLCALL SDL_GetRenderD3D11Device(SDL_Renderer * renderer); - #endif /* defined(__WIN32__) || defined(__WINGDK__) */ -#if defined(__WIN32__) || defined(__GDK__) - -typedef struct ID3D12Device ID3D12Device; - -/** - * Get the D3D12 device associated with a renderer. - * - * Once you are done using the device, you should release it to avoid a - * resource leak. - * - * \param renderer the renderer from which to get the associated D3D12 device - * \returns the D3D12 device associated with given renderer or NULL if it is - * not a D3D12 renderer; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - */ -extern DECLSPEC ID3D12Device* SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer* renderer); - -#endif /* defined(__WIN32__) || defined(__GDK__) */ - #if defined(__WIN32__) || defined(__WINGDK__) /** diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym index 651431e67..ea6f8d71f 100644 --- a/src/dynapi/SDL_dynapi.sym +++ b/src/dynapi/SDL_dynapi.sym @@ -286,8 +286,6 @@ SDL3_0.0.0 { SDL_GetRelativeMouseMode; SDL_GetRelativeMouseState; SDL_GetRenderClipRect; - SDL_GetRenderD3D11Device; - SDL_GetRenderD3D9Device; SDL_GetRenderDrawBlendMode; SDL_GetRenderDrawColor; SDL_GetRenderDriver; @@ -522,7 +520,6 @@ SDL3_0.0.0 { SDL_RenderFlush; SDL_RenderGeometry; SDL_RenderGeometryRaw; - SDL_RenderGetD3D12Device; SDL_RenderLine; SDL_RenderLines; SDL_RenderPoint; diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index 08e9878ee..c158f325e 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -310,8 +310,6 @@ #define SDL_GetRelativeMouseMode SDL_GetRelativeMouseMode_REAL #define SDL_GetRelativeMouseState SDL_GetRelativeMouseState_REAL #define SDL_GetRenderClipRect SDL_GetRenderClipRect_REAL -#define SDL_GetRenderD3D11Device SDL_GetRenderD3D11Device_REAL -#define SDL_GetRenderD3D9Device SDL_GetRenderD3D9Device_REAL #define SDL_GetRenderDrawBlendMode SDL_GetRenderDrawBlendMode_REAL #define SDL_GetRenderDrawColor SDL_GetRenderDrawColor_REAL #define SDL_GetRenderDriver SDL_GetRenderDriver_REAL @@ -546,7 +544,6 @@ #define SDL_RenderFlush SDL_RenderFlush_REAL #define SDL_RenderGeometry SDL_RenderGeometry_REAL #define SDL_RenderGeometryRaw SDL_RenderGeometryRaw_REAL -#define SDL_RenderGetD3D12Device SDL_RenderGetD3D12Device_REAL #define SDL_RenderLine SDL_RenderLine_REAL #define SDL_RenderLines SDL_RenderLines_REAL #define SDL_RenderPoint SDL_RenderPoint_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 6943830f1..512056b56 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -67,14 +67,11 @@ SDL_DYNAPI_PROC(SDL_Thread*,SDL_CreateThreadWithStackSize,(SDL_ThreadFunction a, #endif SDL_DYNAPI_PROC(int,SDL_RegisterApp,(const char *a, Uint32 b, void *c),(a,b,c),return) -SDL_DYNAPI_PROC(ID3D12Device*,SDL_RenderGetD3D12Device,(SDL_Renderer *a),(a),return) SDL_DYNAPI_PROC(void,SDL_SetWindowsMessageHook,(SDL_WindowsMessageHook a, void *b),(a,b),) SDL_DYNAPI_PROC(void,SDL_UnregisterApp,(void),(),) SDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(SDL_DisplayID a, int *b, int *c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_Direct3D9GetAdapterIndex,(SDL_DisplayID a),(a),return) -SDL_DYNAPI_PROC(ID3D11Device*,SDL_GetRenderD3D11Device,(SDL_Renderer *a),(a),return) -SDL_DYNAPI_PROC(IDirect3DDevice9*,SDL_GetRenderD3D9Device,(SDL_Renderer *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GDKGetTaskQueue,(XTaskQueueHandle *a),(a),return) SDL_DYNAPI_PROC(void,SDL_GDKSuspendComplete,(void),(),) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 647cb84ff..dbed72f0c 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -46,13 +46,13 @@ this should probably be removed at some point in the future. --ryan. */ #define SDL_WINDOWRENDERDATA "SDL.internal.window.renderer" #define CHECK_RENDERER_MAGIC(renderer, retval) \ - if (!(renderer) || (renderer)->magic != &renderer_magic) { \ + if (!(renderer) || (renderer)->magic != &SDL_renderer_magic) { \ SDL_InvalidParamError("renderer"); \ return retval; \ } #define CHECK_TEXTURE_MAGIC(texture, retval) \ - if (!(texture) || (texture)->magic != &texture_magic) { \ + if (!(texture) || (texture)->magic != &SDL_texture_magic) { \ SDL_InvalidParamError("texture"); \ return retval; \ } @@ -122,8 +122,8 @@ static const SDL_RenderDriver *render_drivers[] = { }; #endif /* !SDL_RENDER_DISABLED */ -static char renderer_magic; -static char texture_magic; +char SDL_renderer_magic; +char SDL_texture_magic; static SDL_INLINE void DebugLogRenderCommands(const SDL_RenderCommand *cmd) { @@ -896,7 +896,7 @@ SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, const char *name, Uint32 fl } renderer->batching = batching; - renderer->magic = &renderer_magic; + renderer->magic = &SDL_renderer_magic; renderer->window = window; renderer->target_mutex = SDL_CreateMutex(); renderer->main_view.viewport.w = -1; @@ -965,7 +965,7 @@ SDL_Renderer *SDL_CreateSoftwareRenderer(SDL_Surface *surface) if (renderer) { VerifyDrawQueueFunctions(renderer); - renderer->magic = &renderer_magic; + renderer->magic = &SDL_renderer_magic; renderer->target_mutex = SDL_CreateMutex(); renderer->main_view.pixel_w = surface->w; renderer->main_view.pixel_h = surface->h; @@ -1150,7 +1150,7 @@ SDL_Texture *SDL_CreateTexture(SDL_Renderer *renderer, Uint32 format, int access SDL_OutOfMemory(); return NULL; } - texture->magic = &texture_magic; + texture->magic = &SDL_texture_magic; texture->format = format; texture->access = access; texture->w = w; diff --git a/src/render/SDL_render_unsupported.c b/src/render/SDL_render_unsupported.c index 4d223895f..89742d4b6 100644 --- a/src/render/SDL_render_unsupported.c +++ b/src/render/SDL_render_unsupported.c @@ -20,30 +20,3 @@ */ #include "SDL_internal.h" -#if !(defined(__WIN32__) || defined(__WINGDK__)) - -DECLSPEC void *SDLCALL SDL_GetRenderD3D9Device(SDL_Renderer *renderer); /* returns IDirect3DDevice9 * */ -void *SDL_GetRenderD3D9Device(SDL_Renderer *renderer) -{ - (void)renderer; - SDL_Unsupported(); - return NULL; -} - -DECLSPEC void *SDLCALL SDL_GetRenderD3D11Device(SDL_Renderer *renderer); /* returns ID3D11Device * */ -void *SDL_GetRenderD3D11Device(SDL_Renderer *renderer) -{ - (void)renderer; - SDL_Unsupported(); - return NULL; -} - -DECLSPEC void *SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer *renderer); /* return ID3D12Device * */ -void *SDL_RenderGetD3D12Device(SDL_Renderer *renderer) -{ - (void)renderer; - SDL_Unsupported(); - return NULL; -} - -#endif diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index afa2f6523..c2624084c 100644 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -44,6 +44,8 @@ typedef struct SDL_DRect /* The SDL 2D rendering system */ typedef struct SDL_RenderDriver SDL_RenderDriver; +extern char SDL_renderer_magic; +extern char SDL_texture_magic; /* Rendering view state */ typedef struct SDL_RenderViewState diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 02c8cb371..cf2046e6c 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1563,6 +1563,7 @@ SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, Uint32 flags) SDL_OutOfMemory(); return NULL; } + renderer->magic = &SDL_renderer_magic; data = (D3D_RenderData *)SDL_calloc(1, sizeof(*data)); if (data == NULL) { @@ -1713,6 +1714,8 @@ SDL_Renderer *D3D_CreateRenderer(SDL_Window *window, Uint32 flags) data->drawstate.cliprect_enabled_dirty = SDL_TRUE; data->drawstate.blend = SDL_BLENDMODE_INVALID; + SDL_SetProperty(SDL_GetRendererProperties(renderer), "SDL.renderer.d3d9.device", data->device, NULL, NULL); + return renderer; } @@ -1726,28 +1729,3 @@ SDL_RenderDriver D3D_RenderDriver = { 0 } }; #endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */ - -#if defined(__WIN32__) || defined(__WINGDK__) -/* This function needs to always exist on Windows, for the Dynamic API. */ -IDirect3DDevice9 *SDL_GetRenderD3D9Device(SDL_Renderer *renderer) -{ - IDirect3DDevice9 *device = NULL; - -#if defined(SDL_VIDEO_RENDER_D3D) && !defined(SDL_RENDER_DISABLED) - D3D_RenderData *data = (D3D_RenderData *)renderer->driverdata; - - /* Make sure that this is a D3D renderer */ - if (renderer->DestroyRenderer != D3D_DestroyRenderer) { - SDL_SetError("Renderer is not a D3D renderer"); - return NULL; - } - - device = data->device; - if (device) { - IDirect3DDevice9_AddRef(device); - } -#endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */ - - return device; -} -#endif /* defined(__WIN32__) || defined(__WINGDK__) */ diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 5df9049e0..3e9716c2c 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -668,6 +668,8 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) ID3D11DeviceContext_VSSetShader(data->d3dContext, data->vertexShader, NULL, 0); ID3D11DeviceContext_VSSetConstantBuffers(data->d3dContext, 0, 1, &data->vertexShaderConstants); + SDL_SetProperty(SDL_GetRendererProperties(renderer), "SDL.renderer.d3d11.device", data->d3dDevice, NULL, NULL); + done: SAFE_RELEASE(d3dDevice); SAFE_RELEASE(d3dContext); @@ -2411,6 +2413,7 @@ SDL_Renderer *D3D11_CreateRenderer(SDL_Window *window, Uint32 flags) SDL_OutOfMemory(); return NULL; } + renderer->magic = &SDL_renderer_magic; data = (D3D11_RenderData *)SDL_calloc(1, sizeof(*data)); if (data == NULL) { @@ -2506,28 +2509,3 @@ SDL_RenderDriver D3D11_RenderDriver = { }; #endif /* SDL_VIDEO_RENDER_D3D11 && !SDL_RENDER_DISABLED */ - -#if defined(__WIN32__) || defined(__WINGDK__) -/* This function needs to always exist on Windows, for the Dynamic API. */ -ID3D11Device *SDL_GetRenderD3D11Device(SDL_Renderer *renderer) -{ - ID3D11Device *device = NULL; - -#if defined(SDL_VIDEO_RENDER_D3D11) && !defined(SDL_RENDER_DISABLED) - D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata; - - /* Make sure that this is a D3D renderer */ - if (renderer->DestroyRenderer != D3D11_DestroyRenderer) { - SDL_SetError("Renderer is not a D3D11 renderer"); - return NULL; - } - - device = (ID3D11Device *)data->d3dDevice; - if (device) { - ID3D11Device_AddRef(device); - } -#endif /* SDL_VIDEO_RENDER_D3D11 && !SDL_RENDER_DISABLED */ - - return device; -} -#endif /* defined(__WIN32__) || defined(__WINGDK__) */ diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 0a5ddca37..ba4e1ebc1 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -1069,6 +1069,9 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) } } data->srvPoolHead = &data->srvPoolNodes[0]; + + SDL_SetProperty(SDL_GetRendererProperties(renderer), "SDL.renderer.d3d12.device", data->d3dDevice, NULL, NULL); + done: SAFE_RELEASE(d3dDevice); return result; @@ -2961,6 +2964,7 @@ SDL_Renderer *D3D12_CreateRenderer(SDL_Window *window, Uint32 flags) SDL_OutOfMemory(); return NULL; } + renderer->magic = &SDL_renderer_magic; data = (D3D12_RenderData *)SDL_calloc(1, sizeof(*data)); if (data == NULL) { @@ -3046,32 +3050,3 @@ SDL_RenderDriver D3D12_RenderDriver = { #endif #endif /* SDL_VIDEO_RENDER_D3D12 && !SDL_RENDER_DISABLED */ - -#if defined(__WIN32__) || defined(__GDK__) -#ifdef __cplusplus -extern "C" -#endif -/* This function needs to always exist on Windows, for the Dynamic API. */ -ID3D12Device * -SDL_RenderGetD3D12Device(SDL_Renderer *renderer) -{ - ID3D12Device *device = NULL; - -#if defined(SDL_VIDEO_RENDER_D3D12) && !defined(SDL_RENDER_DISABLED) - D3D12_RenderData *data = (D3D12_RenderData *)renderer->driverdata; - - /* Make sure that this is a D3D renderer */ - if (renderer->DestroyRenderer != D3D12_DestroyRenderer) { - SDL_SetError("Renderer is not a D3D12 renderer"); - return NULL; - } - - device = (ID3D12Device *)data->d3dDevice; - if (device) { - D3D_CALL(device, AddRef); - } -#endif /* SDL_VIDEO_RENDER_D3D12 && !SDL_RENDER_DISABLED */ - - return device; -} -#endif /* defined(__WIN32__) || defined(__GDK__) */ diff --git a/test/testffmpeg.c b/test/testffmpeg.c index cc75a5fa0..ecaad773a 100644 --- a/test/testffmpeg.c +++ b/test/testffmpeg.c @@ -145,8 +145,9 @@ static SDL_bool CreateWindowAndRenderer(Uint32 window_flags, const char *driver) #endif #ifdef __WIN32__ - d3d11_device = SDL_GetRenderD3D11Device(renderer); + d3d11_device = (ID3D11Device *)SDL_GetProperty(SDL_GetRendererProperties(renderer), "SDL.renderer.d3d11.device"); if (d3d11_device) { + ID3D11Device_AddRef(d3d11_device); ID3D11Device_GetImmediateContext(d3d11_device, &d3d11_context); } #endif