- add implementation for FindDevice function
- some miscellaneous clean-ups / additions

diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c
index 13a01ec..c8fb8fd 100644
--- a/dlls/ddraw/d3ddevice/mesa.c
+++ b/dlls/ddraw/d3ddevice/mesa.c
@@ -66,13 +66,6 @@
   { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfd }
 };
 
-const GUID IID_D3DDEVICE_Default = {
-  0x00000000,
-  0x0000,
-  0x0000,
-  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
-};
-
 /* Define this variable if you have an unpatched Mesa 3.0 (patches are available
    on Mesa's home page) or version 3.1b.
 
@@ -201,9 +194,9 @@
     d1->dwMaxStippleHeight = 32;
 }
 
+#if 0 /* TODO : fix this... */
 static void fill_device_capabilities(IDirectDrawImpl* ddraw)
 {
-#if 0 /* TODO : fix this... */
     x11_dd_private *private = (x11_dd_private *) ddraw->d->private;
     const char *ext_string;
     Mesa_DeviceCapabilities *devcap;
@@ -221,12 +214,12 @@
         TRACE("Color table extension not found.\n");
     }
     LEAVE_GL();
-#endif
 }
+#endif
 
 
 
-HRESULT d3device_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version)
+HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version)
 {
     D3DDEVICEDESC d1, d2;
     char buf[256];
@@ -290,7 +283,7 @@
     memset(lpD3DHELDevDesc, 0, dwSize);
     memcpy(lpD3DHELDevDesc, &desc, (dwSize <= desc.dwSize ? dwSize : desc.dwSize));
 
-    TRACE(" returning caps : TODO\n");
+    TRACE(" returning caps : (no dump function yet)\n");
 
     return DD_OK;
 }
@@ -398,6 +391,52 @@
     return DD_OK;
 }
 
+
+HRESULT
+d3ddevice_find(IDirect3DImpl *d3d,
+	       LPD3DFINDDEVICESEARCH lpD3DDFS,
+	       LPD3DFINDDEVICERESULT lplpD3DDevice,
+	       DWORD interface_version)
+{
+    DWORD dwSize;
+    D3DDEVICEDESC desc;
+  
+    if ((lpD3DDFS->dwFlags & D3DFDS_COLORMODEL) &&
+	(lpD3DDFS->dcmColorModel != D3DCOLOR_RGB)) {
+        TRACE(" trying to request a non-RGB D3D color model. Not supported.\n");
+	return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */
+    }
+    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;
+    }
+    fill_opengl_caps(&desc);
+    dwSize = lplpD3DDevice->ddHwDesc.dwSize;
+    memset(&(lplpD3DDevice->ddHwDesc), 0, dwSize);
+    memcpy(&(lplpD3DDevice->ddHwDesc), &desc, (dwSize <= desc.dwSize ? dwSize : desc.dwSize));
+    dwSize = lplpD3DDevice->ddSwDesc.dwSize;
+    memset(&(lplpD3DDevice->ddSwDesc), 0, dwSize);
+    memcpy(&(lplpD3DDevice->ddSwDesc), &desc, (dwSize <= desc.dwSize ? dwSize : desc.dwSize));
+    
+    return D3D_OK;
+}
+
 HRESULT WINAPI
 GL_IDirect3DDeviceImpl_2_1T_EnumTextureFormats(LPDIRECT3DDEVICE2 iface,
 					       LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
diff --git a/dlls/ddraw/d3dtexture.c b/dlls/ddraw/d3dtexture.c
index c418731..c14ba0c 100644
--- a/dlls/ddraw/d3dtexture.c
+++ b/dlls/ddraw/d3dtexture.c
@@ -203,19 +203,19 @@
     *obp = NULL;
 
     if ( IsEqualGUID( &IID_IUnknown,  riid ) ) {
-        IDirect3DTexture_AddRef(ICOM_INTERFACE(This, IDirect3DTexture));
+        IDirect3DTexture2_AddRef(ICOM_INTERFACE(This, IDirect3DTexture2));
 	*obp = iface;
 	TRACE("  Creating IUnknown interface at %p.\n", *obp);
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirect3DTexture, riid ) ) {
-        IDirect3DTexture_AddRef(ICOM_INTERFACE(This, IDirect3DTexture));
+        IDirect3DTexture2_AddRef(ICOM_INTERFACE(This, IDirect3DTexture2));
         *obp = ICOM_INTERFACE(This, IDirect3DTexture);
 	TRACE("  Creating IDirect3DTexture interface %p\n", *obp);
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirect3DTexture2, riid ) ) {
-        IDirect3DTexture_AddRef(ICOM_INTERFACE(This, IDirect3DTexture));
+        IDirect3DTexture2_AddRef(ICOM_INTERFACE(This, IDirect3DTexture2));
         *obp = ICOM_INTERFACE(This, IDirect3DTexture2);
 	TRACE("  Creating IDirect3DTexture2 interface %p\n", *obp);
 	return S_OK;
@@ -350,8 +350,8 @@
     /* Associate the texture with the device and perform the appropriate AddRef/Release */
     /* FIXME: Is there only one or several textures associated with the device ? */
     if (lpDeviceImpl->current_texture != NULL)
-        IDirect3DTexture_Release(ICOM_INTERFACE(lpDeviceImpl->current_texture, IDirect3DTexture));           
-    IDirect3DTexture_AddRef(ICOM_INTERFACE(This, IDirect3DTexture));
+        IDirect3DTexture2_Release(ICOM_INTERFACE(lpDeviceImpl->current_texture, IDirect3DTexture2));           
+    IDirect3DTexture2_AddRef(ICOM_INTERFACE(This, IDirect3DTexture2));
     lpDeviceImpl->current_texture = This;
 
     TRACE("OpenGL texture handle is : %d\n", glThis->tex_name);
@@ -375,7 +375,7 @@
     static BOOL color_table_queried = FALSE;
 #endif
     
-    TRACE("(%p/%p)->(%p): stub!\n", This, iface, lpD3DTexture2);
+    TRACE("(%p/%p)->(%p)\n", This, iface, lpD3DTexture2);
     TRACE("Copied surface %p to surface %p\n", lpD3DTextureImpl->surface, This->surface);
 
     if ( This->surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
diff --git a/dlls/ddraw/direct3d/main.c b/dlls/ddraw/direct3d/main.c
index a68b578..ae288ee 100644
--- a/dlls/ddraw/direct3d/main.c
+++ b/dlls/ddraw/direct3d/main.c
@@ -180,9 +180,19 @@
 }
 
 HRESULT WINAPI
-Main_IDirect3DImpl_3_2T_FindDevice(LPDIRECT3D3 iface,
-                                   LPD3DFINDDEVICESEARCH lpD3DDFS,
-                                   LPD3DFINDDEVICERESULT lpD3DFDR)
+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)
 {
     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR);
