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>
9 typedef struct IDirect3D9
*LPDIRECT3D9
;
11 #include "d3d9_create.h"
12 #include "d3d9_helpers.h"
18 static const GUID DISPLAY_GUID
= { 0x67685559, 0x3106, 0x11D0, { 0xB9, 0x71, 0x00, 0xAA, 0x00, 0x34, 0x2F, 0x9F } };
20 static CHAR D3D9_PrimaryDeviceName
[CCHDEVICENAME
];
22 static BOOL
IsDirectDrawSupported()
29 Planes
= GetDeviceCaps(hDC
, PLANES
);
30 Bpp
= GetDeviceCaps(hDC
, BITSPIXEL
);
39 static VOID
SetAdapterInfo(IN OUT LPDIRECT3D9_DISPLAYADAPTER_INT pDisplayAdapter
, IN LPDISPLAY_DEVICEA pDisplayDevice
)
41 memcpy(&pDisplayAdapter
->DisplayGuid
, &DISPLAY_GUID
, sizeof(GUID
));
43 lstrcpynA(pDisplayAdapter
->szDeviceName
, pDisplayDevice
->DeviceName
, MAX_PATH
);
45 pDisplayAdapter
->dwStateFlags
= pDisplayDevice
->StateFlags
;
46 pDisplayAdapter
->bInUseFlag
= TRUE
;
49 static BOOL
GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9
)
51 DISPLAY_DEVICEA DisplayDevice
;
55 memset(&DisplayDevice
, 0, sizeof(DISPLAY_DEVICEA
));
56 DisplayDevice
.cb
= sizeof(DISPLAY_DEVICEA
);
58 pDirect3D9
->dwNumDisplayAdapters
= 0;
59 D3D9_PrimaryDeviceName
[0] = '\0';
62 while (EnumDisplayDevicesA(NULL
, AdapterIndex
, &DisplayDevice
, 0) == TRUE
&&
63 pDirect3D9
->dwNumDisplayAdapters
< DX_D3D9_MAX_NUM_ADAPTERS
)
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)
68 SetAdapterInfo(&pDirect3D9
->DisplayAdapters
[pDirect3D9
->dwNumDisplayAdapters
], &DisplayDevice
);
70 if (pDirect3D9
->dwNumDisplayAdapters
== 0)
71 lstrcpynA(D3D9_PrimaryDeviceName
, DisplayDevice
.DeviceName
, sizeof(D3D9_PrimaryDeviceName
));
73 ++pDirect3D9
->dwNumDisplayAdapters
;
81 while (EnumDisplayDevicesA(NULL
, AdapterIndex
, &DisplayDevice
, 0) == TRUE
&&
82 pDirect3D9
->dwNumDisplayAdapters
< DX_D3D9_MAX_NUM_ADAPTERS
)
84 if ((DisplayDevice
.StateFlags
& DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
) != 0 &&
85 (DisplayDevice
.StateFlags
& (DISPLAY_DEVICE_MIRRORING_DRIVER
| DISPLAY_DEVICE_PRIMARY_DEVICE
)) == 0)
87 SetAdapterInfo(&pDirect3D9
->DisplayAdapters
[pDirect3D9
->dwNumDisplayAdapters
], &DisplayDevice
);
88 ++pDirect3D9
->dwNumDisplayAdapters
;
94 /* Check if minimum DirectDraw is supported */
95 if (IsDirectDrawSupported() == FALSE
)
98 /* Test DC creation for primary display device */
99 if (NULL
== (hDC
= CreateDCA(NULL
, D3D9_PrimaryDeviceName
, NULL
, NULL
)))
107 HRESULT
CreateD3D9(OUT LPDIRECT3D9
*ppDirect3D9
, UINT SDKVersion
)
109 LPDIRECT3D9_INT pDirect3D9
;
111 if (ppDirect3D9
== 0)
112 return DDERR_INVALIDPARAMS
;
114 if (AlignedAlloc((LPVOID
*)&pDirect3D9
, sizeof(DIRECT3D9_INT
)) != S_OK
)
115 return DDERR_OUTOFMEMORY
;
118 return DDERR_OUTOFMEMORY
;
120 pDirect3D9
->unknown000007
= 0;
121 pDirect3D9
->lpInt
= 0;
123 pDirect3D9
->lpVtbl
= &Direct3D9_Vtbl
;
124 pDirect3D9
->dwProcessId
= GetCurrentThreadId();
125 pDirect3D9
->dwRefCnt
= 1;
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
;
136 pDirect3D9
->lpInt
= pDirect3D9
;
137 pDirect3D9
->unknown000007
= 1;
139 InitializeCriticalSection(&pDirect3D9
->d3d9_cs
);
141 memset(pDirect3D9
->DisplayAdapters
, 0, sizeof(pDirect3D9
->DisplayAdapters
));
142 GetDisplayDeviceInfo(pDirect3D9
);
144 *ppDirect3D9
= (LPDIRECT3D9
)&pDirect3D9
->lpVtbl
;
146 return ERROR_SUCCESS
;