David Hedberg : ddraw:
Enumerate additional devices in IDirect3D7_EnumDevices.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Sep 10 10:18:07 CDT 2007
Module: wine
Branch: master
Commit: 019cc506a8a87b03fb8ec93d16e4c71cb6c3e0ad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=019cc506a8a87b03fb8ec93d16e4c71cb6c3e0ad
Author: David Hedberg <david.hedberg at gmail.com>
Date: Fri Sep 7 13:15:26 2007 +0200
ddraw: Enumerate additional devices in IDirect3D7_EnumDevices.
---
dlls/ddraw/direct3d.c | 18 ++++++++++++---
dlls/ddraw/tests/d3d.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
index f0c3516..ef31046 100644
--- a/dlls/ddraw/direct3d.c
+++ b/dlls/ddraw/direct3d.c
@@ -230,7 +230,7 @@ IDirect3DImpl_1_Initialize(IDirect3D *iface,
* IDirect3D7::EnumDevices
*
* The EnumDevices method for IDirect3D7. It enumerates all supported
- * D3D7 devices. Currently there's only one.
+ * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated.
*
* Params:
* Callback: Function to call for each enumerated device
@@ -246,8 +246,12 @@ IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface,
void *Context)
{
ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
- char interface_name[] = "WINE Direct3D7 using WineD3D";
- char device_name[] = "Wine D3D7 device";
+ char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D";
+ char device_name_tnl[] = "Wine D3D7 T&L HAL";
+ char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D";
+ char device_name_hal[] = "Wine D3D7 HAL";
+ char interface_name_rgb[] = "WINE Direct3D7 RGB Software Emulation using WineD3D";
+ char device_name_rgb[] = "Wine D3D7 RGB";
D3DDEVICEDESC7 ddesc;
D3DDEVICEDESC oldDesc;
HRESULT hr;
@@ -262,7 +266,13 @@ IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface,
LeaveCriticalSection(&ddraw_cs);
return hr;
}
- Callback(interface_name, device_name, &ddesc, Context);
+ Callback(interface_name_tnl, device_name_tnl, &ddesc, Context);
+
+ ddesc.deviceGUID = IID_IDirect3DHALDevice;
+ Callback(interface_name_hal, device_name_hal, &ddesc, Context);
+
+ ddesc.deviceGUID = IID_IDirect3DRGBDevice;
+ Callback(interface_name_rgb, device_name_rgb, &ddesc, Context);
TRACE("(%p) End of enumeration\n", This);
LeaveCriticalSection(&ddraw_cs);
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index 054df51..f154a3a 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -33,6 +33,14 @@ static LPDIRECT3DVERTEXBUFFER7 lpVBufSrc = NULL;
static LPDIRECT3DVERTEXBUFFER7 lpVBufDest1 = NULL;
static LPDIRECT3DVERTEXBUFFER7 lpVBufDest2 = NULL;
+typedef struct {
+ int total;
+ int rgb;
+ int hal;
+ int tnlhal;
+ int unk;
+} D3D7ETest;
+
/* To compare bad floating point numbers. Not the ideal way to do it,
* but it should be enough for here */
#define comparefloat(a, b) ( (((a) - (b)) < 0.0001) && (((a) - (b)) > -0.0001) )
@@ -789,6 +797,51 @@ static HRESULT WINAPI enumDevicesCallback(GUID *Guid,LPSTR DeviceDescription,LPS
return DDENUMRET_OK;
}
+static HRESULT WINAPI enumDevicesCallbackTest7(LPSTR DeviceDescription, LPSTR DeviceName, LPD3DDEVICEDESC7 lpdd7, LPVOID Context)
+{
+ D3D7ETest *d3d7et = (D3D7ETest*)Context;
+ if(IsEqualGUID(&lpdd7->deviceGUID, &IID_IDirect3DRGBDevice))
+ d3d7et->rgb++;
+ else if(IsEqualGUID(&lpdd7->deviceGUID, &IID_IDirect3DHALDevice))
+ d3d7et->hal++;
+ else if(IsEqualGUID(&lpdd7->deviceGUID, &IID_IDirect3DTnLHalDevice))
+ d3d7et->tnlhal++;
+ else
+ d3d7et->unk++;
+
+ d3d7et->total++;
+
+ return DDENUMRET_OK;
+}
+
+
+/* Check the deviceGUID of devices enumerated by
+ IDirect3D7_EnumDevices. */
+static void D3D7EnumTest(void)
+{
+ D3D7ETest d3d7et;
+
+ if (!lpD3D) {
+ skip("No Direct3D7 interface.\n");
+ return;
+ }
+
+ memset(&d3d7et, 0, sizeof(d3d7et));
+ IDirect3D7_EnumDevices(lpD3D, enumDevicesCallbackTest7, (LPVOID) &d3d7et);
+
+
+ /* A couple of games (Delta Force LW and TFD) rely on this behaviour */
+ ok(d3d7et.tnlhal < d3d7et.total, "TnLHal device enumerated as only device.\n");
+
+ /* We make two additional assumptions. */
+ ok(d3d7et.rgb, "No RGB Device enumerated.\n");
+
+ if(d3d7et.tnlhal)
+ ok(d3d7et.hal, "TnLHal device enumerated, but no Hal device found.\n");
+
+ return;
+}
+
static void CapsTest(void)
{
IDirect3D3 *d3d3;
@@ -1221,6 +1274,7 @@ START_TEST(d3d)
StateTest();
SceneTest();
LimitTest();
+ D3D7EnumTest();
CapsTest();
ReleaseDirect3D();
Direct3D1Test();
More information about the wine-cvs
mailing list