2008-08-23 15:01:19 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS ReactX
|
|
|
|
* FILE: dll/directx/d3d9/device.c
|
|
|
|
* PURPOSE: Direct3D9's device creation
|
|
|
|
* PROGRAMERS: Gregor Gullwi <gbrunmar (dot) ros (at) gmail (dot) com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "device.h"
|
|
|
|
#include <debug.h>
|
|
|
|
#include "d3d9_helpers.h"
|
2008-08-23 17:24:27 +00:00
|
|
|
#include "d3d9_create.h"
|
2008-08-23 15:01:19 +00:00
|
|
|
|
|
|
|
static HRESULT InitD3D9ResourceManager(D3D9ResourceManager* pThisResourceManager, LPDIRECT3DDEVICE9_INT pDirect3DDevice9)
|
|
|
|
{
|
|
|
|
DWORD MaxSimultaneousTextures;
|
|
|
|
|
|
|
|
MaxSimultaneousTextures = max(1, pDirect3DDevice9->DeviceData[0].DriverCaps.DriverCaps9.MaxSimultaneousTextures);
|
|
|
|
|
|
|
|
if (FAILED(AlignedAlloc((LPVOID *)&pThisResourceManager->pTextureHeap, sizeof(DWORD) + MaxSimultaneousTextures * sizeof(int) * 3)))
|
|
|
|
{
|
|
|
|
DPRINT1("Could not allocate texture heap");
|
|
|
|
return DDERR_OUTOFMEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Init texture heap
|
|
|
|
|
|
|
|
pThisResourceManager->MaxSimultaneousTextures = MaxSimultaneousTextures;
|
|
|
|
pThisResourceManager->pBaseDevice = pDirect3DDevice9;
|
|
|
|
|
|
|
|
return D3D_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT InitD3D9BaseDevice(LPDIRECT3DDEVICE9_INT pThisBaseDevice, LPDIRECT3D9_INT pDirect3D9,
|
|
|
|
UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags,
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentationParameters, DWORD NumAdaptersToCreate)
|
|
|
|
{
|
|
|
|
D3D9ResourceManager* pResourceManager;
|
|
|
|
DWORD i;
|
|
|
|
|
|
|
|
// Insert Reset/Ctor here
|
|
|
|
|
|
|
|
if (FAILED(AlignedAlloc((LPVOID *)&pResourceManager, sizeof(D3D9ResourceManager))) ||
|
|
|
|
FAILED(InitD3D9ResourceManager(pResourceManager, pThisBaseDevice)))
|
|
|
|
{
|
|
|
|
DPRINT1("Could not create resource manager");
|
|
|
|
return DDERR_OUTOFMEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
pThisBaseDevice->pResourceManager = pResourceManager;
|
|
|
|
|
2008-08-31 11:36:55 +00:00
|
|
|
pThisBaseDevice->lpVtbl = &Direct3DDevice9HAL_Vtbl;
|
2008-08-24 09:34:16 +00:00
|
|
|
pThisBaseDevice->lRefCnt = 1;
|
2008-08-24 10:15:44 +00:00
|
|
|
pThisBaseDevice->dwProcessId = GetCurrentThreadId();
|
|
|
|
pThisBaseDevice->pUnknown = (IUnknown*) &pThisBaseDevice->lpVtbl;
|
|
|
|
InitializeCriticalSection(&pThisBaseDevice->CriticalSection);
|
|
|
|
|
2008-08-23 15:01:19 +00:00
|
|
|
pThisBaseDevice->pDirect3D9 = pDirect3D9;
|
|
|
|
pThisBaseDevice->DeviceType = DeviceType;
|
|
|
|
pThisBaseDevice->hWnd = hFocusWindow;
|
|
|
|
pThisBaseDevice->AdjustedBehaviourFlags = BehaviourFlags;
|
|
|
|
pThisBaseDevice->BehaviourFlags = BehaviourFlags;
|
|
|
|
pThisBaseDevice->NumAdaptersInDevice = NumAdaptersToCreate;
|
|
|
|
|
|
|
|
// TODO: Query driver for correct DX version
|
|
|
|
pThisBaseDevice->dwDXVersion = 9;
|
|
|
|
|
|
|
|
for (i = 0; i < NumAdaptersToCreate; i++)
|
|
|
|
{
|
2008-08-23 17:24:27 +00:00
|
|
|
if (FALSE == CreateD3D9DeviceData(&pDirect3D9->DisplayAdapters[i], &pThisBaseDevice->DeviceData[i]))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to get device data for adapter: %d", i);
|
|
|
|
return DDERR_GENERIC;
|
|
|
|
}
|
|
|
|
|
2008-08-23 15:01:19 +00:00
|
|
|
pThisBaseDevice->AdapterIndexInGroup[i] = i;
|
2008-08-23 17:52:35 +00:00
|
|
|
pThisBaseDevice->CurrentDisplayMode[i].Width = pDirect3D9->DisplayAdapters[i].DriverCaps.dwDisplayWidth;
|
|
|
|
pThisBaseDevice->CurrentDisplayMode[i].Height = pDirect3D9->DisplayAdapters[i].DriverCaps.dwDisplayHeight;
|
|
|
|
pThisBaseDevice->CurrentDisplayMode[i].RefreshRate = pDirect3D9->DisplayAdapters[i].DriverCaps.dwRefreshRate;
|
|
|
|
pThisBaseDevice->CurrentDisplayMode[i].Format = pDirect3D9->DisplayAdapters[i].DriverCaps.RawDisplayFormat;
|
2008-08-23 15:01:19 +00:00
|
|
|
|
|
|
|
pThisBaseDevice->pSwapChains[i] = CreateDirect3DSwapChain9(RT_BUILTIN, pThisBaseDevice, i);
|
|
|
|
pThisBaseDevice->pSwapChains2[i] = pThisBaseDevice->pSwapChains[i];
|
|
|
|
|
|
|
|
if (FAILED(Direct3DSwapChain9_Init(pThisBaseDevice->pSwapChains[i], pPresentationParameters)))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to init swap chain: %d", i);
|
|
|
|
return DDERR_GENERIC;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return D3D_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT CreateD3D9HalDevice(LPDIRECT3D9_INT pDirect3D9, UINT Adapter,
|
|
|
|
HWND hFocusWindow, DWORD BehaviourFlags,
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentationParameters,
|
|
|
|
DWORD NumAdaptersToCreate,
|
|
|
|
struct IDirect3DDevice9** ppReturnedDeviceInterface)
|
|
|
|
{
|
|
|
|
HRESULT Ret;
|
|
|
|
|
|
|
|
if (FAILED(AlignedAlloc((LPVOID *)ppReturnedDeviceInterface, sizeof(D3D9HALDEVICE))))
|
|
|
|
{
|
|
|
|
DPRINT1("Not enough memory to create HAL device");
|
|
|
|
return DDERR_OUTOFMEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ret = InitD3D9BaseDevice((LPDIRECT3DDEVICE9_INT)*ppReturnedDeviceInterface, pDirect3D9, Adapter,
|
|
|
|
D3DDEVTYPE_HAL, hFocusWindow, BehaviourFlags,
|
|
|
|
pPresentationParameters, NumAdaptersToCreate);
|
|
|
|
|
|
|
|
if (FAILED(Ret))
|
|
|
|
{
|
|
|
|
AlignedFree((LPVOID)*ppReturnedDeviceInterface);
|
|
|
|
return Ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return D3D_OK;
|
|
|
|
}
|