From 07147e6a3ca86dec8f0fafe6eae950eeb352c6d7 Mon Sep 17 00:00:00 2001 From: Gregor Brunmar Date: Sat, 23 Aug 2008 17:24:27 +0000 Subject: [PATCH] * Refactored GetDirect3D9AdapterInfo() to make life a little easier in InitD3D9BaseDevice(). * Filled IDirect3DDevice9::DeviceData[] with correct info svn path=/trunk/; revision=35568 --- reactos/dll/directx/d3d9/d3d9_create.c | 55 +++++++++++++++-------- reactos/dll/directx/d3d9/d3d9_create.h | 3 ++ reactos/dll/directx/d3d9/d3d9_device.c | 11 ++++- reactos/dll/directx/d3d9/d3d9_private.h | 2 +- reactos/dll/directx/d3d9/d3d9_swapchain.c | 2 + reactos/dll/directx/d3d9/device.c | 19 +++++--- 6 files changed, 66 insertions(+), 26 deletions(-) diff --git a/reactos/dll/directx/d3d9/d3d9_create.c b/reactos/dll/directx/d3d9/d3d9_create.c index 2b8da3fdff5..b92308f05e1 100644 --- a/reactos/dll/directx/d3d9/d3d9_create.c +++ b/reactos/dll/directx/d3d9/d3d9_create.c @@ -112,21 +112,14 @@ void GetDisplayAdapterFromDevice(IN OUT LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapt } } -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 @@ static BOOL GetDirect3D9AdapterInfo(IN OUT LPDIRECT3D9_DISPLAYADAPTER pDisplayAd if (FALSE == GetDeviceData(pDeviceData)) { - DeleteDC(hDC); - HeapFree(GetProcessHeap(), 0, pDeviceData->pUnknown6BC); - HeapFree(GetProcessHeap(), 0, pDeviceData); + DPRINT1("Could not get device data for display adapter: %s", pDisplayAdapter->szDeviceName); return FALSE; } - DeleteDC(hDC); + 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 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion) 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 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion) 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; } diff --git a/reactos/dll/directx/d3d9/d3d9_create.h b/reactos/dll/directx/d3d9/d3d9_create.h index ce2c866c1cc..a9e31e3e0bd 100644 --- a/reactos/dll/directx/d3d9/d3d9_create.h +++ b/reactos/dll/directx/d3d9/d3d9_create.h @@ -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_ diff --git a/reactos/dll/directx/d3d9/d3d9_device.c b/reactos/dll/directx/d3d9/d3d9_device.c index c922ea237bc..b9153135c47 100644 --- a/reactos/dll/directx/d3d9/d3d9_device.c +++ b/reactos/dll/directx/d3d9/d3d9_device.c @@ -8,7 +8,8 @@ #include "d3d9_device.h" #include "d3d9_helpers.h" #include "adapter.h" -#include "debug.h" +#include +#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 @@ static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9 iface) 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); } diff --git a/reactos/dll/directx/d3d9/d3d9_private.h b/reactos/dll/directx/d3d9/d3d9_private.h index 44fc02f7df3..cba2c867d70 100644 --- a/reactos/dll/directx/d3d9/d3d9_private.h +++ b/reactos/dll/directx/d3d9/d3d9_private.h @@ -2667,6 +2667,6 @@ typedef struct _DIRECT3D9_INT /* 0x47ac */ DWORD unknown004587; /* 0x47b0 */ DWORD unknown004588; /* 0x47b4 */ UINT SDKVersion; -} DIRECT3D9_INT, *LPDIRECT3D9_INT; +} DIRECT3D9_INT, FAR *LPDIRECT3D9_INT; #endif // _D3D9_PRIVATE_H_ diff --git a/reactos/dll/directx/d3d9/d3d9_swapchain.c b/reactos/dll/directx/d3d9/d3d9_swapchain.c index d91369897bb..d9feed52f07 100644 --- a/reactos/dll/directx/d3d9/d3d9_swapchain.c +++ b/reactos/dll/directx/d3d9/d3d9_swapchain.c @@ -150,6 +150,8 @@ HRESULT Direct3DSwapChain9_Init(Direct3DSwapChain9_INT* pThisSwapChain, D3DPRESE pThisSwapChain->GammaRamp.blue[i] = i; } + pThisSwapChain->PresentParameters = pPresentationParameters[pThisSwapChain->ChainIndex]; + return Direct3DSwapChain9_Reset(pThisSwapChain, pPresentationParameters); } diff --git a/reactos/dll/directx/d3d9/device.c b/reactos/dll/directx/d3d9/device.c index c6ec6b22d47..de043b9a344 100644 --- a/reactos/dll/directx/d3d9/device.c +++ b/reactos/dll/directx/d3d9/device.c @@ -9,6 +9,7 @@ #include "device.h" #include #include "d3d9_helpers.h" +#include "d3d9_create.h" static HRESULT InitD3D9ResourceManager(D3D9ResourceManager* pThisResourceManager, LPDIRECT3DDEVICE9_INT pDirect3DDevice9) { @@ -36,7 +37,6 @@ HRESULT InitD3D9BaseDevice(LPDIRECT3DDEVICE9_INT pThisBaseDevice, LPDIRECT3D9_IN { D3D9ResourceManager* pResourceManager; DWORD i; - D3DDISPLAYMODE DisplayMode; // Insert Reset/Ctor here @@ -59,16 +59,25 @@ HRESULT InitD3D9BaseDevice(LPDIRECT3DDEVICE9_INT pThisBaseDevice, LPDIRECT3D9_IN // 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++) { - pThisBaseDevice->CurrentDisplayMode[i] = pThisBaseDevice->CurrentDisplayMode[0]; + 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; - // TODO: Fill pThisBaseDevice->DeviceData[i] + pThisBaseDevice->CurrentDisplayMode[i] = pThisBaseDevice->CurrentDisplayMode[0]; 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))) {