* Made IDirect3D9 structure more MS compatible.
authorGregor Brunmar <gbrunmar.ros@gmail.com>
Wed, 12 Mar 2008 19:29:10 +0000 (19:29 +0000)
committerGregor Brunmar <gbrunmar.ros@gmail.com>
Wed, 12 Mar 2008 19:29:10 +0000 (19:29 +0000)
* Removed duplicate initing of internal structure
* Started implementing IDirect3D9::CreateDevice() error return values

svn path=/trunk/; revision=32668

reactos/dll/directx/d3d9/d3d9_caps.c
reactos/dll/directx/d3d9/d3d9_create.c
reactos/dll/directx/d3d9/d3d9_impl.c
reactos/dll/directx/d3d9/d3d9_private.h

index b934e53..4fce372 100644 (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;
         }
 
 
index 0f6f374..91bf49d 100644 (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;
index 6cffefb..7d065af 100644 (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;
index bfa931f..109f94d 100644 (file)
 #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;