[D3D 17] Re: bug (regression) in ddraw/d3d

Lionel Ulmer lionel.ulmer at free.fr
Wed Dec 4 22:58:56 CST 2002


> Might be, but since i know next to nothing about win32 programming i can't 
> test it on real windows or give a good comment on that :-)
> Maybe it's a bug in FF8Config which just happen to work, but afaics using only 
> 1 guid and do the cast can't hurt. 

Could you try the attached patch ? It should work and introduce no
regression so I also send it directly to wine-patches.

If it does not work, yell before Alexandre commits it :-)

Changelog:
 Have only one GIUD for Wine's OpenGL D3D device

                                  Lionel

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2002-12-05 06:43:02.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2002-12-05 06:45:18.000000000 +0100
@@ -45,27 +45,6 @@
   { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfa }
 };
 
-const GUID IID_D3DDEVICE2_OpenGL = {
-  0x31416d44,
-  0x86ae,
-  0x11d2,
-  { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfb }
-};
-
-const GUID IID_D3DDEVICE3_OpenGL = {
-  0x31416d44,
-  0x86ae,
-  0x11d2,
-  { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfc }
-};
-
-const GUID IID_D3DDEVICE7_OpenGL = {
-  0x31416d44,
-  0x86ae,
-  0x11d2,
-  { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfd }
-};
-
 /* Define this variable if you have an unpatched Mesa 3.0 (patches are available
    on Mesa's home page) or version 3.1b.
 
@@ -275,26 +254,15 @@
 
 
 
-HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version)
+HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context)
 {
     D3DDEVICEDESC d1, d2;
-    char buf[256];
-    const void *iid = NULL;
-
-    switch (interface_version) {
-        case 1: iid = &IID_D3DDEVICE_OpenGL; break;
-	case 2: iid = &IID_D3DDEVICE2_OpenGL; break;
-	case 3: iid = &IID_D3DDEVICE3_OpenGL; break;
-	case 7: iid = &IID_D3DDEVICE7_OpenGL; break;
-    }
-    strcpy(buf, "WINE Direct3DX using OpenGL");
-    buf[13] = '0' + interface_version;
 
     fill_opengl_caps(&d1);
     d2 = d1;
 
-    TRACE(" enumerating OpenGL D3DDevice%ld interface (IID %s).\n", interface_version, debugstr_guid(iid));
-    return cb((LPGUID) iid, buf, "direct3d", &d1, &d2, context);
+    TRACE(" enumerating OpenGL D3DDevice interface (IID %s).\n", debugstr_guid(&IID_D3DDEVICE_OpenGL));
+    return cb((LPIID) &IID_D3DDEVICE_OpenGL, "WINE Direct3DX using OpenGL", "direct3d", &d1, &d2, context);
 }
 
 HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context)
@@ -462,8 +430,7 @@
 HRESULT
 d3ddevice_find(IDirect3DImpl *d3d,
 	       LPD3DFINDDEVICESEARCH lpD3DDFS,
-	       LPD3DFINDDEVICERESULT lplpD3DDevice,
-	       DWORD interface_version)
+	       LPD3DFINDDEVICERESULT lplpD3DDevice)
 {
     DWORD dwSize;
     D3DDEVICEDESC desc;
@@ -476,23 +443,14 @@
     if (lpD3DDFS->dwFlags & D3DFDS_GUID) {
         TRACE(" trying to match guid %s.\n", debugstr_guid(&(lpD3DDFS->guid)));
 	if ((IsEqualGUID( &IID_D3DDEVICE_OpenGL, &(lpD3DDFS->guid)) == 0) &&
-	    (IsEqualGUID( &IID_D3DDEVICE2_OpenGL, &(lpD3DDFS->guid)) == 0) &&
-	    (IsEqualGUID( &IID_D3DDEVICE3_OpenGL, &(lpD3DDFS->guid)) == 0) &&
-	    (IsEqualGUID( &IID_D3DDEVICE7_OpenGL, &(lpD3DDFS->guid)) == 0) &&
 	    (IsEqualGUID(&IID_IDirect3DHALDevice, &(lpD3DDFS->guid)) == 0)) {
 	    TRACE(" no match for this GUID.\n");
 	    return DDERR_INVALIDPARAMS;
 	}
     }
 
-    /* Now return our own GUIDs according to Direct3D version */
-    if (interface_version == 1) {
-        lplpD3DDevice->guid = IID_D3DDEVICE_OpenGL;
-    } else if (interface_version == 2) {
-        lplpD3DDevice->guid = IID_D3DDEVICE2_OpenGL;
-    } else if (interface_version == 3) {
-        lplpD3DDevice->guid = IID_D3DDEVICE3_OpenGL;
-    }
+    /* Now return our own GUID */
+    lplpD3DDevice->guid = IID_D3DDEVICE_OpenGL;
     fill_opengl_caps(&desc);
     dwSize = lplpD3DDevice->ddHwDesc.dwSize;
     memset(&(lplpD3DDevice->ddHwDesc), 0, dwSize);
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa_private.h	2002-11-30 23:45:05.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa_private.h	2002-12-05 06:21:00.000000000 +0100
@@ -57,9 +57,6 @@
 #define LEAVE_GL() wine_tsx11_unlock_ptr()
 
 extern const GUID IID_D3DDEVICE_OpenGL;
