ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

device.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS ReactX
00004  * FILE:            dll/directx/d3d9/device.c
00005  * PURPOSE:         Direct3D9's device creation
00006  * PROGRAMERS:      Gregor Gullwi <gbrunmar (dot) ros (at) gmail (dot) com>
00007  */
00008 
00009 #include "device.h"
00010 #include <debug.h>
00011 #include "d3d9_helpers.h"
00012 #include "d3d9_create.h"
00013 
00014 static HRESULT InitD3D9ResourceManager(D3D9ResourceManager* pThisResourceManager, LPDIRECT3DDEVICE9_INT pDirect3DDevice9)
00015 {
00016     DWORD MaxSimultaneousTextures;
00017 
00018     MaxSimultaneousTextures = max(1, pDirect3DDevice9->DeviceData[0].DriverCaps.DriverCaps9.MaxSimultaneousTextures);
00019 
00020     if (FAILED(AlignedAlloc((LPVOID *)&pThisResourceManager->pTextureHeap, sizeof(DWORD) + MaxSimultaneousTextures * sizeof(int) * 3)))
00021     {
00022         DPRINT1("Could not allocate texture heap");
00023         return DDERR_OUTOFMEMORY;
00024     }
00025 
00026     // TODO: Init texture heap
00027 
00028     pThisResourceManager->MaxSimultaneousTextures = MaxSimultaneousTextures;
00029     pThisResourceManager->pBaseDevice = pDirect3DDevice9;
00030 
00031     return D3D_OK;
00032 }
00033 
00034 HRESULT InitD3D9BaseDevice(LPDIRECT3DDEVICE9_INT pThisBaseDevice, LPDIRECT3D9_INT pDirect3D9,
00035                            UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags,
00036                            D3DPRESENT_PARAMETERS* pPresentationParameters, DWORD NumAdaptersToCreate)
00037 {
00038     D3D9ResourceManager* pResourceManager;
00039     DWORD i;
00040 
00041     // Insert Reset/Ctor here
00042 
00043     if (FAILED(AlignedAlloc((LPVOID *)&pResourceManager, sizeof(D3D9ResourceManager))) ||
00044         FAILED(InitD3D9ResourceManager(pResourceManager, pThisBaseDevice)))
00045     {
00046         DPRINT1("Could not create resource manager");
00047         return DDERR_OUTOFMEMORY;
00048     }
00049 
00050     pThisBaseDevice->pResourceManager = pResourceManager;
00051 
00052     pThisBaseDevice->lpVtbl = &Direct3DDevice9HAL_Vtbl;
00053     pThisBaseDevice->lRefCnt = 1;
00054     pThisBaseDevice->dwProcessId = GetCurrentThreadId();
00055     pThisBaseDevice->pUnknown = (IUnknown*) &pThisBaseDevice->lpVtbl;
00056     InitializeCriticalSection(&pThisBaseDevice->CriticalSection);
00057 
00058     pThisBaseDevice->pDirect3D9 = pDirect3D9;
00059     pThisBaseDevice->DeviceType = DeviceType;
00060     pThisBaseDevice->hWnd = hFocusWindow;
00061     pThisBaseDevice->AdjustedBehaviourFlags = BehaviourFlags;
00062     pThisBaseDevice->BehaviourFlags = BehaviourFlags;
00063     pThisBaseDevice->NumAdaptersInDevice = NumAdaptersToCreate;
00064 
00065     // TODO: Query driver for correct DX version
00066     pThisBaseDevice->dwDXVersion = 9;
00067 
00068     for (i = 0; i < NumAdaptersToCreate; i++)
00069     {
00070         if (FALSE == CreateD3D9DeviceData(&pDirect3D9->DisplayAdapters[i], &pThisBaseDevice->DeviceData[i]))
00071         {
00072             DPRINT1("Failed to get device data for adapter: %d", i);
00073             return DDERR_GENERIC;
00074         }
00075 
00076         pThisBaseDevice->AdapterIndexInGroup[i] = i;
00077         pThisBaseDevice->CurrentDisplayMode[i].Width = pDirect3D9->DisplayAdapters[i].DriverCaps.dwDisplayWidth;
00078         pThisBaseDevice->CurrentDisplayMode[i].Height = pDirect3D9->DisplayAdapters[i].DriverCaps.dwDisplayHeight;
00079         pThisBaseDevice->CurrentDisplayMode[i].RefreshRate = pDirect3D9->DisplayAdapters[i].DriverCaps.dwRefreshRate;
00080         pThisBaseDevice->CurrentDisplayMode[i].Format = pDirect3D9->DisplayAdapters[i].DriverCaps.RawDisplayFormat;
00081 
00082         pThisBaseDevice->pSwapChains[i] = CreateDirect3DSwapChain9(RT_BUILTIN, pThisBaseDevice, i);
00083         pThisBaseDevice->pSwapChains2[i] = pThisBaseDevice->pSwapChains[i];
00084 
00085         if (FAILED(Direct3DSwapChain9_Init(pThisBaseDevice->pSwapChains[i], pPresentationParameters)))
00086         {
00087             DPRINT1("Failed to init swap chain: %d", i);
00088             return DDERR_GENERIC;
00089         }
00090     }
00091 
00092     return D3D_OK;
00093 }
00094 
00095 HRESULT CreateD3D9HalDevice(LPDIRECT3D9_INT pDirect3D9, UINT Adapter,
00096                             HWND hFocusWindow, DWORD BehaviourFlags,
00097                             D3DPRESENT_PARAMETERS* pPresentationParameters,
00098                             DWORD NumAdaptersToCreate,
00099                             struct IDirect3DDevice9** ppReturnedDeviceInterface)
00100 {
00101     HRESULT Ret;
00102 
00103     if (FAILED(AlignedAlloc((LPVOID *)ppReturnedDeviceInterface, sizeof(D3D9HALDEVICE))))
00104     {
00105         DPRINT1("Not enough memory to create HAL device");
00106         return DDERR_OUTOFMEMORY;
00107     }
00108 
00109     Ret = InitD3D9BaseDevice((LPDIRECT3DDEVICE9_INT)*ppReturnedDeviceInterface, pDirect3D9, Adapter,
00110                              D3DDEVTYPE_HAL, hFocusWindow, BehaviourFlags,
00111                              pPresentationParameters, NumAdaptersToCreate);
00112 
00113     if (FAILED(Ret))
00114     {
00115         AlignedFree((LPVOID)*ppReturnedDeviceInterface);
00116         return Ret;
00117     }
00118 
00119     return D3D_OK;
00120 }

Generated on Sat May 26 2012 04:19:53 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.