@@ -403,17 +413,6 @@
 }
 
 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, IDirect3D2, IDirect3D3, iface),
-                                 lpD3DDFS,
-                                 lpD3DFDR);
-}
-
-HRESULT WINAPI
 Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface,
 				     LPDIRECT3DMATERIAL* lplpDirect3DMaterial,
 				     IUnknown* pUnkOuter)
diff --git a/dlls/ddraw/direct3d/main.h b/dlls/ddraw/direct3d/main.h
index fcd93a9..cefcd45 100644
--- a/dlls/ddraw/direct3d/main.h
+++ b/dlls/ddraw/direct3d/main.h
@@ -78,9 +78,14 @@
 					  IUnknown* pUnkOuter);
 
 HRESULT WINAPI
-Main_IDirect3DImpl_3_2T_FindDevice(LPDIRECT3D3 iface,
-                                   LPD3DFINDDEVICESEARCH lpD3DDFS,
-                                   LPD3DFINDDEVICERESULT lpD3DFDR);
+Main_IDirect3DImpl_3_FindDevice(LPDIRECT3D3 iface,
+				LPD3DFINDDEVICESEARCH lpD3DDFS,
+				LPD3DFINDDEVICERESULT lpD3DFDR);
+
+HRESULT WINAPI
+Main_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
+				LPD3DFINDDEVICESEARCH lpD3DDFS,
+				LPD3DFINDDEVICERESULT lpD3DFDR);
 
 HRESULT WINAPI
 Main_IDirect3DImpl_3_CreateDevice(LPDIRECT3D3 iface,
@@ -192,8 +197,3 @@
 Thunk_IDirect3DImpl_1_CreateLight(LPDIRECT3D iface,
                                   LPDIRECT3DLIGHT* lplpDirect3DLight,
                                   IUnknown* pUnkOuter);
-
-HRESULT WINAPI
-Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
-                                 LPD3DFINDDEVICESEARCH lpD3DDFS,
-                                 LPD3DFINDDEVICERESULT lpD3DFDR);
diff --git a/dlls/ddraw/direct3d/mesa.c b/dlls/ddraw/direct3d/mesa.c
index f2d0806..2128527 100644
--- a/dlls/ddraw/direct3d/mesa.c
+++ b/dlls/ddraw/direct3d/mesa.c
@@ -51,7 +51,7 @@
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
 
     /* Call functions defined in d3ddevices.c */
-    if (d3device_enumerate(lpEnumDevicesCallback, lpUserArg, 1) != D3DENUMRET_OK)
+    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 1) != D3DENUMRET_OK)
 	return D3D_OK;
 
     return D3D_OK;
@@ -66,7 +66,7 @@
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
 
     /* Call functions defined in d3ddevices.c */