-extern const GUID IID_D3DDEVICE2_OpenGL;
-extern const GUID IID_D3DDEVICE3_OpenGL;
-extern const GUID IID_D3DDEVICE7_OpenGL;
 
 typedef struct render_state {
     /* This is used for the device mode */
@@ -123,9 +120,9 @@
 extern HRESULT d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surface);
 
 /* Used for Direct3D to request the device to enumerate itself */
-extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version) ;
+extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ;
 extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context) ;
-extern HRESULT d3ddevice_find(IDirect3DImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice, DWORD interface_version);
+extern HRESULT d3ddevice_find(IDirect3DImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice);
 
 /* Some helper functions.. Would need to put them in a better place */
 extern void dump_flexible_vertex(DWORD d3dvtVertexType);
--- /home/ulmer/Wine/wine_base//dlls/ddraw/direct3d/main.c	2002-11-28 23:04:38.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/direct3d/main.c	2002-12-05 06:37:28.000000000 +0100
@@ -170,29 +170,9 @@
 }
 
 HRESULT WINAPI
-Main_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
-                                LPD3DFINDDEVICESEARCH lpD3DDFS,
-                                LPD3DFINDDEVICERESULT lplpD3DDevice)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface);
-    FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lplpD3DDevice);
-    return D3D_OK;
-}
-
-HRESULT WINAPI
-Main_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
-				LPD3DFINDDEVICESEARCH lpD3DDFS,
-				LPD3DFINDDEVICERESULT lpD3DFDR)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface);
-    FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR);
-    return D3D_OK;
-}
-
-HRESULT WINAPI
-Main_IDirect3DImpl_3_FindDevice(LPDIRECT3D3 iface,
-				LPD3DFINDDEVICESEARCH lpD3DDFS,
-				LPD3DFINDDEVICERESULT lpD3DFDR)
+Main_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface,
+				      LPD3DFINDDEVICESEARCH lpD3DDFS,
+				      LPD3DFINDDEVICERESULT lpD3DFDR)
 {
     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR);
@@ -497,3 +477,25 @@
     
     return ret;
 }
+
+HRESULT WINAPI
+Thunk_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
+				 LPD3DFINDDEVICESEARCH lpD3DDFS,
+				 LPD3DFINDDEVICERESULT lplpD3DDevice)
+{
+    TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lplpD3DDevice);
+    return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
+				 lpD3DDFS,
+				 lplpD3DDevice);
+}
+
+HRESULT WINAPI
+Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
+				 LPD3DFINDDEVICESEARCH lpD3DDFS,
+				 LPD3DFINDDEVICERESULT lpD3DFDR)
+{
+    TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lpD3DFDR);
+    return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
+				 lpD3DDFS,
+				 lpD3DFDR);
+}
--- /home/ulmer/Wine/wine_base//dlls/ddraw/direct3d/mesa.c	2002-12-02 01:00:29.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/direct3d/mesa.c	2002-12-05 06:33:30.000000000 +0100
@@ -43,45 +43,15 @@
 #define MAX_LIGHTS 8
 
 HRESULT WINAPI
-GL_IDirect3DImpl_1_EnumDevices(LPDIRECT3D iface,
-			       LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
-			       LPVOID lpUserArg)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface);
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
-
-    /* Call functions defined in d3ddevices.c */
-    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 1) != D3DENUMRET_OK)
-	return D3D_OK;
-
-    return D3D_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DImpl_2_EnumDevices(LPDIRECT3D2 iface,
-			       LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
-			       LPVOID lpUserArg)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface);
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
-
-    /* Call functions defined in d3ddevices.c */
-    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 2) != D3DENUMRET_OK)
-	return D3D_OK;
-
-    return D3D_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DImpl_3_EnumDevices(LPDIRECT3D3 iface,
-			       LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
-			       LPVOID lpUserArg)
+GL_IDirect3DImpl_3_2T_1T_EnumDevices(LPDIRECT3D3 iface,
+				     LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
+				     LPVOID lpUserArg)
 {
     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
 
     /* Call functions defined in d3ddevices.c */
-    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 3) != D3DENUMRET_OK)
+    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg) != D3DENUMRET_OK)
 	return D3D_OK;
 
     return D3D_OK;
