ddraw: Use ddraw_from_d3d7 to make a (IDirectDrawImpl *) from a (IDirect3D7 *).

Vincent Pelletier plr.vincent at gmail.com
Mon Feb 9 16:05:12 CST 2009


Hi.

This change (validated by H. Verbeet) fixes Beetle Crazy Cup.
Test detects the change on linux.
Test executed on win2k (RGB renderer, I confirmed that the test is executed 
and passes).

-- 
Vincent Pelletier
-------------- next part --------------
From 602834ed705c9053b6aeebd9123c0e2031d92b52 Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <plr.vincent at gmail.com>
Date: Mon, 9 Feb 2009 22:58:27 +0100
Subject: ddraw: Use ddraw_from_d3d7 to make a (IDirectDrawImpl *) from a (IDirect3D7 *).

---
 dlls/ddraw/device.c    |    6 +++---
 dlls/ddraw/tests/d3d.c |    7 +++++++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index db43b55..01b017d 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1790,7 +1790,7 @@ Thunk_IDirect3DDeviceImpl_3_GetDirect3D(IDirect3DDevice3 *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D3 = ret_ptr ? (IDirect3D3 *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D3_vtbl : NULL;
+    *Direct3D3 = ret_ptr ? (IDirect3D3 *)&(ddraw_from_d3d7(ret_ptr))->IDirect3D3_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D3);
     return D3D_OK;
 }
@@ -1807,7 +1807,7 @@ Thunk_IDirect3DDeviceImpl_2_GetDirect3D(IDirect3DDevice2 *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D2 = ret_ptr ? (IDirect3D2 *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D2_vtbl : NULL;
+    *Direct3D2 = ret_ptr ? (IDirect3D2 *)&(ddraw_from_d3d7(ret_ptr))->IDirect3D2_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D2);
     return D3D_OK;
 }
@@ -1824,7 +1824,7 @@ Thunk_IDirect3DDeviceImpl_1_GetDirect3D(IDirect3DDevice *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D = ret_ptr ? (IDirect3D *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D_vtbl : NULL;
+    *Direct3D = ret_ptr ? (IDirect3D *)&(ddraw_from_d3d7(ret_ptr))->IDirect3D_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D);
     return D3D_OK;
 }
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index aeae559..a35f520 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -1033,6 +1033,7 @@ static void Direct3D1Test(void)
     D3DVIEWPORT vp_data;
     D3DINSTRUCTION *instr;
     D3DBRANCH *branch;
+    IDirect3D *Direct3D_alt;
     unsigned int idx = 0;
     static struct v_in testverts[] = {
         {0.0, 0.0, 0.0},  { 1.0,  1.0,  1.0}, {-1.0, -1.0, -1.0},
@@ -1050,6 +1051,12 @@ static void Direct3D1Test(void)
     D3DTRANSFORMDATA transformdata;
     DWORD i = FALSE;
 
+    /* Interface consistency check. */
+    hr = IDirect3DDevice_GetDirect3D(Direct3DDevice1, &Direct3D_alt);
+    ok(hr == D3D_OK, "IDirect3DDevice_GetDirect3D failed: %08x\n", hr);
+    if (hr == D3D_OK)
+        ok(Direct3D_alt == Direct3D1, "Direct3D1 struct pointer missmatch: %p != %p\n", Direct3D_alt, Direct3D1);
+
     memset(&desc, 0, sizeof(desc));
     desc.dwSize = sizeof(desc);
     hr = IDirect3DExecuteBuffer_Lock(ExecuteBuffer, &desc);
-- 
1.5.6.5



More information about the wine-patches mailing list