Author: gbrunmar Date: Sat Aug 23 12:24:27 2008 New Revision: 35568
URL: http://svn.reactos.org/svn/reactos?rev=35568&view=rev Log: * Refactored GetDirect3D9AdapterInfo() to make life a little easier in InitD3D9BaseDevice(). * Filled IDirect3DDevice9::DeviceData[] with correct info
Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.c trunk/reactos/dll/directx/d3d9/d3d9_create.h trunk/reactos/dll/directx/d3d9/d3d9_device.c trunk/reactos/dll/directx/d3d9/d3d9_private.h trunk/reactos/dll/directx/d3d9/d3d9_swapchain.c trunk/reactos/dll/directx/d3d9/device.c
Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_creat... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_create.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_create.c [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -112,21 +112,14 @@ } }
-static BOOL GetDirect3D9AdapterInfo(IN OUT LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapters, IN DWORD AdapterIndex) +BOOL CreateD3D9DeviceData(IN LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapter, IN LPD3D9_DEVICEDATA pDeviceData) { HDC hDC; - LPD3D9_DEVICEDATA pDeviceData; - LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapter = &pDisplayAdapters[AdapterIndex];
/* Test DC creation for the display device */ if (NULL == (hDC = CreateDCA(NULL, pDisplayAdapter->szDeviceName, NULL, NULL))) - return FALSE; - - pDeviceData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(D3D9_DEVICEDATA)); - if (NULL == pDeviceData) - { - DPRINT1("Out of memory, could not initialize Direct3D adapter"); - DeleteDC(hDC); + { + DPRINT1("Could not create dc for display adapter: %s", pDisplayAdapter->szDeviceName); return FALSE; }
@@ -147,17 +140,39 @@
if (FALSE == GetDeviceData(pDeviceData)) { - DeleteDC(hDC); - HeapFree(GetProcessHeap(), 0, pDeviceData->pUnknown6BC); - HeapFree(GetProcessHeap(), 0, pDeviceData); - return FALSE; - } - - DeleteDC(hDC); + DPRINT1("Could not get device data for display adapter: %s", pDisplayAdapter->szDeviceName); + return FALSE; + } + + return TRUE; +} + +VOID DestroyD3D9DeviceData(IN LPD3D9_DEVICEDATA pDeviceData) +{ + DeleteDC(pDeviceData->hDC); + HeapFree(GetProcessHeap(), 0, pDeviceData->pUnknown6BC); +} + +static BOOL GetDirect3D9AdapterInfo(IN OUT LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapters, IN DWORD AdapterIndex) +{ + LPD3D9_DEVICEDATA pDeviceData; + + pDeviceData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(D3D9_DEVICEDATA)); + if (NULL == pDeviceData) + { + DPRINT1("Out of memory, could not initialize Direct3D adapter"); + return FALSE; + } + + if (FALSE == CreateD3D9DeviceData(&pDisplayAdapters[AdapterIndex], pDeviceData)) + { + DPRINT1("Could not create device data for adapter: %d", AdapterIndex); + return FALSE; + }
GetDisplayAdapterFromDevice(pDisplayAdapters, AdapterIndex, pDeviceData);
- HeapFree(GetProcessHeap(), 0, pDeviceData->pUnknown6BC); + DestroyD3D9DeviceData(pDeviceData); HeapFree(GetProcessHeap(), 0, pDeviceData);
return TRUE; @@ -232,9 +247,6 @@ if (pDirect3D9 == 0) return DDERR_OUTOFMEMORY;
- pDirect3D9->unknown000007 = 0; - pDirect3D9->lpInt = 0; - pDirect3D9->lpVtbl = &Direct3D9_Vtbl; pDirect3D9->dwProcessId = GetCurrentThreadId(); pDirect3D9->lRefCnt = 1; @@ -246,10 +258,15 @@
InitializeCriticalSection(&pDirect3D9->d3d9_cs);
- GetDisplayDeviceInfo(pDirect3D9); + if (FALSE == GetDisplayDeviceInfo(pDirect3D9)) + { + DPRINT1("Could not create Direct3D9 object"); + AlignedFree(pDirect3D9); + return DDERR_GENERIC; + }
*ppDirect3D9 = (LPDIRECT3D9)&pDirect3D9->lpVtbl;
- return ERROR_SUCCESS; -} - + return D3D_OK; +} +
Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_creat... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_create.h [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_create.h [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -15,4 +15,7 @@ /* Creates a Direct3D9 object */ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion);
+BOOL CreateD3D9DeviceData(IN LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapter, IN LPD3D9_DEVICEDATA pDeviceData); +VOID DestroyD3D9DeviceData(IN LPD3D9_DEVICEDATA pDeviceData); + #endif // _D3D9_CREATE_H_
Modified: trunk/reactos/dll/directx/d3d9/d3d9_device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_devic... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_device.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_device.c [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -8,7 +8,8 @@ #include "d3d9_device.h" #include "d3d9_helpers.h" #include "adapter.h" -#include "debug.h" +#include <debug.h> +#include "d3d9_create.h"
#define LOCK_D3DDEVICE9() if (This->bLockDevice) EnterCriticalSection(&This->CriticalSection); #define UNLOCK_D3DDEVICE9() if (This->bLockDevice) LeaveCriticalSection(&This->CriticalSection); @@ -53,8 +54,16 @@
if (ref == 0) { + DWORD iAdapter; + EnterCriticalSection(&This->CriticalSection); + /* TODO: Free resources here */ + for (iAdapter = 0; iAdapter < This->NumAdaptersInDevice; iAdapter++) + { + DestroyD3D9DeviceData(&This->DeviceData[iAdapter]); + } + LeaveCriticalSection(&This->CriticalSection); AlignedFree(This); }
Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_priva... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -2667,6 +2667,6 @@ /* 0x47ac */ DWORD unknown004587; /* 0x47b0 */ DWORD unknown004588; /* 0x47b4 */ UINT SDKVersion; -} DIRECT3D9_INT, *LPDIRECT3D9_INT; +} DIRECT3D9_INT, FAR *LPDIRECT3D9_INT;
#endif // _D3D9_PRIVATE_H_
Modified: trunk/reactos/dll/directx/d3d9/d3d9_swapchain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_swapc... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_swapchain.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_swapchain.c [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -150,6 +150,8 @@ pThisSwapChain->GammaRamp.blue[i] = i; }
+ pThisSwapChain->PresentParameters = pPresentationParameters[pThisSwapChain->ChainIndex]; + return Direct3DSwapChain9_Reset(pThisSwapChain, pPresentationParameters); }
Modified: trunk/reactos/dll/directx/d3d9/device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/device.c?r... ============================================================================== --- trunk/reactos/dll/directx/d3d9/device.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/device.c [iso-8859-1] Sat Aug 23 12:24:27 2008 @@ -9,6 +9,7 @@ #include "device.h" #include <debug.h> #include "d3d9_helpers.h" +#include "d3d9_create.h"
static HRESULT InitD3D9ResourceManager(D3D9ResourceManager* pThisResourceManager, LPDIRECT3DDEVICE9_INT pDirect3DDevice9) { @@ -36,7 +37,6 @@ { D3D9ResourceManager* pResourceManager; DWORD i; - D3DDISPLAYMODE DisplayMode;
// Insert Reset/Ctor here
@@ -59,16 +59,25 @@ // TODO: Query driver for correct DX version pThisBaseDevice->dwDXVersion = 9;
- DisplayMode = pThisBaseDevice->CurrentDisplayMode[0]; + pThisBaseDevice->CurrentDisplayMode[0].Width = pDirect3D9->DisplayAdapters[0].DriverCaps.dwDisplayWidth; + pThisBaseDevice->CurrentDisplayMode[0].Height = pDirect3D9->DisplayAdapters[0].DriverCaps.dwDisplayHeight; + pThisBaseDevice->CurrentDisplayMode[0].RefreshRate = pDirect3D9->DisplayAdapters[0].DriverCaps.dwRefreshRate; + pThisBaseDevice->CurrentDisplayMode[0].Format = pDirect3D9->DisplayAdapters[0].DriverCaps.DisplayFormat; + for (i = 0; i < NumAdaptersToCreate; i++) { + if (FALSE == CreateD3D9DeviceData(&pDirect3D9->DisplayAdapters[i], &pThisBaseDevice->DeviceData[i])) + { + DPRINT1("Failed to get device data for adapter: %d", i); + return DDERR_GENERIC; + } + + pThisBaseDevice->AdapterIndexInGroup[i] = i; pThisBaseDevice->CurrentDisplayMode[i] = pThisBaseDevice->CurrentDisplayMode[0]; - pThisBaseDevice->AdapterIndexInGroup[i] = i; - // TODO: Fill pThisBaseDevice->DeviceData[i]
pThisBaseDevice->pSwapChains[i] = CreateDirect3DSwapChain9(RT_BUILTIN, pThisBaseDevice, i); pThisBaseDevice->pSwapChains2[i] = pThisBaseDevice->pSwapChains[i]; - Direct3DSwapChain9_SetDisplayMode(pThisBaseDevice->pSwapChains[i], &DisplayMode); + Direct3DSwapChain9_SetDisplayMode(pThisBaseDevice->pSwapChains[i], &pThisBaseDevice->CurrentDisplayMode[i]);
if (FAILED(Direct3DSwapChain9_Init(pThisBaseDevice->pSwapChains[i], pPresentationParameters))) {