@@ -160,48 +130,29 @@
     ret_value = d3ddevice_create(&lpd3ddev, This, lpDDS);
     if (FAILED(ret_value)) return ret_value;
     
-    if (IsEqualGUID( &IID_D3DDEVICE_OpenGL, iid )) {
-	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice);
-        TRACE(" returning OpenGL D3DDevice %p\n", *obj);
-	return D3D_OK;
-    }
-    if (IsEqualGUID( &IID_D3DDEVICE2_OpenGL, iid )) {
-	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice2);
-        TRACE(" returning OpenGL D3DDevice2 %p\n", *obj);
-	return D3D_OK;
-    }
-    if (IsEqualGUID( &IID_D3DDEVICE3_OpenGL, iid )) {
-	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice3);
-        TRACE(" returning OpenGL D3DDevice3 %p\n", *obj);
-	return D3D_OK;
-    }
-    if (IsEqualGUID( &IID_D3DDEVICE7_OpenGL, iid )) {
-	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice7);
-        TRACE(" returning OpenGL D3DDevice7 %p\n", *obj);
-	return D3D_OK;
-    }
     if ((iid == NULL) ||
+	(IsEqualGUID(&IID_D3DDEVICE_OpenGL, iid)) ||
 	(IsEqualGUID(&IID_IDirect3DHALDevice, iid)) ||
 	(IsEqualGUID(&IID_IDirect3DTnLHalDevice, iid))) {
         switch (interface) {
 	    case 1:
 		*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice);
-	        TRACE(" returning OpenGL D3DDevice %p via default / HAL interface\n", *obj);
+	        TRACE(" returning OpenGL D3DDevice %p.\n", *obj);
 		return D3D_OK;
 
 	    case 2:
 		*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice2);
-	        TRACE(" returning OpenGL D3DDevice2 %p via default / HAL interface\n", *obj);
+	        TRACE(" returning OpenGL D3DDevice2 %p.\n", *obj);
 		return D3D_OK;
 
 	    case 3:
 		*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice3);
-	        TRACE(" returning OpenGL D3DDevice3 %p via default / HAL interface\n", *obj);
+	        TRACE(" returning OpenGL D3DDevice3 %p.\n", *obj);
 		return D3D_OK;
 
 	    case 7:
 		*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice7);
-	        TRACE(" returning OpenGL D3DDevice7 %p via default / HAL interface\n", *obj);
+	        TRACE(" returning OpenGL D3DDevice7 %p.\n", *obj);
 		return D3D_OK;
         }
     }
@@ -239,33 +190,13 @@
 }
 
 HRESULT WINAPI
-GL_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
-			      LPD3DFINDDEVICESEARCH lpD3DDFS,
-			      LPD3DFINDDEVICERESULT lplpD3DDevice)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface);
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpD3DDFS, lplpD3DDevice);
-    return d3ddevice_find(This, lpD3DDFS, lplpD3DDevice, 1);
-}
-
-HRESULT WINAPI
-GL_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
-			      LPD3DFINDDEVICESEARCH lpD3DDFS,
-			      LPD3DFINDDEVICERESULT lpD3DFDR)
-{
-    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface);
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpD3DDFS, lpD3DFDR);
-    return d3ddevice_find(This, lpD3DDFS, lpD3DFDR, 2);
-}
-
-HRESULT WINAPI
-GL_IDirect3DImpl_3_FindDevice(LPDIRECT3D3 iface,
-			      LPD3DFINDDEVICESEARCH lpD3DDFS,
-			      LPD3DFINDDEVICERESULT lpD3DFDR)
+GL_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface,
+				    LPD3DFINDDEVICESEARCH lpD3DDFS,
+				    LPD3DFINDDEVICERESULT lpD3DFDR)
 {
     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpD3DDFS, lpD3DFDR);
-    return d3ddevice_find(This, lpD3DDFS, lpD3DFDR, 3);
+    return d3ddevice_find(This, lpD3DDFS, lpD3DFDR);
 }
 
 HRESULT WINAPI
