@@ -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