* Replaced d3d9 debug helper function with native call
[reactos.git] / reactos / dll / directx / d3d9 / d3d9_create.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS ReactX
4 * FILE: dll/directx/d3d9/d3d9_create.c
5 * PURPOSE: d3d9.dll internal create functions and data
6 * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se>
7 */
8
9 typedef struct IDirect3D9 *LPDIRECT3D9;
10
11 #include "d3d9_create.h"
12 #include "d3d9_helpers.h"
13 #include <debug.h>
14 #include <ddrawi.h>
15 #include <ddrawgdi.h>
16 #include <strsafe.h>
17
18 static const GUID DISPLAY_GUID = { 0x67685559, 0x3106, 0x11D0, { 0xB9, 0x71, 0x00, 0xAA, 0x00, 0x34, 0x2F, 0x9F } };
19
20 static CHAR D3D9_PrimaryDeviceName[CCHDEVICENAME];
21
22 static BOOL IsDirectDrawSupported()
23 {
24 HDC hDC;
25 DWORD Planes;
26 DWORD Bpp;
27
28 hDC = GetDC(NULL);
29 Planes = GetDeviceCaps(hDC, PLANES);
30 Bpp = GetDeviceCaps(hDC, BITSPIXEL);
31 ReleaseDC(NULL, hDC);
32
33 if (Planes * Bpp < 8)
34 return FALSE;
35
36 return TRUE;
37 }
38
39 static VOID SetAdapterInfo(IN OUT LPDIRECT3D9_DISPLAYADAPTER_INT pDisplayAdapter, IN LPDISPLAY_DEVICEA pDisplayDevice)
40 {
41 memcpy(&pDisplayAdapter->DisplayGuid, &DISPLAY_GUID, sizeof(GUID));
42
43 lstrcpynA(pDisplayAdapter->szDeviceName, pDisplayDevice->DeviceName, MAX_PATH);
44
45 pDisplayAdapter->dwStateFlags = pDisplayDevice->StateFlags;
46 pDisplayAdapter->bInUseFlag = TRUE;
47 }
48
49 static BOOL GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9)
50 {
51 DISPLAY_DEVICEA DisplayDevice;
52 DWORD AdapterIndex;
53 HDC hDC;
54
55 memset(&DisplayDevice, 0, sizeof(DISPLAY_DEVICEA));
56 DisplayDevice.cb = sizeof(DISPLAY_DEVICEA);
57
58 pDirect3D9->dwNumDisplayAdapters = 0;
59 D3D9_PrimaryDeviceName[0] = '\0';
60
61 AdapterIndex = 0;
62 while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE &&
63 pDirect3D9->dwNumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS)
64 {
65 if ((DisplayDevice.StateFlags & (DISPLAY_DEVICE_DISCONNECT | DISPLAY_DEVICE_MIRRORING_DRIVER)) == 0 &&
66 (DisplayDevice.StateFlags & (DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) != 0)
67 {
68 SetAdapterInfo(&pDirect3D9->DisplayAdapters[pDirect3D9->dwNumDisplayAdapters], &DisplayDevice);
69
70 if (pDirect3D9->dwNumDisplayAdapters == 0)
71 lstrcpynA(D3D9_PrimaryDeviceName, DisplayDevice.DeviceName, sizeof(D3D9_PrimaryDeviceName));
72
73 ++pDirect3D9->dwNumDisplayAdapters;
74 break;
75 }
76
77 ++AdapterIndex;
78 }
79
80 AdapterIndex = 0;
81 while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE &&
82 pDirect3D9->dwNumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS)
83 {
84 if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0 &&
85 (DisplayDevice.StateFlags & (DISPLAY_DEVICE_MIRRORING_DRIVER | DISPLAY_DEVICE_PRIMARY_DEVICE)) == 0)
86 {
87 SetAdapterInfo(&pDirect3D9->DisplayAdapters[pDirect3D9->dwNumDisplayAdapters], &DisplayDevice);
88 ++pDirect3D9->dwNumDisplayAdapters;
89 }
90
91 ++AdapterIndex;
92 }
93
94 /* Check if minimum DirectDraw is supported */
95 if (IsDirectDrawSupported() == FALSE)
96 return FALSE;
97
98 /* Test DC creation for primary display device */
99 if (NULL == (hDC = CreateDCA(NULL, D3D9_PrimaryDeviceName, NULL, NULL)))
100 return FALSE;
101
102 DeleteDC(hDC);
103
104 return TRUE;
105 }
106
107 HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion)
108 {
109 LPDIRECT3D9_INT pDirect3D9;
110
111 if (ppDirect3D9 == 0)
112 return DDERR_INVALIDPARAMS;
113
114 if (AlignedAlloc((LPVOID *)&pDirect3D9, sizeof(DIRECT3D9_INT)) != S_OK)
115 return DDERR_OUTOFMEMORY;
116
117 if (pDirect3D9 == 0)
118 return DDERR_OUTOFMEMORY;
119
120 pDirect3D9->unknown000007 = 0;
121 pDirect3D9->lpInt = 0;
122
123 pDirect3D9->lpVtbl = &Direct3D9_Vtbl;
124 pDirect3D9->dwProcessId = GetCurrentThreadId();
125 pDirect3D9->dwRefCnt = 1;
126
127 pDirect3D9->unknown004576 = 0;
128 pDirect3D9->unknown004578 = 0;
129 pDirect3D9->unknown004579 = 0;
130 pDirect3D9->unknown004580 = 0;
131 pDirect3D9->unknown004581 = 0;
132 pDirect3D9->unknown004582 = 0;
133 pDirect3D9->unknown004583 = 0;
134 pDirect3D9->SDKVersion = SDKVersion;
135
136 pDirect3D9->lpInt = pDirect3D9;
137 pDirect3D9->unknown000007 = 1;
138
139 InitializeCriticalSection(&pDirect3D9->d3d9_cs);
140
141 memset(pDirect3D9->DisplayAdapters, 0, sizeof(pDirect3D9->DisplayAdapters));
142 GetDisplayDeviceInfo(pDirect3D9);
143
144 *ppDirect3D9 = (LPDIRECT3D9)&pDirect3D9->lpVtbl;
145
146 return ERROR_SUCCESS;
147 }