1 #define STDCALL __stdcall
8 #include <dll/directx/d3d8thk.h>
12 #include "d3d9_helpers.h"
13 #include "d3d9_caps.h"
16 static INT g_NumDevices
= 0;
18 void CreateDisplayModeList(LPCSTR lpszDeviceName
, D3DDISPLAYMODE
* pDisplayModes
, DWORD
* pNumDisplayModes
, D3DFORMAT Default16BitFormat
, D3D9_Unknown6BC
* pUnknown6BC
)
24 while (TRUE
== EnumDisplaySettingsA(lpszDeviceName
, ModeIndex
, &DevMode
))
26 D3DFORMAT DefaultFormat
;
28 if (DevMode
.dmBitsPerPel
!= 15 &&
29 DevMode
.dmBitsPerPel
!= 16 &&
30 DevMode
.dmBitsPerPel
!= 32)
38 if (DevMode
.dmBitsPerPel
== 15 || DevMode
.dmBitsPerPel
== 16)
40 if (NULL
== pUnknown6BC
)
46 DefaultFormat
= Default16BitFormat
;
50 DefaultFormat
= D3DFMT_X8R8G8B8
;
53 if (NULL
!= pDisplayModes
)
55 if (ValidModes
== *pNumDisplayModes
)
58 pDisplayModes
->Width
= DevMode
.dmPelsWidth
;
59 pDisplayModes
->Height
= DevMode
.dmPelsHeight
;
60 pDisplayModes
->RefreshRate
= DevMode
.dmDisplayFrequency
;
61 pDisplayModes
->Format
= DefaultFormat
;
68 *pNumDisplayModes
= ValidModes
;
71 static void CreateInternalDeviceData(HDC hDC
, LPCSTR lpszDeviceName
, D3D9_Unknown6BC
** ppUnknown
, D3DDEVTYPE DeviceType
, HMODULE
* hD3DRefDll
)
73 D3D9_Unknown6BC
* pUnknown6BC
;
76 if (ppUnknown
) *ppUnknown
= NULL
;
77 if (hD3DRefDll
) *hD3DRefDll
= NULL
;
79 if (DeviceType
!= D3DDEVTYPE_HAL
)
81 /* TODO: Implement D3DDEVTYPE_REF and D3DDEVTYPE_SW */
86 pUnknown6BC
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(D3D9_Unknown6BC
));
87 if (NULL
== pUnknown6BC
)
89 DPRINT1("Out of memory");
93 pUnknown6BC
->hDirectDrawLocal
= OsThunkDdCreateDirectDrawObject(hDC
);
94 if (0 == pUnknown6BC
->hDirectDrawLocal
)
96 HeapFree(GetProcessHeap(), 0, pUnknown6BC
);
101 StringCbCopyA(pUnknown6BC
->szDeviceName
, CCHDEVICENAME
, lpszDeviceName
);
102 //pUnknown6BC->DeviceUniq = DdQueryDisplaySettingsUniqueness();
103 pUnknown6BC
->DeviceType
= DeviceType
;
106 ValueSize
= sizeof(DWORD
);
107 ReadRegistryValue(REG_DWORD
, "ForceDriverFlagsOn", (LPBYTE
)&pUnknown6BC
->bForceDriverFlagsOn
, &ValueSize
);
109 ValueSize
= sizeof(DWORD
);
110 ReadRegistryValue(REG_DWORD
, "ForceDriverFlagsOff", (LPBYTE
)&pUnknown6BC
->bForceDriverFlagsOff
, &ValueSize
);
114 *ppUnknown
= pUnknown6BC
;
117 static void ReleaseInternalDeviceData(LPD3D9_DEVICEDATA pDeviceData
)
119 OsThunkDdDeleteDirectDrawObject(pDeviceData
->pUnknown6BC
->hDirectDrawLocal
);
121 HeapFree(GetProcessHeap(), 0, pDeviceData
->pUnknown6BC
);
122 pDeviceData
->pUnknown6BC
= NULL
;
127 BOOL
GetDeviceData(LPD3D9_DEVICEDATA pDeviceData
)
130 D3DHAL_GLOBALDRIVERDATA GlobalDriverData
;
131 D3DHAL_D3DEXTENDEDCAPS D3dExtendedCaps
;
132 LPDDSURFACEDESC puD3dTextureFormats
;
133 DDPIXELFORMAT
* pD3dZStencilFormatList
;
134 D3DDISPLAYMODE
* pD3dDisplayModeList
;
135 D3DQUERYTYPE
* pD3dQueryList
;
136 DWORD NumTextureFormats
= 0;
137 DWORD NumStencilFormats
= 0;
138 DWORD NumExtendedFormats
= 0;
139 DWORD NumQueries
= 0;
141 if (NULL
== pDeviceData
->pUnknown6BC
)
143 CreateInternalDeviceData(
145 pDeviceData
->szDeviceName
,
146 &pDeviceData
->pUnknown6BC
,
147 pDeviceData
->DeviceType
,
148 &pDeviceData
->hD3DRefDll
151 if (NULL
== pDeviceData
->pUnknown6BC
)
153 DPRINT1("Failed to create DirectDrawObject for Direct3D9");
159 D3D9_DRIVERCAPS DriverCaps
;
160 D3D9_CALLBACKS D3D9Callbacks
;
162 if (FALSE
== CanReenableDirectDrawObject(pDeviceData
->pUnknown6BC
))
164 DPRINT1("Failed to re-enable DirectDrawObject");
168 bRet
= GetD3D9DriverInfo(
169 pDeviceData
->pUnknown6BC
,
172 pDeviceData
->szDeviceName
,
173 pDeviceData
->hD3DRefDll
,
188 pDeviceData
->DriverCaps
.dwDisplayWidth
= DriverCaps
.dwDisplayWidth
;
189 pDeviceData
->DriverCaps
.dwDisplayHeight
= DriverCaps
.dwDisplayHeight
;
190 pDeviceData
->DriverCaps
.RawDisplayFormat
= DriverCaps
.RawDisplayFormat
;
191 pDeviceData
->DriverCaps
.DisplayFormat
= DriverCaps
.DisplayFormat
;
192 pDeviceData
->DriverCaps
.dwRefreshRate
= DriverCaps
.dwRefreshRate
;
198 /* Cleanup of old stuff */
199 if (pDeviceData
->DriverCaps
.pSupportedFormatOps
)
201 HeapFree(GetProcessHeap(), 0, pDeviceData
->DriverCaps
.pSupportedFormatOps
);
202 pDeviceData
->DriverCaps
.pSupportedFormatOps
= NULL
;
204 if (pDeviceData
->DriverCaps
.pSupportedExtendedModes
)
206 HeapFree(GetProcessHeap(), 0, pDeviceData
->DriverCaps
.pSupportedExtendedModes
);
207 pDeviceData
->DriverCaps
.pSupportedExtendedModes
= NULL
;
209 if (pDeviceData
->DriverCaps
.pSupportedQueriesList
)
211 HeapFree(GetProcessHeap(), 0, pDeviceData
->DriverCaps
.pSupportedQueriesList
);
212 pDeviceData
->DriverCaps
.pSupportedQueriesList
= NULL
;
215 if (FALSE
== CanReenableDirectDrawObject(pDeviceData
->pUnknown6BC
))
217 DPRINT1("Failed to re-enable DirectDrawObject");
218 ReleaseInternalDeviceData(pDeviceData
);
222 bRet
= GetD3D9DriverInfo(
223 pDeviceData
->pUnknown6BC
,
224 &pDeviceData
->DriverCaps
,
225 &pDeviceData
->D3D9Callbacks
,
226 pDeviceData
->szDeviceName
,
227 pDeviceData
->hD3DRefDll
,
242 DPRINT1("Could not query DirectDrawObject, aborting");
243 ReleaseInternalDeviceData(pDeviceData
);
247 puD3dTextureFormats
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, max(NumTextureFormats
, 1) * sizeof(DDSURFACEDESC
));
248 pD3dZStencilFormatList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, max(NumStencilFormats
, 1) * sizeof(DDPIXELFORMAT
));
249 pD3dDisplayModeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, max(NumExtendedFormats
, 1) * sizeof(D3DDISPLAYMODE
));
250 pD3dQueryList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, max(NumQueries
, 1) * sizeof(D3DQUERYTYPE
));
252 bRet
= GetD3D9DriverInfo(
253 pDeviceData
->pUnknown6BC
,
254 &pDeviceData
->DriverCaps
,
255 &pDeviceData
->D3D9Callbacks
,
256 pDeviceData
->szDeviceName
,
257 pDeviceData
->hD3DRefDll
,
261 pD3dZStencilFormatList
,
272 DPRINT1("Could not query DirectDrawObject, aborting");
273 HeapFree(GetProcessHeap(), 0, puD3dTextureFormats
);
274 HeapFree(GetProcessHeap(), 0, pD3dZStencilFormatList
);
275 HeapFree(GetProcessHeap(), 0, pD3dDisplayModeList
);
276 HeapFree(GetProcessHeap(), 0, pD3dQueryList
);
277 ReleaseInternalDeviceData(pDeviceData
);
281 pDeviceData
->DriverCaps
.NumSupportedFormatOps
= NumTextureFormats
;
282 if (NumTextureFormats
> 0)
283 pDeviceData
->DriverCaps
.pSupportedFormatOps
= puD3dTextureFormats
;
285 pDeviceData
->DriverCaps
.NumSupportedExtendedModes
= NumExtendedFormats
;
286 if (NumExtendedFormats
> 0)
287 pDeviceData
->DriverCaps
.pSupportedExtendedModes
= pD3dDisplayModeList
;
289 pDeviceData
->DriverCaps
.NumSupportedQueries
= NumQueries
;
291 pDeviceData
->DriverCaps
.pSupportedQueriesList
= pD3dQueryList
;
293 HeapFree(GetProcessHeap(), 0, pD3dZStencilFormatList
);
300 BOOL
CanReenableDirectDrawObject(D3D9_Unknown6BC
* pUnknown
)
302 BOOL bDisplayModeWasChanged
;
304 /* Try the real way first */
305 if (TRUE
== OsThunkDdReenableDirectDrawObject(pUnknown
->hDirectDrawLocal
, &bDisplayModeWasChanged
))
308 /* Ref types and software types can always be reenabled after a mode switch */
309 if (pUnknown
->DeviceType
== D3DDEVTYPE_REF
|| pUnknown
->DeviceType
== D3DDEVTYPE_SW
)
317 static void PrepareDriverInfoData(DD_GETDRIVERINFODATA
* DrvInfo
, LPVOID pData
, DWORD dwExpectedSize
)
319 memset(DrvInfo
, 0, sizeof(DD_GETDRIVERINFODATA
));
320 DrvInfo
->dwSize
= sizeof(DD_GETDRIVERINFODATA
);
321 DrvInfo
->guidInfo
= GUID_GetDriverInfo2
;
322 DrvInfo
->dwExpectedSize
= dwExpectedSize
;
323 DrvInfo
->lpvData
= pData
;
324 DrvInfo
->ddRVal
= E_FAIL
;
327 static void ResetGetDriverInfo2Data(DD_GETDRIVERINFO2DATA
* DrvInfo2
, DWORD dwType
, DWORD dwExpectedSize
)
329 memset(DrvInfo2
, 0, dwExpectedSize
);
330 DrvInfo2
->dwMagic
= D3DGDI2_MAGIC
;
331 DrvInfo2
->dwType
= dwType
;
332 DrvInfo2
->dwExpectedSize
= dwExpectedSize
;
335 BOOL
GetD3D9DriverInfo( D3D9_Unknown6BC
* pUnknown6BC
,
336 LPD3D9_DRIVERCAPS pDriverCaps
,
337 D3D9_CALLBACKS
* pD3D9Callbacks
,
338 LPCSTR lpszDeviceName
,
340 D3DHAL_GLOBALDRIVERDATA
* pGblDriverData
,
341 D3DHAL_D3DEXTENDEDCAPS
* pD3dExtendedCaps
,
342 LPDDSURFACEDESC puD3dTextureFormats
,
343 DDPIXELFORMAT
* pD3dZStencilFormatList
,
344 D3DDISPLAYMODE
* pD3dDisplayModeList
,
345 D3DQUERYTYPE
* pD3dQueryList
,
346 LPDWORD pNumTextureFormats
,
347 LPDWORD pNumZStencilFormats
,
348 LPDWORD pNumExtendedFormats
,
356 DWORD CallBackFlags
[3];
357 D3DNTHAL_CALLBACKS D3dCallbacks
;
358 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
359 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
363 BOOL bDX8Mode
= FALSE
;
365 DD_GETDRIVERINFODATA DrvInfo
;
366 DD_GETDDIVERSIONDATA DdiVersion
;
367 DD_GETFORMATCOUNTDATA FormatCountData
;
368 DD_GETEXTENDEDMODECOUNTDATA ExModeCountData
;
369 DD_GETD3DQUERYCOUNTDATA D3dQueryCountData
;
372 *pNumTextureFormats
= 0;
373 *pNumZStencilFormats
= 0;
374 *pNumExtendedFormats
= 0;
376 memset(pD3dExtendedCaps
, 0, sizeof(D3DHAL_D3DEXTENDEDCAPS
));
377 memset(pGblDriverData
, 0, sizeof(D3DHAL_GLOBALDRIVERDATA
));
378 memset(pDriverCaps
, 0, sizeof(D3D9_DRIVERCAPS
));
380 /* Set runtime version */
381 ValueSize
= sizeof(dwDXVersion
);
382 if (FALSE
== ReadRegistryValue(REG_DWORD
, "DD_RUNTIME_VERSION", (LPBYTE
)&dwDXVersion
, &ValueSize
))
383 dwDXVersion
= DD_RUNTIME_VERSION
;
386 bRet
= OsThunkDdQueryDirectDrawObject(
387 pUnknown6BC
->hDirectDrawLocal
,
402 /* TODO: Handle error */
406 if ((HalInfo
.ddCaps
.dwSVBCaps2
& DDCAPS2_AUTOFLIPOVERLAY
) == 0 &&
407 puD3dTextureFormats
!= NULL
)
409 bRet
= OsThunkDdQueryDirectDrawObject(
410 pUnknown6BC
->hDirectDrawLocal
,
427 if (NULL
== pUnknown6BC
->swDDICreateDirectDrawObject
)
429 *pNumTextureFormats
= D3dDriverData
.dwNumTextureFormats
;
432 pDriverCaps
->DriverCaps9
.Caps
= HalInfo
.ddCaps
.dwCaps
;
433 pDriverCaps
->DriverCaps9
.Caps2
= HalInfo
.ddCaps
.dwCaps2
;
434 pDriverCaps
->DriverCaps9
.Caps3
= HalInfo
.ddCaps
.dwSVCaps
;
435 pDriverCaps
->dwSVBCaps
= HalInfo
.ddCaps
.dwSVBCaps
;
436 pDriverCaps
->dwVSBCaps
= HalInfo
.ddCaps
.dwVSBCaps
;
437 pDriverCaps
->dwSVBCaps2
= HalInfo
.ddCaps
.dwSVBCaps2
;
438 pUnknown6BC
->lDisplayPitch
= HalInfo
.vmiData
.lDisplayPitch
;
440 if (HalInfo
.dwFlags
& DDHALINFO_GETDRIVERINFO2
)
442 /* GUID_GetDriverInfo2 - Inform driver of DX version */
444 DD_DXVERSION DxVersion
;
446 ResetGetDriverInfo2Data(&DxVersion
.gdi2
, D3DGDI2_TYPE_DXVERSION
, sizeof(DD_DXVERSION
));
447 DxVersion
.dwDXVersion
= dwDXVersion
;
449 PrepareDriverInfoData(&DrvInfo
, &DxVersion
, sizeof(DxVersion
));
450 OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
);
454 /* GUID_GetDriverInfo2 - Get DDI version */
456 ResetGetDriverInfo2Data(&DdiVersion
.gdi2
, D3DGDI2_TYPE_GETDDIVERSION
, sizeof(DD_GETDDIVERSIONDATA
));
457 PrepareDriverInfoData(&DrvInfo
, &DdiVersion
, sizeof(DdiVersion
));
458 bRet
= OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
);
460 if (DdiVersion
.dwDDIVersion
!= DX9_DDI_VERSION
)
464 ValueSize
= sizeof(ForceDDIOn
);
465 if (TRUE
== ReadRegistryValue(REG_DWORD
, "ForceOldDDIOn", (LPBYTE
)&ForceDDIOn
, &ValueSize
) &&
468 DdiVersion
.dwDDIVersion
= DX9_DDI_VERSION
;
474 /* Check for errors to fallback to DX8 mode */
475 if (DdiVersion
.dwDDIVersion
< DX9_DDI_VERSION
)
479 if (DdiVersion
.dwDDIVersion
== 0)
481 DPRINT1("Driver claims to be DX9 driver, but didn't report DX9 DDI version - reverting to DX8 mode");
485 DPRINT1("Driver claims to be DX9 driver, but was built with an old DDI version - reverting to DX8 mode");
488 /* GUID_GetDriverInfo2 - Get D3DCAPS8 */
490 D3DCAPS8 DriverCaps8
;
492 ResetGetDriverInfo2Data((DD_GETDRIVERINFO2DATA
*)&DriverCaps8
, D3DGDI2_TYPE_GETD3DCAPS8
, sizeof(D3DCAPS8
));
493 PrepareDriverInfoData(&DrvInfo
, &DriverCaps8
, sizeof(D3DCAPS8
));
495 if (FALSE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
) ||
496 S_OK
!= DrvInfo
.ddRVal
||
497 DrvInfo
.dwActualSize
!= sizeof(D3DCAPS8
))
499 DPRINT1("Driver returned an invalid D3DCAPS8 structure - aborting");
503 memcpy(&pDriverCaps
->DriverCaps9
, &DriverCaps8
, sizeof(D3DCAPS8
));
504 pDriverCaps
->DriverCaps9
.Caps
= HalInfo
.ddCaps
.dwCaps
;
505 pDriverCaps
->dwDriverCaps
|= D3D9_INT_D3DCAPS8_VALID
;
510 /* GUID_GetDriverInfo2 - Get D3DCAPS9 */
511 if (FALSE
== bDX8Mode
)
513 D3DCAPS9 DriverCaps9
;
515 ResetGetDriverInfo2Data((DD_GETDRIVERINFO2DATA
*)&DriverCaps9
, D3DGDI2_TYPE_GETD3DCAPS9
, sizeof(D3DCAPS9
));
516 PrepareDriverInfoData(&DrvInfo
, &DriverCaps9
, sizeof(D3DCAPS9
));
518 if (FALSE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
) ||
519 S_OK
!= DrvInfo
.ddRVal
||
520 DrvInfo
.dwActualSize
!= sizeof(D3DCAPS9
))
522 DPRINT1("Driver returned an invalid D3DCAPS9 structure - aborting");
526 pDriverCaps
->DriverCaps9
= DriverCaps9
;
527 pDriverCaps
->DriverCaps9
.Caps
= HalInfo
.ddCaps
.dwCaps
;
528 pDriverCaps
->dwDriverCaps
|= D3D9_INT_D3DCAPS9_VALID
;
532 /* GUID_GetDriverInfo2 - Get format count data */
534 ResetGetDriverInfo2Data(&FormatCountData
.gdi2
, D3DGDI2_TYPE_GETFORMATCOUNT
, sizeof(DD_GETFORMATCOUNTDATA
));
535 PrepareDriverInfoData(&DrvInfo
, &FormatCountData
, sizeof(DD_GETFORMATCOUNTDATA
));
536 FormatCountData
.dwFormatCount
= UINT_MAX
;
537 FormatCountData
.dwReserved
= dwDXVersion
;
539 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
541 if (DrvInfo
.ddRVal
!= S_OK
)
543 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI_TYPE_GETFORMATCOUNT in GetDriverInfo call");
546 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETFORMATCOUNTDATA
))
548 DPRINT1("Driver returned an invalid DD_GETFORMATCOUNTDATA structure - aborting");
551 else if (FormatCountData
.dwFormatCount
== UINT_MAX
)
553 DPRINT1("Driver didn't set DD_GETFORMATCOUNTDATA.dwFormatCount - aborting");
557 *pNumTextureFormats
= FormatCountData
.dwFormatCount
;
561 /* GUID_GetDriverInfo2 - Get format data */
562 if (puD3dTextureFormats
!= NULL
)
565 DD_GETFORMATDATA FormatData
;
567 for (FormatIndex
= 0; FormatIndex
< FormatCountData
.dwFormatCount
; FormatIndex
++)
569 ResetGetDriverInfo2Data(&FormatData
.gdi2
, D3DGDI2_TYPE_GETFORMAT
, sizeof(DD_GETFORMATDATA
));
570 PrepareDriverInfoData(&DrvInfo
, &FormatData
, sizeof(DD_GETFORMATDATA
));
571 FormatData
.dwFormatIndex
= FormatIndex
;
573 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
575 if (DrvInfo
.ddRVal
!= S_OK
)
577 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI_TYPE_GETFORMAT in GetDriverInfo call");
580 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETFORMATDATA
))
582 DPRINT1("Driver returned an invalid DD_GETFORMATDATA structure - aborting");
585 else if (FormatData
.format
.dwSize
!= sizeof(DDPIXELFORMAT
))
587 DPRINT1("Driver didn't set DD_GETFORMATDATA.format - aborting");
591 /* Copy format data to puD3dTextureFormats */
592 memset(puD3dTextureFormats
, 0, sizeof(DDSURFACEDESC
));
593 puD3dTextureFormats
->dwSize
= sizeof(DDSURFACEDESC
);
594 puD3dTextureFormats
->dwFlags
= DDSD_PIXELFORMAT
;
595 memcpy(&puD3dTextureFormats
->ddpfPixelFormat
, &FormatData
.format
, sizeof(DDPIXELFORMAT
));
597 if ((FormatData
.format
.dwOperations
& D3DFORMAT_OP_PIXELSIZE
) != 0 &&
598 FormatData
.format
.dwPrivateFormatBitCount
> 0)
600 /* TODO: Register driver's own pixelformat */
603 ++puD3dTextureFormats
;
608 /* GUID_GetDriverInfo2 - Get extended mode count data */
610 ResetGetDriverInfo2Data(&ExModeCountData
.gdi2
, D3DGDI2_TYPE_GETEXTENDEDMODECOUNT
, sizeof(DD_GETEXTENDEDMODECOUNTDATA
));
611 PrepareDriverInfoData(&DrvInfo
, &ExModeCountData
, sizeof(DD_GETEXTENDEDMODECOUNTDATA
));
612 ExModeCountData
.dwModeCount
= UINT_MAX
;
613 ExModeCountData
.dwReserved
= dwDXVersion
;
615 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
617 if (DrvInfo
.ddRVal
== S_OK
)
619 if (DrvInfo
.dwActualSize
!= sizeof(DD_GETEXTENDEDMODECOUNTDATA
))
621 DPRINT1("Driver returned an invalid DD_GETEXTENDEDFORMATCOUNTDATA structure - aborting");
624 else if (ExModeCountData
.dwModeCount
== UINT_MAX
)
626 DPRINT1("Driver didn't set DD_GETEXTENDEDMODECOUNTDATA.dwModeCount - aborting");
630 *pNumExtendedFormats
= ExModeCountData
.dwModeCount
;
634 ExModeCountData
.dwModeCount
= 0;
639 /* GUID_GetDriverInfo2 - Get extended mode data */
640 if (pD3dDisplayModeList
!= NULL
)
643 DD_GETEXTENDEDMODEDATA ExModeData
;
645 for (ModeIndex
= 0; ModeIndex
< ExModeCountData
.dwModeCount
; ModeIndex
++)
647 ResetGetDriverInfo2Data(&ExModeData
.gdi2
, D3DGDI2_TYPE_GETEXTENDEDMODE
, sizeof(DD_GETEXTENDEDMODEDATA
));
648 PrepareDriverInfoData(&DrvInfo
, &ExModeData
, sizeof(DD_GETEXTENDEDMODEDATA
));
649 ExModeData
.dwModeIndex
= ModeIndex
;
650 ExModeData
.mode
.Width
= UINT_MAX
;
652 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
654 if (DrvInfo
.ddRVal
!= S_OK
)
656 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI2_TYPE_GETEXTENDEDMODE in GetDriverInfo call");
659 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETEXTENDEDMODEDATA
))
661 DPRINT1("Driver returned an invalid DD_GETEXTENDEDMODEDATA structure - aborting");
664 else if (ExModeData
.mode
.Width
!= UINT_MAX
)
666 DPRINT1("Driver didn't set DD_GETEXTENDEDMODEDATA.mode - aborting");
670 memcpy(pD3dDisplayModeList
, &ExModeData
.mode
, sizeof(D3DDISPLAYMODE
));
671 ++pD3dDisplayModeList
;
676 /* GUID_GetDriverInfo2 - Get adapter group */
678 DD_GETADAPTERGROUPDATA AdapterGroupData
;
679 ResetGetDriverInfo2Data(&AdapterGroupData
.gdi2
, D3DGDI2_TYPE_GETADAPTERGROUP
, sizeof(DD_GETADAPTERGROUPDATA
));
680 PrepareDriverInfoData(&DrvInfo
, &AdapterGroupData
, sizeof(DD_GETADAPTERGROUPDATA
));
681 AdapterGroupData
.ulUniqueAdapterGroupId
= UINT_MAX
;
683 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
685 if (DrvInfo
.ddRVal
!= S_OK
)
687 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI2_TYPE_GETADAPTERGROUP in GetDriverInfo call");
690 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETADAPTERGROUPDATA
))
692 DPRINT1("Driver returned an invalid DD_GETADAPTERGROUPDATA structure - aborting");
695 else if (AdapterGroupData
.ulUniqueAdapterGroupId
== UINT_MAX
)
697 DPRINT1("Driver didn't set DD_GETADAPTERGROUPDATA.ulUniqueAdapterGroupId - aborting");
701 pDriverCaps
->ulUniqueAdapterGroupId
= (ULONG
)AdapterGroupData
.ulUniqueAdapterGroupId
;
705 /* GUID_GetDriverInfo2 - Query count data */
707 ResetGetDriverInfo2Data(&D3dQueryCountData
.gdi2
, D3DGDI2_TYPE_GETD3DQUERYCOUNT
, sizeof(DD_GETD3DQUERYCOUNTDATA
));
708 PrepareDriverInfoData(&DrvInfo
, &D3dQueryCountData
, sizeof(DD_GETD3DQUERYCOUNTDATA
));
709 D3dQueryCountData
.dwNumQueries
= UINT_MAX
;
711 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
713 if (DrvInfo
.ddRVal
!= S_OK
)
715 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI2_TYPE_GETD3DQUERYCOUNT in GetDriverInfo call");
718 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETD3DQUERYCOUNTDATA
))
720 DPRINT1("Driver returned an invalid DD_GETD3DQUERYCOUNTDATA structure - aborting");
723 else if (D3dQueryCountData
.dwNumQueries
== UINT_MAX
)
725 DPRINT1("Driver didn't set DD_GETD3DQUERYCOUNTDATA.dwNumQueries - aborting");
729 *pNumQueries
= D3dQueryCountData
.dwNumQueries
;
733 /* GUID_GetDriverInfo2 - Query data */
734 if (pD3dQueryList
!= NULL
)
737 DD_GETD3DQUERYDATA D3dQueryData
;
739 for (QueryIndex
= 0; QueryIndex
< D3dQueryCountData
.dwNumQueries
; QueryIndex
++)
741 ResetGetDriverInfo2Data(&D3dQueryData
.gdi2
, D3DGDI2_TYPE_GETD3DQUERY
, sizeof(DD_GETD3DQUERYDATA
));
742 PrepareDriverInfoData(&DrvInfo
, &D3dQueryData
, sizeof(DD_GETD3DQUERYDATA
));
743 D3dQueryData
.dwQueryIndex
= QueryIndex
;
745 if (TRUE
== OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
))
747 if (DrvInfo
.ddRVal
!= S_OK
)
749 DPRINT1("Driver claimed to be DX9 driver, but didn't support D3DGDI2_TYPE_GETD3DQUERY in GetDriverInfo call");
752 else if (DrvInfo
.dwActualSize
!= sizeof(DD_GETD3DQUERYDATA
))
754 DPRINT1("Driver returned an invalid DD_GETD3DQUERYDATA structure - aborting");
758 *pD3dQueryList
= D3dQueryData
.QueryType
;
765 /* D3dDriverData -> pGblDriverData */
766 memcpy(&pGblDriverData
->hwCaps
, &D3dDriverData
.hwCaps
, sizeof(D3DNTHALDEVICEDESC_V1
));
767 pGblDriverData
->dwNumVertices
= D3dDriverData
.dwNumVertices
;
768 pGblDriverData
->dwNumClipVertices
= D3dDriverData
.dwNumClipVertices
;
770 /* GUID_D3DExtendedCaps */
772 DrvInfo
.dwSize
= sizeof(DD_GETDRIVERINFODATA
);
773 DrvInfo
.guidInfo
= GUID_D3DExtendedCaps
;
774 DrvInfo
.dwExpectedSize
= sizeof(D3DHAL_D3DEXTENDEDCAPS
);
775 DrvInfo
.lpvData
= pD3dExtendedCaps
;
776 bRet
= OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
);
778 if (TRUE
!= bRet
|| DrvInfo
.ddRVal
!= S_OK
)
780 DPRINT1("Driver failed call to GetDriverInfo() with: GUID_D3DExtendedCaps");
785 /* GUID_ZPixelFormats */
787 DDPIXELFORMAT
*pZPixelFormats
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, FormatCountData
.dwFormatCount
* sizeof(DDPIXELFORMAT
));
789 DrvInfo
.dwSize
= sizeof(DD_GETDRIVERINFODATA
);
790 DrvInfo
.guidInfo
= GUID_ZPixelFormats
;
791 DrvInfo
.dwExpectedSize
= FormatCountData
.dwFormatCount
* sizeof(DDPIXELFORMAT
);
792 DrvInfo
.lpvData
= pZPixelFormats
;
793 bRet
= OsThunkDdGetDriverInfo(pUnknown6BC
->hDirectDrawLocal
, &DrvInfo
);
795 if (TRUE
!= bRet
|| DrvInfo
.ddRVal
!= S_OK
)
797 DPRINT1("Driver failed call to GetDriverInfo() with: GUID_ZPixelFormats");
798 HeapFree(GetProcessHeap(), 0, pZPixelFormats
);
802 *pNumZStencilFormats
= FormatCountData
.dwFormatCount
;
804 if (pD3dZStencilFormatList
!= NULL
)
805 memcpy(pD3dZStencilFormatList
, pZPixelFormats
, FormatCountData
.dwFormatCount
* sizeof(DDPIXELFORMAT
));
807 HeapFree(GetProcessHeap(), 0, pZPixelFormats
);
810 /* Get current display format */
812 D3DDISPLAYMODE CurrentDisplayMode
;
813 GetAdapterMode(lpszDeviceName
, &CurrentDisplayMode
);
814 pUnknown6BC
->RawDisplayFormat
= CurrentDisplayMode
.Format
;
815 pUnknown6BC
->DisplayFormat
= CurrentDisplayMode
.Format
;
817 if ((HalInfo
.vmiData
.ddpfDisplay
.dwFlags
& DDPF_ALPHAPIXELS
) != 0)
819 if (CurrentDisplayMode
.Format
== D3DFMT_X8R8G8B8
)
821 pUnknown6BC
->DisplayFormat
= D3DFMT_A8R8G8B8
;
823 else if (CurrentDisplayMode
.Format
== D3DFMT_X1R5G5B5
)
825 pUnknown6BC
->DisplayFormat
= D3DFMT_A1R5G5B5
;
829 pDriverCaps
->dwDisplayWidth
= CurrentDisplayMode
.Width
;
830 pDriverCaps
->dwDisplayHeight
= CurrentDisplayMode
.Height
;
831 pDriverCaps
->RawDisplayFormat
= CurrentDisplayMode
.Format
;
832 pDriverCaps
->DisplayFormat
= pUnknown6BC
->DisplayFormat
;
833 pDriverCaps
->dwRefreshRate
= CurrentDisplayMode
.RefreshRate
;
836 /* TODO: Set all internal function pointers to create surface, etc. */
838 /* Set device rect */
841 MONITORINFO MonitorInfo
;
843 memset(&MonitorInfo
, 0, sizeof(MONITORINFO
));
844 MonitorInfo
.cbSize
= sizeof(MONITORINFO
);
846 hMonitor
= GetAdapterMonitor(lpszDeviceName
);
847 if (TRUE
== GetMonitorInfoA(hMonitor
, &MonitorInfo
))
849 pUnknown6BC
->DeviceRect
= MonitorInfo
.rcMonitor
;
853 DPRINT1("Could not get monitor information");
857 pUnknown6BC
->dwCaps
= pDriverCaps
->DriverCaps9
.Caps
;
858 pUnknown6BC
->dwSVBCaps
= pDriverCaps
->dwSVBCaps
;
860 if (FALSE
== bDX8Mode
)
862 pUnknown6BC
->MajorDxVersion
= 9;
864 if (0 != (pDriverCaps
->DriverCaps9
.VertexProcessingCaps
& D3DVTXPCAPS_NO_VSDT_UBYTE4
))
866 DPRINT1("Driver claimed to be DX9 driver, but used depricated D3DCAPS9.VertexProcessingCaps: D3DVTXPCAPS_NO_VSDT_UBYTE4 instead of not setting D3DCAPS9.DeclTypes: D3DDTCAPS_UBYTE4.");
872 pUnknown6BC
->MajorDxVersion
= 8;
874 if (0 == (pDriverCaps
->DriverCaps9
.VertexProcessingCaps
& D3DVTXPCAPS_NO_VSDT_UBYTE4
))
876 pDriverCaps
->DriverCaps9
.DeclTypes
|= D3DDTCAPS_UBYTE4
;
877 pDriverCaps
->DriverCaps9
.VertexProcessingCaps
&= ~D3DVTXPCAPS_NO_VSDT_UBYTE4
;