Module: wine Branch: refs/heads/master Commit: 546a60ff2f26899d4bfcfead49afdb21987b4528 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=546a60ff2f26899d4bfcfead...
Author: Stefan Dösinger stefandoesinger@gmx.at Date: Sat Jun 24 16:17:10 2006 +0200
ddraw: Enumerate the reference d3ddevice.
---
dlls/ddraw/ddraw.c | 4 ++++ dlls/ddraw/ddraw_private.h | 3 ++- dlls/ddraw/direct3d.c | 26 +++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 5fad1cd..ca0258e 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -159,21 +159,25 @@ IDirectDrawImpl_QueryInterface(IDirectDr
if ( IsEqualGUID( &IID_IDirect3D , refiid ) ) { + This->d3dversion = 1; *obj = ICOM_INTERFACE(This, IDirect3D); TRACE(" returning Direct3D interface at %p.\n", *obj); } else if ( IsEqualGUID( &IID_IDirect3D2 , refiid ) ) { + This->d3dversion = 2; *obj = ICOM_INTERFACE(This, IDirect3D2); TRACE(" returning Direct3D2 interface at %p.\n", *obj); } else if ( IsEqualGUID( &IID_IDirect3D3 , refiid ) ) { + This->d3dversion = 3; *obj = ICOM_INTERFACE(This, IDirect3D3); TRACE(" returning Direct3D3 interface at %p.\n", *obj); } else if(IsEqualGUID( &IID_IDirect3D7 , refiid )) { + This->d3dversion = 7; *obj = ICOM_INTERFACE(This, IDirect3D7); TRACE(" returning Direct3D7 interface at %p.\n", *obj); } diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 905e42f..8994c29 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -119,13 +119,14 @@ struct IDirectDrawImpl IDirectDrawSurfaceImpl *d3d_target; HWND d3d_window; IDirect3DDeviceImpl *d3ddevice; + int d3dversion;
/* Varios HWNDs */ HWND focuswindow; HWND devicewindow;
/* The surface type to request */ - WINED3DSURFTYPE ImplType; + WINED3DSURFTYPE ImplType;
/* The surface list - can't relay this to WineD3D * because of IParent diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 23efef9..e0b6dcb 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -276,7 +276,7 @@ IDirect3DImpl_3_EnumDevices(IDirect3D3 * hr = IDirect3DImpl_GetCaps(This->wineD3D, &dref, &newDesc); if(hr != D3D_OK) return hr;
- /* Do I have to enumerate the reference id? I try without. Note from old d3d7: + /* Do I have to enumerate the reference id? Note from old d3d7: * "It seems that enumerating the reference IID on Direct3D 1 games * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1 * @@ -284,14 +284,34 @@ IDirect3DImpl_3_EnumDevices(IDirect3D3 * * which enables / disables enumerating the reference rasterizer. It's a DWORD, * 0 means disabled, 2 means enabled. The enablerefrast.reg and disablerefrast.reg * files in the DirectX 7.0 sdk demo directory suggest this. + * + * Some games(GTA 2) seem to use the secound enumerated device, so I have to enumerate + * at least 2 devices. So enumerate the reference device to have 2 devices. */
+ if(This->d3dversion != 1) + { + TRACE("(%p) Enumerating WineD3D D3DDevice interface\n", This); + d1 = dref; + d2 = dref; + hr = Callback( (LPIID) &IID_IDirect3DRefDevice, "Reference Direct3D ID", device_name, &d1, &d2, Context); + if(hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration\n"); + return D3D_OK; + } + } + TRACE("(%p) Enumerating WineD3D D3DDevice interface\n", This); d1 = dref; d2 = dref; - Callback( (LPIID) &IID_D3DDEVICE_WineD3D, "Wine D3DDevice using WineD3D and OpenGL", device_name, &d1, &d2, Context); + hr = Callback( (LPIID) &IID_D3DDEVICE_WineD3D, "Wine D3DDevice using WineD3D and OpenGL", device_name, &d1, &d2, Context); + if(hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration\n"); + return D3D_OK; + } TRACE("(%p) End of enumeration\n", This); - if(hr != D3DENUMRET_OK) return D3D_OK;
return D3D_OK; }