[PATCH v2 2/9] gdi32: Implement NtGdiDdDDIOpenAdapterFromLuid.

Huw Davies huw at codeweavers.com
Wed Aug 25 07:39:46 CDT 2021


From: Jacek Caban <jacek at codeweavers.com>

And use it for D3DKMTOpenAdapterFromGdiDisplayName.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/gdi32/driver.c    | 41 +++++++++++++++++++++++------------------
 dlls/gdi32/gdi32.spec  |  1 +
 include/ddk/d3dkmthk.h |  6 ++++++
 include/ntgdi.h        |  1 +
 4 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index fba1f1cffea..3073f745f92 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -1257,13 +1257,11 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
     WCHAR *end, key_nameW[MAX_PATH], bufferW[MAX_PATH];
     HDEVINFO devinfo = INVALID_HANDLE_VALUE;
     NTSTATUS status = STATUS_UNSUCCESSFUL;
-    static D3DKMT_HANDLE handle_start = 0;
-    struct d3dkmt_adapter *adapter;
+    D3DKMT_OPENADAPTERFROMLUID luid_desc;
     SP_DEVINFO_DATA device_data;
     DWORD size, state_flags;
     DEVPROPTYPE type;
     HANDLE mutex;
-    LUID luid;
     int index;
 
     TRACE("(%p)\n", desc);
@@ -1279,10 +1277,6 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
     if (*end)
         return STATUS_UNSUCCESSFUL;
 
-    adapter = heap_alloc( sizeof( *adapter ) );
-    if (!adapter)
-        return STATUS_NO_MEMORY;
-
     /* Get adapter LUID from SetupAPI */
     mutex = get_display_device_init_mutex();
 
@@ -1309,28 +1303,39 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
     device_data.cbSize = sizeof( device_data );
     SetupDiOpenDeviceInfoW( devinfo, bufferW, NULL, 0, &device_data );
     if (!SetupDiGetDevicePropertyW( devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &type,
-                                    (BYTE *)&luid, sizeof( luid ), NULL, 0))
+                                    (BYTE *)&luid_desc.AdapterLuid, sizeof( luid_desc.AdapterLuid ),
+                                    NULL, 0))
         goto done;
 
-    EnterCriticalSection( &driver_section );
-    /* D3DKMT_HANDLE is UINT, so we can't use pointer as handle */
-    adapter->handle = ++handle_start;
-    list_add_tail( &d3dkmt_adapters, &adapter->entry );
-    LeaveCriticalSection( &driver_section );
+    if ((status = NtGdiDdDDIOpenAdapterFromLuid( &luid_desc ))) goto done;
 
-    desc->hAdapter = handle_start;
-    desc->AdapterLuid = luid;
+    desc->hAdapter = luid_desc.hAdapter;
+    desc->AdapterLuid = luid_desc.AdapterLuid;
     desc->VidPnSourceId = index;
-    status = STATUS_SUCCESS;
 
 done:
     SetupDiDestroyDeviceInfoList( devinfo );
     release_display_device_init_mutex( mutex );
-    if (status != STATUS_SUCCESS)
-        heap_free( adapter );
     return status;
 }
 
+/******************************************************************************
+ *           NtGdiDdDDIOpenAdapterFromLuid    (win32u.@)
+ */
+NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc )
+{
+    static D3DKMT_HANDLE handle_start = 0;
+    struct d3dkmt_adapter *adapter;
+
+    if (!(adapter = heap_alloc( sizeof( *adapter ) ))) return STATUS_NO_MEMORY;
+
+    EnterCriticalSection( &driver_section );
+    desc->hAdapter = adapter->handle = ++handle_start;
+    list_add_tail( &d3dkmt_adapters, &adapter->entry );
+    LeaveCriticalSection( &driver_section );
+    return STATUS_SUCCESS;
+}
+
 /******************************************************************************
  *           NtGdiDdDDICreateDevice    (win32u.@)
  */
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 48ce04e3819..5bddcd26de6 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -89,6 +89,7 @@
 @ stdcall D3DKMTEscape(ptr) NtGdiDdDDIEscape
 @ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
 @ stdcall D3DKMTOpenAdapterFromHdc(ptr) NtGdiDdDDIOpenAdapterFromHdc
+@ stdcall D3DKMTOpenAdapterFromLuid(ptr) NtGdiDdDDIOpenAdapterFromLuid
 @ stdcall D3DKMTQueryStatistics(ptr) NtGdiDdDDIQueryStatistics
 @ stdcall D3DKMTSetQueuedLimit(ptr) NtGdiDdDDISetQueuedLimit
 @ stdcall D3DKMTSetVidPnSourceOwner(ptr) NtGdiDdDDISetVidPnSourceOwner
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index dc53ea343c0..2ca3c4d7448 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -122,6 +122,12 @@ typedef struct _D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME
     D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
 } D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME;
 
+typedef struct _D3DKMT_OPENADAPTERFROMLUID
+{
+    LUID AdapterLuid;
+    D3DKMT_HANDLE hAdapter;
+} D3DKMT_OPENADAPTERFROMLUID;
+
 typedef struct _D3DKMT_SETVIDPNSOURCEOWNER
 {
     D3DKMT_HANDLE hDevice;
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 7f3ecec8c64..ba4d2ff3556 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -333,6 +333,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc );
 NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc );
 NTSTATUS WINAPI NtGdiDdDDIDestroyDCFromMemory( const D3DKMT_DESTROYDCFROMMEMORY *desc );
 NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc );
+NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc );
 NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats );
 NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc );
 NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc );
-- 
2.23.0




More information about the wine-devel mailing list