-    if (d3device_enumerate(lpEnumDevicesCallback, lpUserArg, 2) != D3DENUMRET_OK)
+    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 2) != D3DENUMRET_OK)
 	return D3D_OK;
 
     return D3D_OK;
@@ -81,7 +81,7 @@
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpEnumDevicesCallback, lpUserArg);
 
     /* Call functions defined in d3ddevices.c */
-    if (d3device_enumerate(lpEnumDevicesCallback, lpUserArg, 3) != D3DENUMRET_OK)
+    if (d3ddevice_enumerate(lpEnumDevicesCallback, lpUserArg, 3) != D3DENUMRET_OK)
 	return D3D_OK;
 
     return D3D_OK;
@@ -166,23 +166,22 @@
 	return D3D_OK;
     }
     if (IsEqualGUID( &IID_D3DDEVICE2_OpenGL, iid )) {
-        TRACE(" returning OpenGL D3DDevice2 %p\n", *obj);
 	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice2);
+        TRACE(" returning OpenGL D3DDevice2 %p\n", *obj);
 	return D3D_OK;
     }
     if (IsEqualGUID( &IID_D3DDEVICE3_OpenGL, iid )) {
-        TRACE(" returning OpenGL D3DDevice3 %p\n", *obj);
 	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice3);
+        TRACE(" returning OpenGL D3DDevice3 %p\n", *obj);
 	return D3D_OK;
     }
     if (IsEqualGUID( &IID_D3DDEVICE7_OpenGL, iid )) {
-        TRACE(" returning OpenGL D3DDevice7 %p\n", *obj);
 	*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice7);
+        TRACE(" returning OpenGL D3DDevice7 %p\n", *obj);
 	return D3D_OK;
     }
     if ((iid == NULL) ||
-	(IsEqualGUID(&IID_IDirect3DHALDevice, iid)) ||
-	(IsEqualGUID(&IID_D3DDEVICE_Default, iid))) {
+	(IsEqualGUID(&IID_IDirect3DHALDevice, iid))) {
         switch (interface) {
 	    case 1:
 		*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice);
@@ -238,6 +237,36 @@
     return create_device_helper(This, rclsid, ddsurfaceimpl, (void **) lplpD3DDevice3, 3);
 }
 
+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)
+{
+    ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
+    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpD3DDFS, lpD3DFDR);
+    return d3ddevice_find(This, lpD3DDFS, lpD3DFDR, 3);
+}
+
 static void light_released(IDirect3DImpl *This, GLenum light_num)
 {
     IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This;
@@ -284,7 +313,7 @@
     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) Main_IDirect3DImpl_3_2T_FindDevice,
+    XCAST(FindDevice) GL_IDirect3DImpl_3_FindDevice,
     XCAST(CreateDevice) GL_IDirect3DImpl_3_CreateDevice,
     XCAST(CreateVertexBuffer) Thunk_IDirect3DImpl_3_CreateVertexBuffer,
     XCAST(EnumZBufferFormats) Thunk_IDirect3DImpl_3_EnumZBufferFormats,
@@ -312,7 +341,7 @@
     XCAST(CreateLight) Thunk_IDirect3DImpl_2_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_2_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_2_CreateViewport,
-    XCAST(FindDevice) Thunk_IDirect3DImpl_2_FindDevice,
+    XCAST(FindDevice) GL_IDirect3DImpl_2_FindDevice,
     XCAST(CreateDevice) GL_IDirect3DImpl_2_CreateDevice,
 };
 
@@ -338,7 +367,7 @@
     XCAST(CreateLight) Thunk_IDirect3DImpl_1_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_1_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_1_CreateViewport,
-    XCAST(FindDevice) Main_IDirect3DImpl_1_FindDevice,
+    XCAST(FindDevice) GL_IDirect3DImpl_1_FindDevice,
 };
 
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
diff --git a/dlls/ddraw/mesa_private.h b/dlls/ddraw/mesa_private.h
index 6b8790b..2a0e412 100644
--- a/dlls/ddraw/mesa_private.h
+++ b/dlls/ddraw/mesa_private.h
@@ -60,7 +60,6 @@
 extern const GUID IID_D3DDEVICE2_OpenGL;
 extern const GUID IID_D3DDEVICE3_OpenGL;
 extern const GUID IID_D3DDEVICE7_OpenGL;
-extern const GUID IID_D3DDEVICE_Default;
 
 typedef struct render_state {
     /* This is used for the device mode */
@@ -123,7 +122,8 @@
 extern HRESULT d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surface);
 
 /* Used for Direct3D to request the device to enumerate itself */
-extern HRESULT d3device_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version) ;
+extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD interface_version) ;
+extern HRESULT d3ddevice_find(IDirect3DImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice, DWORD interface_version);
 
 /* Matrix copy WITH transposition */
 #define conv_mat2(mat,gl_mat)			\