From a7530e789273db28d988d51810cb5a9e8971c4dd Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Thu, 7 Jul 2011 10:54:02 +0200 Subject: [PATCH] d3d9: Use unsafe_impl_from_IDirect3DSurface9 for app provided ifaces. --- dlls/d3d9/d3d9_private.h | 1 + dlls/d3d9/device.c | 27 +++++++++++++-------------- dlls/d3d9/surface.c | 10 ++++++++++ dlls/d3d9/swapchain.c | 8 +++++--- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index fb6e7e651cf..8d592be39c9 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -241,6 +241,7 @@ typedef struct IDirect3DSurface9Impl HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *device, UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN; +IDirect3DSurface9Impl *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) DECLSPEC_HIDDEN; /* ---------------------- */ /* IDirect3DVertexBuffer9 */ diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 0f33a271f40..200b611a9e3 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -400,7 +400,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetCursorProperties(IDirect3DDevice9E UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9 *pCursorBitmap) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); - IDirect3DSurface9Impl *pSurface = (IDirect3DSurface9Impl*)pCursorBitmap; + IDirect3DSurface9Impl *pSurface = unsafe_impl_from_IDirect3DSurface9(pCursorBitmap); HRESULT hr; TRACE("iface %p, hotspot_x %u, hotspot_y %u, bitmap %p.\n", @@ -970,15 +970,16 @@ static HRESULT WINAPI IDirect3DDevice9Impl_UpdateSurface(IDirect3DDevice9Ex *ifa IDirect3DSurface9 *pDestinationSurface, const POINT *pDestPoint) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); + IDirect3DSurface9Impl *src = unsafe_impl_from_IDirect3DSurface9(pSourceSurface); + IDirect3DSurface9Impl *dst = unsafe_impl_from_IDirect3DSurface9(pDestinationSurface); HRESULT hr; TRACE("iface %p, src_surface %p, src_rect %p, dst_surface %p, dst_point %p.\n", iface, pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint); wined3d_mutex_lock(); - hr = wined3d_device_update_surface(This->wined3d_device, - ((IDirect3DSurface9Impl *)pSourceSurface)->wined3d_surface, pSourceRect, - ((IDirect3DSurface9Impl *)pDestinationSurface)->wined3d_surface, pDestPoint); + hr = wined3d_device_update_surface(This->wined3d_device, src->wined3d_surface, pSourceRect, + dst->wined3d_surface, pDestPoint); wined3d_mutex_unlock(); return hr; @@ -1004,8 +1005,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_UpdateTexture(IDirect3DDevice9Ex *ifa static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTargetData(IDirect3DDevice9Ex *iface, IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pDestSurface) { - IDirect3DSurface9Impl *renderTarget = (IDirect3DSurface9Impl *)pRenderTarget; - IDirect3DSurface9Impl *destSurface = (IDirect3DSurface9Impl *)pDestSurface; + IDirect3DSurface9Impl *renderTarget = unsafe_impl_from_IDirect3DSurface9(pRenderTarget); + IDirect3DSurface9Impl *destSurface = unsafe_impl_from_IDirect3DSurface9(pDestSurface); HRESULT hr; TRACE("iface %p, render_target %p, dst_surface %p.\n", iface, pRenderTarget, pDestSurface); @@ -1022,7 +1023,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBufferData(IDirect3DDevice9Ex UINT iSwapChain, IDirect3DSurface9 *pDestSurface) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); - IDirect3DSurface9Impl *destSurface = (IDirect3DSurface9Impl *)pDestSurface; + IDirect3DSurface9Impl *destSurface = unsafe_impl_from_IDirect3DSurface9(pDestSurface); HRESULT hr; TRACE("iface %p, swapchain %u, dst_surface %p.\n", iface, iSwapChain, pDestSurface); @@ -1037,8 +1038,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBufferData(IDirect3DDevice9Ex static HRESULT WINAPI IDirect3DDevice9Impl_StretchRect(IDirect3DDevice9Ex *iface, IDirect3DSurface9 *pSourceSurface, const RECT *pSourceRect, IDirect3DSurface9 *pDestSurface, const RECT *pDestRect, D3DTEXTUREFILTERTYPE Filter) { - IDirect3DSurface9Impl *src = (IDirect3DSurface9Impl *) pSourceSurface; - IDirect3DSurface9Impl *dst = (IDirect3DSurface9Impl *) pDestSurface; + IDirect3DSurface9Impl *src = unsafe_impl_from_IDirect3DSurface9(pSourceSurface); + IDirect3DSurface9Impl *dst = unsafe_impl_from_IDirect3DSurface9(pDestSurface); HRESULT hr; TRACE("iface %p, src_surface %p, src_rect %p, dst_surface %p, dst_rect %p, filter %#x.\n", @@ -1062,7 +1063,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(IDirect3DDevice9Ex *iface, ((color >> 24) & 0xff) / 255.0f, }; IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); - IDirect3DSurface9Impl *surface = (IDirect3DSurface9Impl *)pSurface; + IDirect3DSurface9Impl *surface = unsafe_impl_from_IDirect3DSurface9(pSurface); struct wined3d_resource *wined3d_resource; struct wined3d_resource_desc desc; HRESULT hr; @@ -1124,7 +1125,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(IDirect3DDevice9Ex *i DWORD RenderTargetIndex, IDirect3DSurface9 *pRenderTarget) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); - IDirect3DSurface9Impl *pSurface = (IDirect3DSurface9Impl*)pRenderTarget; + IDirect3DSurface9Impl *pSurface = unsafe_impl_from_IDirect3DSurface9(pRenderTarget); HRESULT hr; TRACE("iface %p, idx %u, surface %p.\n", iface, RenderTargetIndex, pRenderTarget); @@ -1190,13 +1191,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface(IDirect3DDevic IDirect3DSurface9 *pZStencilSurface) { IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface); - IDirect3DSurface9Impl *pSurface; + IDirect3DSurface9Impl *pSurface = unsafe_impl_from_IDirect3DSurface9(pZStencilSurface); HRESULT hr; TRACE("iface %p, depth_stencil %p.\n", iface, pZStencilSurface); - pSurface = (IDirect3DSurface9Impl*)pZStencilSurface; - wined3d_mutex_lock(); hr = wined3d_device_set_depth_stencil(This->wined3d_device, pSurface ? pSurface->wined3d_surface : NULL); wined3d_mutex_unlock(); diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c index a4111ff3570..3f3ac3cc5fd 100644 --- a/dlls/d3d9/surface.c +++ b/dlls/d3d9/surface.c @@ -20,6 +20,7 @@ */ #include "config.h" +#include #include "d3d9_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d9); @@ -423,3 +424,12 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic return D3D_OK; } + +IDirect3DSurface9Impl *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &Direct3DSurface9_Vtbl); + + return impl_from_IDirect3DSurface9(iface); +} diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index 26437079970..f3160588d47 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -98,15 +98,17 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT return hr; } -static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface) { +static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(IDirect3DSwapChain9 *iface, + IDirect3DSurface9 *pDestSurface) +{ IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; + IDirect3DSurface9Impl *dst = unsafe_impl_from_IDirect3DSurface9(pDestSurface); HRESULT hr; TRACE("iface %p, surface %p.\n", iface, pDestSurface); wined3d_mutex_lock(); - hr = wined3d_swapchain_get_front_buffer_data(This->wined3d_swapchain, - ((IDirect3DSurface9Impl *)pDestSurface)->wined3d_surface); + hr = wined3d_swapchain_get_front_buffer_data(This->wined3d_swapchain, dst->wined3d_surface); wined3d_mutex_unlock(); return hr;