[PATCH v3 1/4] gdi32: Support multiple monitors in D3DKMTOpenAdapterFromGdiDisplayName.

Zhiyi Zhang zzhang at codeweavers.com
Thu Aug 1 11:55:37 CDT 2019


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
v3: Supersede 167533~167537. Merge patches and some comments clean up.

 dlls/gdi32/driver.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 90f9656085..b86780d3fd 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -55,7 +55,6 @@ struct graphics_driver
 struct d3dkmt_adapter
 {
     D3DKMT_HANDLE handle;               /* Kernel mode graphics adapter handle */
-    INT ordinal;                        /* Graphics adapter ordinal */
     struct list entry;                  /* List entry */
 };
 
@@ -1339,21 +1338,20 @@ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
  */
 NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
 {
-    static const WCHAR display1W[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','1',0};
+    static const WCHAR displayW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y'};
     static D3DKMT_HANDLE handle_start = 0;
     struct d3dkmt_adapter *adapter;
+    WCHAR *end;
+    int id;
 
     TRACE("(%p) semi-stub\n", desc);
 
-    if (!desc)
+    if (!desc || strncmpiW( desc->DeviceName, displayW, ARRAY_SIZE(displayW) ))
         return STATUS_UNSUCCESSFUL;
 
-    /* FIXME: Support multiple monitors */
-    if (lstrcmpiW( desc->DeviceName, display1W ))
-    {
-        FIXME("%s is unsupported\n", wine_dbgstr_w( desc->DeviceName ));
+    id = strtolW( desc->DeviceName + ARRAY_SIZE(displayW), &end, 10 ) - 1;
+    if (*end)
         return STATUS_UNSUCCESSFUL;
-    }
 
     adapter = heap_alloc( sizeof( *adapter ) );
     if (!adapter)
@@ -1362,7 +1360,6 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
     EnterCriticalSection( &driver_section );
     /* D3DKMT_HANDLE is UINT, so we can't use pointer as handle */
     adapter->handle = ++handle_start;
-    adapter->ordinal = 0;
     list_add_tail( &d3dkmt_adapters, &adapter->entry );
     LeaveCriticalSection( &driver_section );
 
@@ -1370,7 +1367,7 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
     /* FIXME: Support AdapterLuid */
     desc->AdapterLuid.LowPart = 0;
     desc->AdapterLuid.HighPart = 0;
-    desc->VidPnSourceId = 0;
+    desc->VidPnSourceId = id;
     return STATUS_SUCCESS;
 }
 
-- 
2.20.1





More information about the wine-devel mailing list