ddraw: Enumerate additional devices in IDirect3D7_EnumDevices.
This commit is contained in:
parent
8d32a490a1
commit
019cc506a8
|
@ -230,7 +230,7 @@ IDirect3DImpl_1_Initialize(IDirect3D *iface,
|
||||||
* IDirect3D7::EnumDevices
|
* IDirect3D7::EnumDevices
|
||||||
*
|
*
|
||||||
* The EnumDevices method for IDirect3D7. It enumerates all supported
|
* 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:
|
* Params:
|
||||||
* Callback: Function to call for each enumerated device
|
* Callback: Function to call for each enumerated device
|
||||||
|
@ -246,8 +246,12 @@ IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface,
|
||||||
void *Context)
|
void *Context)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
|
ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
|
||||||
char interface_name[] = "WINE Direct3D7 using WineD3D";
|
char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D";
|
||||||
char device_name[] = "Wine D3D7 device";
|
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;
|
D3DDEVICEDESC7 ddesc;
|
||||||
D3DDEVICEDESC oldDesc;
|
D3DDEVICEDESC oldDesc;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -262,7 +266,13 @@ IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface,
|
||||||
LeaveCriticalSection(&ddraw_cs);
|
LeaveCriticalSection(&ddraw_cs);
|
||||||
return hr;
|
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);
|
TRACE("(%p) End of enumeration\n", This);
|
||||||
LeaveCriticalSection(&ddraw_cs);
|
LeaveCriticalSection(&ddraw_cs);
|
||||||
|
|
|
@ -33,6 +33,14 @@ static LPDIRECT3DVERTEXBUFFER7 lpVBufSrc = NULL;
|
||||||
static LPDIRECT3DVERTEXBUFFER7 lpVBufDest1 = NULL;
|
static LPDIRECT3DVERTEXBUFFER7 lpVBufDest1 = NULL;
|
||||||
static LPDIRECT3DVERTEXBUFFER7 lpVBufDest2 = 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,
|
/* To compare bad floating point numbers. Not the ideal way to do it,
|
||||||
* but it should be enough for here */
|
* but it should be enough for here */
|
||||||
#define comparefloat(a, b) ( (((a) - (b)) < 0.0001) && (((a) - (b)) > -0.0001) )
|
#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;
|
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)
|
static void CapsTest(void)
|
||||||
{
|
{
|
||||||
IDirect3D3 *d3d3;
|
IDirect3D3 *d3d3;
|
||||||
|
@ -1221,6 +1274,7 @@ START_TEST(d3d)
|
||||||
StateTest();
|
StateTest();
|
||||||
SceneTest();
|
SceneTest();
|
||||||
LimitTest();
|
LimitTest();
|
||||||
|
D3D7EnumTest();
|
||||||
CapsTest();
|
CapsTest();
|
||||||
ReleaseDirect3D();
|
ReleaseDirect3D();
|
||||||
Direct3D1Test();
|
Direct3D1Test();
|
||||||
|
|
Loading…
Reference in New Issue