From 31cf68dd95c407f74a8ead9f5e46eda393bd292e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ri=C4=8Dardas=20Barkauskas?= Date: Mon, 17 Oct 2011 16:58:25 +0300 Subject: [PATCH] ddraw: Use unsafe_impl_from_IDirect3DDevice7 for application provided interfaces. --- dlls/ddraw/ddraw_private.h | 1 + dlls/ddraw/device.c | 7 +++++++ dlls/ddraw/vertexbuffer.c | 18 +++++++++--------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 7031e150a5b..f75fcbf8d4b 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -343,6 +343,7 @@ static inline IDirect3DDeviceImpl *impl_from_IDirect3DDevice3(IDirect3DDevice3 * IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice(IDirect3DDevice *iface) DECLSPEC_HIDDEN; IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface) DECLSPEC_HIDDEN; IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface) DECLSPEC_HIDDEN; +IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface) DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDrawClipper implementation structure diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 8513f71c88c..e29ee151c9e 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -6770,6 +6770,13 @@ static const struct IDirect3DDeviceVtbl d3d_device1_vtbl = IDirect3DDeviceImpl_1_GetDirect3D }; +IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface) +{ + if (!iface) return NULL; + assert((iface->lpVtbl == &d3d_device7_fpu_preserve_vtbl) || (iface->lpVtbl == &d3d_device7_fpu_setup_vtbl)); + return CONTAINING_RECORD(iface, IDirect3DDeviceImpl, lpVtbl); +} + IDirect3DDeviceImpl *unsafe_impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface) { if (!iface) return NULL; diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c index f675cdaad72..8c4d2015914 100644 --- a/dlls/ddraw/vertexbuffer.c +++ b/dlls/ddraw/vertexbuffer.c @@ -303,16 +303,16 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer * *****************************************************************************/ static HRESULT WINAPI IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface, DWORD VertexOp, DWORD DestIndex, DWORD Count, IDirect3DVertexBuffer7 *SrcBuffer, - DWORD SrcIndex, IDirect3DDevice7 *D3DDevice, DWORD Flags) + DWORD SrcIndex, IDirect3DDevice7 *device, DWORD Flags) { IDirect3DVertexBufferImpl *This = impl_from_IDirect3DVertexBuffer7(iface); IDirect3DVertexBufferImpl *Src = unsafe_impl_from_IDirect3DVertexBuffer7(SrcBuffer); - IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice; + IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice7(device); BOOL oldClip, doClip; HRESULT hr; TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n", - iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags); + iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, device, Flags); /* Vertex operations: * D3DVOP_CLIP: Clips vertices outside the viewing frustrum. Needs clipping information @@ -332,19 +332,19 @@ static HRESULT WINAPI IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexB * the vertex ops */ doClip = VertexOp & D3DVOP_CLIP ? TRUE : FALSE; - wined3d_device_get_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, (DWORD *)&oldClip); + wined3d_device_get_render_state(device_impl->wined3d_device, WINED3DRS_CLIPPING, (DWORD *)&oldClip); if (doClip != oldClip) - wined3d_device_set_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, doClip); + wined3d_device_set_render_state(device_impl->wined3d_device, WINED3DRS_CLIPPING, doClip); - wined3d_device_set_stream_source(D3D->wined3d_device, + wined3d_device_set_stream_source(device_impl->wined3d_device, 0, Src->wineD3DVertexBuffer, 0, get_flexible_vertex_size(Src->fvf)); - wined3d_device_set_vertex_declaration(D3D->wined3d_device, Src->wineD3DVertexDeclaration); - hr = wined3d_device_process_vertices(D3D->wined3d_device, SrcIndex, DestIndex, + wined3d_device_set_vertex_declaration(device_impl->wined3d_device, Src->wineD3DVertexDeclaration); + hr = wined3d_device_process_vertices(device_impl->wined3d_device, SrcIndex, DestIndex, Count, This->wineD3DVertexBuffer, NULL, Flags, This->fvf); /* Restore the states if needed */ if (doClip != oldClip) - wined3d_device_set_render_state(D3D->wined3d_device, WINED3DRS_CLIPPING, oldClip); + wined3d_device_set_render_state(device_impl->wined3d_device, WINED3DRS_CLIPPING, oldClip); LeaveCriticalSection(&ddraw_cs); return hr; } -- 2.11.4.GIT