* Made IDirect3D9 structure more MS compatible.

* Removed duplicate initing of internal structure
* Started implementing IDirect3D9::CreateDevice() error return values

svn path=/trunk/; revision=32668
This commit is contained in:
Gregor Brunmar 2008-03-12 19:29:10 +00:00
parent bae787dbd9
commit 8bca78461c
4 changed files with 59 additions and 13 deletions

View file

@ -502,6 +502,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC_INT* pUnknown6BC,
memcpy(&pDriverCaps->DriverCaps9, &DriverCaps8, sizeof(D3DCAPS8));
pDriverCaps->DriverCaps9.Caps = HalInfo.ddCaps.dwCaps;
pDriverCaps->dwDriverCaps |= D3D9_INT_D3DCAPS8_VALID;
}
}
@ -524,6 +525,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC_INT* pUnknown6BC,
pDriverCaps->DriverCaps9 = DriverCaps9;
pDriverCaps->DriverCaps9.Caps = HalInfo.ddCaps.dwCaps;
pDriverCaps->dwDriverCaps |= D3D9_INT_D3DCAPS9_VALID;
}

View file

@ -177,7 +177,7 @@ static BOOL GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9)
AdapterIndex = 0;
while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE &&
pDirect3D9->NumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS)
pDirect3D9->NumDisplayAdapters < D3D9_INT_MAX_NUM_ADAPTERS)
{
if ((DisplayDevice.StateFlags & (DISPLAY_DEVICE_DISCONNECT | DISPLAY_DEVICE_MIRRORING_DRIVER)) == 0 &&
(DisplayDevice.StateFlags & (DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) != 0)
@ -196,7 +196,7 @@ static BOOL GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9)
AdapterIndex = 0;
while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE &&
pDirect3D9->NumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS)
pDirect3D9->NumDisplayAdapters < D3D9_INT_MAX_NUM_ADAPTERS)
{
if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0 &&
(DisplayDevice.StateFlags & (DISPLAY_DEVICE_MIRRORING_DRIVER | DISPLAY_DEVICE_PRIMARY_DEVICE)) == 0)
@ -240,13 +240,6 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion)
pDirect3D9->dwProcessId = GetCurrentThreadId();
pDirect3D9->dwRefCnt = 1;
pDirect3D9->unknown004576 = 0;
pDirect3D9->unknown004578 = 0;
pDirect3D9->unknown004579 = 0;
pDirect3D9->unknown004580 = 0;
pDirect3D9->unknown004581 = 0;
pDirect3D9->unknown004582 = 0;
pDirect3D9->unknown004583 = 0;
pDirect3D9->SDKVersion = SDKVersion;
pDirect3D9->lpInt = pDirect3D9;
@ -254,7 +247,6 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion)
InitializeCriticalSection(&pDirect3D9->d3d9_cs);
memset(pDirect3D9->DisplayAdapters, 0, sizeof(pDirect3D9->DisplayAdapters));
GetDisplayDeviceInfo(pDirect3D9);
*ppDirect3D9 = (LPDIRECT3D9)&pDirect3D9->lpVtbl;

View file

@ -881,6 +881,55 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapte
D3DPRESENT_PARAMETERS* pPresentationParameters,
struct IDirect3DDevice9** ppReturnedDeviceInterface)
{
DWORD NumAdaptersToCreate;
LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface);
LOCK_D3D9();
if (Adapter >= This->NumDisplayAdapters)
{
DPRINT1("Invalid Adapter number specified");
UNLOCK_D3D9();
return D3DERR_INVALIDCALL;
}
if (DeviceType != D3DDEVTYPE_HAL &&
DeviceType != D3DDEVTYPE_REF &&
DeviceType != D3DDEVTYPE_SW)
{
DPRINT1("Invalid DeviceType specified");
UNLOCK_D3D9();
return D3DERR_INVALIDCALL;
}
if (DeviceType != D3DDEVTYPE_HAL)
{
UNIMPLEMENTED
DPRINT1("Sorry, only D3DDEVTYPE_HAL is implemented at this time...");
return D3DERR_INVALIDCALL;
}
if (hFocusWindow != NULL && FALSE == IsWindow(hFocusWindow))
{
DPRINT1("Invalid hFocusWindow parameter specified");
UNLOCK_D3D9();
return D3DERR_INVALIDCALL;
}
if (IsBadWritePtr(ppReturnedDeviceInterface, sizeof(IDirect3DDevice9*)))
{
DPRINT1("Invalid ppReturnedDeviceInterface parameter specified");
UNLOCK_D3D9();
return D3DERR_INVALIDCALL;
}
if ((BehaviourFlags & D3DCREATE_ADAPTERGROUP_DEVICE) != 0)
NumAdaptersToCreate = This->DisplayAdapters[Adapter].NumAdaptersInGroup;
else
NumAdaptersToCreate = 1;
*ppReturnedDeviceInterface = 0;
UNIMPLEMENTED
return D3D_OK;

View file

@ -11,7 +11,10 @@
#include <windows.h>
#include <ddraw.h>
#define DX_D3D9_MAX_NUM_ADAPTERS 12
#define D3D9_INT_MAX_NUM_ADAPTERS 12
#define D3D9_INT_D3DCAPS8_VALID 1
#define D3D9_INT_D3DCAPS9_VALID 2
typedef struct _D3D9Unknown6BC_INT_
{
@ -64,7 +67,7 @@ typedef struct _tagD3D9_DRIVERCAPS
/* 0x0148 */ DWORD dwSVBCaps;
/* 0x014c */ DWORD dwVSBCaps;
/* 0x0150 */ DWORD dwSVBCaps2;
/* 0x0154 */ DWORD unknown0085;
/* 0x0154 */ DWORD dwDriverCaps;
/* 0x0158 */ DWORD NumSupportedFormatOps;
/* 0x015c */ LPDDSURFACEDESC pSupportedFormatOps;
/* 0x0160 */ DWORD unknown0088;
@ -162,7 +165,7 @@ typedef struct _tagDIRECT3D9_INT_
/* 0x0024 */ struct _tagDIRECT3D9_INT_ *lpInt;
/* 0x0028 */ LONG dwRefCnt; /* Increases and decreases by AddRef() and Release() */
/* 0x002c */ UINT NumDisplayAdapters;
/* 0x0030 */ Direct3D9DisplayAdapterInfo_INT DisplayAdapters[DX_D3D9_MAX_NUM_ADAPTERS];
/* 0x0030 */ Direct3D9DisplayAdapterInfo_INT DisplayAdapters[D3D9_INT_MAX_NUM_ADAPTERS];
/* 0x2100 */ DWORD unknown002112;
/* 0x2104 */ DWORD unknown002113;
/* 0x2108 */ DWORD unknown002114;