@@ -381,11 +312,11 @@
     XCAST(QueryInterface) Thunk_IDirect3DImpl_3_QueryInterface,
     XCAST(AddRef) Thunk_IDirect3DImpl_3_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_3_Release,
-    XCAST(EnumDevices) GL_IDirect3DImpl_3_EnumDevices,
+    XCAST(EnumDevices) GL_IDirect3DImpl_3_2T_1T_EnumDevices,
     XCAST(CreateLight) GL_IDirect3DImpl_3_2T_1T_CreateLight,
     XCAST(CreateMaterial) GL_IDirect3DImpl_3_2T_1T_CreateMaterial,
     XCAST(CreateViewport) GL_IDirect3DImpl_3_2T_1T_CreateViewport,
-    XCAST(FindDevice) GL_IDirect3DImpl_3_FindDevice,
+    XCAST(FindDevice) GL_IDirect3DImpl_3_2T_1T_FindDevice,
     XCAST(CreateDevice) GL_IDirect3DImpl_3_CreateDevice,
     XCAST(CreateVertexBuffer) Thunk_IDirect3DImpl_3_CreateVertexBuffer,
     XCAST(EnumZBufferFormats) Thunk_IDirect3DImpl_3_EnumZBufferFormats,
@@ -409,11 +340,11 @@
     XCAST(QueryInterface) Thunk_IDirect3DImpl_2_QueryInterface,
     XCAST(AddRef) Thunk_IDirect3DImpl_2_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_2_Release,
-    XCAST(EnumDevices) GL_IDirect3DImpl_2_EnumDevices,
+    XCAST(EnumDevices) Thunk_IDirect3DImpl_2_EnumDevices,
     XCAST(CreateLight) Thunk_IDirect3DImpl_2_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_2_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_2_CreateViewport,
-    XCAST(FindDevice) GL_IDirect3DImpl_2_FindDevice,
+    XCAST(FindDevice) Thunk_IDirect3DImpl_2_FindDevice,
     XCAST(CreateDevice) GL_IDirect3DImpl_2_CreateDevice,
 };
 
@@ -435,11 +366,11 @@
     XCAST(AddRef) Thunk_IDirect3DImpl_1_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_1_Release,
     XCAST(Initialize) Main_IDirect3DImpl_1_Initialize,
-    XCAST(EnumDevices) GL_IDirect3DImpl_1_EnumDevices,
+    XCAST(EnumDevices) Thunk_IDirect3DImpl_1_EnumDevices,
     XCAST(CreateLight) Thunk_IDirect3DImpl_1_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_1_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_1_CreateViewport,
-    XCAST(FindDevice) GL_IDirect3DImpl_1_FindDevice,
+    XCAST(FindDevice) Thunk_IDirect3DImpl_1_FindDevice,
 };
 
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
--- /home/ulmer/Wine/wine_base//dlls/ddraw/direct3d/main.h	2002-11-28 23:04:38.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/direct3d/main.h	2002-12-05 06:36:54.000000000 +0100
@@ -78,14 +78,9 @@
 					  IUnknown* pUnkOuter);
 
 HRESULT WINAPI
-Main_IDirect3DImpl_3_FindDevice(LPDIRECT3D3 iface,
-				LPD3DFINDDEVICESEARCH lpD3DDFS,
-				LPD3DFINDDEVICERESULT lpD3DFDR);
-
-HRESULT WINAPI
-Main_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
-				LPD3DFINDDEVICESEARCH lpD3DDFS,
-				LPD3DFINDDEVICERESULT lpD3DFDR);
+Main_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface,
+				      LPD3DFINDDEVICESEARCH lpD3DDFS,
+				      LPD3DFINDDEVICERESULT lpD3DFDR);
 
 HRESULT WINAPI
 Main_IDirect3DImpl_3_CreateDevice(LPDIRECT3D3 iface,
@@ -197,3 +192,13 @@
 Thunk_IDirect3DImpl_1_CreateLight(LPDIRECT3D iface,
                                   LPDIRECT3DLIGHT* lplpDirect3DLight,
                                   IUnknown* pUnkOuter);
+
+HRESULT WINAPI
+Thunk_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
+				 LPD3DFINDDEVICESEARCH lpD3DDFS,
+				 LPD3DFINDDEVICERESULT lplpD3DDevice);
+
+HRESULT WINAPI
+Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
+				 LPD3DFINDDEVICESEARCH lpD3DDFS,
+				 LPD3DFINDDEVICERESULT lpD3DFDR);


More information about the wine-patches mailing list