Skip to content

Commit 5207004

Browse files
liam-middlebrookivyl
authored andcommitted
gdi32: Implement D3DKMTEnumAdapters2
Signed-off-by: Liam Middlebrook <[email protected]> Note: This commit is specifically targeted towards ValveSoftware/wine experimental_9.0 branch. Upstream wine contains commits which already implement this, but are part of a larger series of changes inter-twined with WoW64 and unification of GDI backends. Link: #259
1 parent 8e77623 commit 5207004

1 file changed

Lines changed: 71 additions & 3 deletions

File tree

dlls/gdi32/objects.c

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -971,10 +971,78 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
971971
return status;
972972
}
973973

974-
NTSTATUS WINAPI D3DKMTEnumAdapters2( const void *param )
974+
NTSTATUS WINAPI D3DKMTEnumAdapters2( D3DKMT_ENUMADAPTERS2 *enumAdapters )
975975
{
976-
FIXME( "param %p stub.\n", param );
977-
return STATUS_NOT_SUPPORTED;
976+
NTSTATUS status = STATUS_SUCCESS;
977+
SP_DEVINFO_DATA device_data;
978+
DEVPROPTYPE type;
979+
HDEVINFO devinfo;
980+
UINT dev_count = 0;
981+
HANDLE mutex;
982+
983+
TRACE("(%p)\n", enumAdapters);
984+
985+
mutex = get_display_device_init_mutex();
986+
devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, L"PCI", NULL, 0);
987+
device_data.cbSize = sizeof(device_data);
988+
989+
while(SetupDiEnumDeviceInfo(devinfo, dev_count++, &device_data))
990+
{
991+
D3DKMT_OPENADAPTERFROMLUID luid_desc;
992+
UINT dev_idx = dev_count - 1;
993+
D3DKMT_ADAPTERINFO *adapter;
994+
995+
TRACE("Device: %u\n", dev_idx);
996+
997+
/* If nothing to write, just pass through the loop */
998+
if (!enumAdapters->pAdapters)
999+
continue;
1000+
1001+
adapter = (D3DKMT_ADAPTERINFO*)(enumAdapters->pAdapters + dev_idx);
1002+
1003+
if (SetupDiGetDevicePropertyW(devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &type,
1004+
(BYTE *)&luid_desc.AdapterLuid, sizeof(luid_desc.AdapterLuid), NULL, 0))
1005+
{
1006+
/* NumOfSources appears to be in reference to displays. This could mean connected
1007+
* displays, maximum number of "heads", surfaces for direct scanout, or something else
1008+
* entirely. It's not clear from the MSDN page what kind of value is actually expected
1009+
* here.
1010+
*
1011+
* bPrecisePresentRegionsPreferred sounds like a scanout-level optimization. Again, MSDN
1012+
* isn't very descriptive about what this really means. Given that it's typical for
1013+
* modern GPUs to scanout an entire surface at once, leave this falsey.
1014+
*/
1015+
adapter->NumOfSources = 0;
1016+
adapter->bPrecisePresentRegionsPreferred = FALSE;
1017+
FIXME("NumOfSources and bPrecisePresentRegionsPreferred not set, need implementation.\n");
1018+
1019+
if ((status = NtGdiDdDDIOpenAdapterFromLuid(&luid_desc)))
1020+
break;
1021+
1022+
adapter->AdapterLuid = luid_desc.AdapterLuid;
1023+
adapter->hAdapter = luid_desc.hAdapter;
1024+
1025+
TRACE("hAdapter: %u AdapterLuid: %08lx:%08lx NumOfSources: %lu bPrecisePresentRegionsPreferred: %d\n",
1026+
adapter->hAdapter,
1027+
adapter->AdapterLuid.HighPart,
1028+
adapter->AdapterLuid.LowPart,
1029+
adapter->NumOfSources,
1030+
adapter->bPrecisePresentRegionsPreferred);
1031+
}
1032+
else
1033+
{
1034+
TRACE("no known adapter\n");
1035+
}
1036+
}
1037+
/* decrement dev count to actual count */
1038+
dev_count--;
1039+
SetupDiDestroyDeviceInfoList(devinfo);
1040+
release_display_device_init_mutex(mutex);
1041+
1042+
TRACE("Devices enumerated: %u\n", dev_count);
1043+
enumAdapters->NumAdapters = dev_count;
1044+
1045+
return status;
9781046
}
9791047

9801048
/***********************************************************************

0 commit comments

Comments
 (0)