From f12cbfb509a830f713ae145248fc9a379ffea903 Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Wed, 6 Jul 2011 13:20:37 +0200 Subject: [PATCH] d3d9: Use unsafe_impl_from_IDirect3DVertexShader9 for an app provided iface. --- dlls/d3d9/d3d9_private.h | 1 + dlls/d3d9/device.c | 3 ++- dlls/d3d9/shader.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index db059bf500c..78e497fde74 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -416,6 +416,7 @@ typedef struct IDirect3DVertexShader9Impl { HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) DECLSPEC_HIDDEN; +IDirect3DVertexShader9Impl *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface) DECLSPEC_HIDDEN; #define D3D9_MAX_VERTEX_SHADER_CONSTANTF 256 #define D3D9_MAX_SIMULTANEOUS_RENDERTARGETS 4 diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index ed5abd4bd00..46f71caf53b 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2298,13 +2298,14 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(IDirect3DDevice9Ex *i IDirect3DVertexShader9 *shader) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); + IDirect3DVertexShader9Impl *shader_obj = unsafe_impl_from_IDirect3DVertexShader9(shader); HRESULT hr; TRACE("iface %p, shader %p.\n", iface, shader); wined3d_mutex_lock(); hr = wined3d_device_set_vertex_shader(This->wined3d_device, - shader ? ((IDirect3DVertexShader9Impl *)shader)->wined3d_shader : NULL); + shader_obj ? shader_obj->wined3d_shader : NULL); wined3d_mutex_unlock(); return hr; diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c index 31ccfaa84f4..a063b0c252b 100644 --- a/dlls/d3d9/shader.c +++ b/dlls/d3d9/shader.c @@ -23,6 +23,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d9); +static inline IDirect3DVertexShader9Impl *impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface) +{ + return CONTAINING_RECORD(iface, IDirect3DVertexShader9Impl, lpVtbl); +} + static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **object) { TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); @@ -151,6 +156,15 @@ HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Im return D3D_OK; } +IDirect3DVertexShader9Impl *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &d3d9_vertexshader_vtbl); + + return impl_from_IDirect3DVertexShader9(iface); +} + static inline IDirect3DPixelShader9Impl *impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface) { return CONTAINING_RECORD(iface, IDirect3DPixelShader9Impl, IDirect3DPixelShader9_iface); -- 2.11.4.GIT