- 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) \