-- v3: win32u: Implement NtGdiDdDDIOpenAdapterFromDeviceName().
From: Paul Gofman pgofman@codeweavers.com
--- dlls/gdi32/tests/driver.c | 4 +-- dlls/win32u/d3dkmt.c | 20 ------------- dlls/win32u/sysparams.c | 59 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 22 deletions(-)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index ca67b40d860..d5380962129 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -907,7 +907,7 @@ static void test_D3DKMTOpenAdapterFromDeviceName_deviface(const GUID *devinterfa ok(ret, "Got unexpected ret %d, GetLastError() %lu.\n", ret, GetLastError());
status = pD3DKMTOpenAdapterFromDeviceName(&device_name); - todo_wine_if(todo) ok(status == expected_status, "Got status %#lx, expected %#lx.\n", status, expected_status); + ok(status == expected_status, "Got status %#lx, expected %#lx.\n", status, expected_status);
if (!status) { @@ -919,7 +919,7 @@ static void test_D3DKMTOpenAdapterFromDeviceName_deviface(const GUID *devinterfa if (ret) { ret = RtlEqualLuid( &luid, &device_name.AdapterLuid); - todo_wine ok(ret, "Luid does not match.\n"); + ok(ret, "Luid does not match.\n"); } else { diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 49fb5e60c52..7fd4a4950da 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -168,26 +168,6 @@ NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) return status; }
-/****************************************************************************** - * NtGdiDdDDIOpenAdapterFromDeviceName (win32u.@) - */ -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ) -{ - D3DKMT_OPENADAPTERFROMLUID desc_luid; - NTSTATUS status; - - FIXME( "desc %p stub.\n", desc ); - - if (!desc || !desc->pDeviceName) return STATUS_INVALID_PARAMETER; - - memset( &desc_luid, 0, sizeof(desc_luid) ); - if ((status = NtGdiDdDDIOpenAdapterFromLuid( &desc_luid ))) return status; - - desc->AdapterLuid = desc_luid.AdapterLuid; - desc->hAdapter = desc_luid.hAdapter; - return STATUS_SUCCESS; -} - static UINT get_vulkan_physical_devices( VkPhysicalDevice **devices ) { UINT device_count; diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 7c5fbf66486..026403a1e06 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -7519,6 +7519,65 @@ NTSTATUS WINAPI NtGdiDdDDIEnumAdapters( D3DKMT_ENUMADAPTERS *desc ) return status; }
+/****************************************************************************** + * NtGdiDdDDIOpenAdapterFromDeviceName (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ) +{ + unsigned int status = STATUS_INVALID_PARAMETER; + D3DKMT_OPENADAPTERFROMLUID desc_luid; + unsigned int len, name_len = 0; + BOOL found = FALSE; + struct gpu *gpu; + char *name; + + TRACE( "desc %p.\n", desc ); + + if (!desc || !desc->pDeviceName) return STATUS_INVALID_PARAMETER; + + if (!(name = malloc( wcslen( desc->pDeviceName ) + 1 ))) return STATUS_NO_MEMORY; + + for (len = 0; desc->pDeviceName[len]; ++len) + { + if (desc->pDeviceName[len] >> 8) goto done; + if ((name[len] = toupper( desc->pDeviceName[len] )) == '#') + { + name[len] = '\'; + name_len = len; + } + } + name[len] = 0; + + if (!name_len || strncmp( name, "\\?\", 4 )) goto done; + if (strcmp( name + name_len + 1, guid_display_device_arrivalA )) goto done; + + name[name_len] = 0; + if (!lock_display_devices( FALSE )) + { + status = STATUS_UNSUCCESSFUL; + goto done; + } + LIST_FOR_EACH_ENTRY( gpu, &gpus, struct gpu, entry ) + { + if (strcmp( name + 4, gpu->path )) continue; + found = TRUE; + desc_luid.AdapterLuid = gpu->luid; + break; + } + unlock_display_devices(); + + if (found && !(status = NtGdiDdDDIOpenAdapterFromLuid( &desc_luid ))) + { + desc->AdapterLuid = desc_luid.AdapterLuid; + desc->hAdapter = desc_luid.hAdapter; + } + +done: + free( name ); + TRACE( "%s -> %#x.\n", debugstr_w(desc->pDeviceName), status ); + return status; +} + /* Find the Vulkan device UUID corresponding to a LUID */ BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid ) {
v3: - get back 'break' lost on the way.
This merge request was approved by Zhiyi Zhang.