From: Krzysztof Bogacki krzysztof.bogacki@leancode.pl
Signed-off-by: Krzysztof Bogacki krzysztof.bogacki@leancode.pl --- dlls/win32u/sysparams.c | 83 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 5d8f1d1ef2c..6ba0ef61715 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -6581,6 +6581,85 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD */ NTSTATUS WINAPI NtGdiDdDDIEnumAdapters2( D3DKMT_ENUMADAPTERS2 *desc ) { - FIXME(" (%p): stub\n", desc ); - return STATUS_PROCEDURE_NOT_FOUND; + D3DKMT_OPENADAPTERFROMLUID open_adapter_from_luid; + D3DKMT_ADAPTERINFO *adapter_infos = NULL; + static const ULONG max_adapters = 32; + D3DKMT_CLOSEADAPTER close_adapter; + NTSTATUS status = STATUS_SUCCESS; + struct adapter *adapter; + ULONG idx = 0, count; + + TRACE( "(%p)\n", desc ); + + if (!desc) return STATUS_INVALID_PARAMETER; + + if (!desc->pAdapters) + { + desc->NumAdapters = max_adapters; + return STATUS_SUCCESS; + } + + if (!lock_display_devices()) return STATUS_UNSUCCESSFUL; + + if ((count = list_count( &adapters )) > max_adapters) + { + WARN( "Too many adapters (%u), only up to %u can be enumerated.\n", + (unsigned int)count, (unsigned int)max_adapters ); + count = max_adapters; + } + + if (count > desc->NumAdapters) + { + status = STATUS_BUFFER_TOO_SMALL; + goto done; + } + + if (!(adapter_infos = calloc( count, sizeof(*adapter_infos) ))) + { + status = STATUS_NO_MEMORY; + goto done; + } + + LIST_FOR_EACH_ENTRY( adapter, &adapters, struct adapter, entry ) + { + if (adapter->gpu_luid.LowPart || adapter->gpu_luid.HighPart) + { + open_adapter_from_luid.AdapterLuid = adapter->gpu_luid; + + /* give the GDI driver a chance to be notified about new adapter handle */ + if (NT_SUCCESS( NtGdiDdDDIOpenAdapterFromLuid( &open_adapter_from_luid ) )) + { + adapter_infos[idx].AdapterLuid = adapter->gpu_luid; + adapter_infos[idx].hAdapter = open_adapter_from_luid.hAdapter; + idx += 1; + continue; + } + else + { + ERR( "Failed to open adapter %u from LUID.\n", (unsigned int)idx ); + } + } + else + { + ERR( "Adapter %u does not have a LUID.\n", (unsigned int)idx ); + } + + while (idx--) + { + close_adapter.hAdapter = adapter_infos[idx].hAdapter; + NtGdiDdDDICloseAdapter( &close_adapter ); + } + + status = STATUS_UNSUCCESSFUL; + goto done; + } + + if ((desc->NumAdapters = idx)) + memcpy( desc->pAdapters, adapter_infos, idx * sizeof(*adapter_infos) ); + +done: + unlock_display_devices(); + free( adapter_infos ); + + return status; }