[PATCH v5 1/4] gdi32: Implement D3DKMTOpenAdapterFromGdiDisplayName.

Zhiyi Zhang zzhang at codeweavers.com
Wed Jun 5 10:18:25 CDT 2019


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
v2: Use non-safe list iteration macros.
v3: Fix intermediate test crash.
v4: Make d3dkmt_* struct local.
v5: Avoid a possible race. Sorry about making to v5. Supersede 166048~166051

 .../api-ms-win-dx-d3dkmt-l1-1-0.spec          |  2 +-
 dlls/d3d11/d3d11.spec                         |  1 +
 dlls/gdi32/driver.c                           | 50 +++++++++++++++++++
 dlls/gdi32/gdi32.spec                         |  1 +
 dlls/gdi32/tests/driver.c                     |  2 +-
 include/ddk/d3dkmthk.h                        |  1 +
 6 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
index e8aa38edf4..43186e8fcc 100644
--- a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
+++ b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
@@ -46,7 +46,7 @@
 @ stub D3DKMTLock
 @ stub D3DKMTOfferAllocations
 @ stub D3DKMTOpenAdapterFromDeviceName
-@ stub D3DKMTOpenAdapterFromGdiDisplayName
+@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr) gdi32.D3DKMTOpenAdapterFromGdiDisplayName
 @ stdcall D3DKMTOpenAdapterFromHdc(ptr) gdi32.D3DKMTOpenAdapterFromHdc
 @ stub D3DKMTOpenKeyedMutex
 @ stub D3DKMTOpenKeyedMutex2
diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec
index 267778ab14..365e5d7c0c 100644
--- a/dlls/d3d11/d3d11.spec
+++ b/dlls/d3d11/d3d11.spec
@@ -22,6 +22,7 @@
 @ stub D3DKMTGetRuntimeData
 @ stub D3DKMTGetSharedPrimaryHandle
 @ stub D3DKMTLock
+@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr) gdi32.D3DKMTOpenAdapterFromGdiDisplayName
 @ stub D3DKMTOpenAdapterFromHdc
 @ stub D3DKMTOpenResource
 @ stub D3DKMTPresent
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 88f49a03b6..01efc6903b 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -41,6 +41,7 @@
 #include "wine/unicode.h"
 #include "wine/list.h"
 #include "wine/debug.h"
+#include "wine/heap.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(driver);
 
@@ -51,9 +52,18 @@ struct graphics_driver
     const struct gdi_dc_funcs *funcs;
 };
 
+struct d3dkmt_adapter
+{
+    D3DKMT_HANDLE handle;               /* Kernel mode graphics adapter handle */
+    INT ordinal;                        /* Graphics adapter ordinal */
+    struct list entry;                  /* List entry */
+};
+
 static struct list drivers = LIST_INIT( drivers );
 static struct graphics_driver *display_driver;
 
+static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters );
+
 const struct gdi_dc_funcs *font_driver = NULL;
 
 static CRITICAL_SECTION driver_section;
@@ -1272,3 +1282,43 @@ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
     FIXME("(%p): stub\n", desc);
     return STATUS_SUCCESS;
 }
+
+/******************************************************************************
+ *		D3DKMTOpenAdapterFromGdiDisplayName [GDI32.@]
+ */
+NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
+{
+    static const WCHAR display1W[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','1',0};
+    static D3DKMT_HANDLE handle_start = 0;
+    struct d3dkmt_adapter *adapter;
+
+    TRACE("(%p) semi-stub\n", desc);
+
+    if (!desc)
+        return STATUS_UNSUCCESSFUL;
+
+    /* FIXME: Support multiple monitors */
+    if (lstrcmpiW( desc->DeviceName, display1W ))
+    {
+        FIXME("%s is unsupported\n", wine_dbgstr_w( desc->DeviceName ));
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    adapter = heap_alloc( sizeof( *adapter ) );
+    if (!adapter)
+        return STATUS_NO_MEMORY;
+
+    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 );
+
+    desc->hAdapter = handle_start;
+    /* FIXME: Support AdapterLuid */
+    desc->AdapterLuid.LowPart = 0;
+    desc->AdapterLuid.HighPart = 0;
+    desc->VidPnSourceId = 0;
+    return STATUS_SUCCESS;
+}
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 2d158e0f1b..5c17ed9ee8 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -84,6 +84,7 @@
 @ stdcall D3DKMTCreateDCFromMemory(ptr)
 @ stdcall D3DKMTDestroyDCFromMemory(ptr)
 @ stdcall D3DKMTEscape(ptr)
+@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
 @ stdcall D3DKMTOpenAdapterFromHdc(ptr)
 @ stdcall DPtoLP(long ptr long)
 @ stdcall DeleteColorSpace(long)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index 3b8953b4c3..067c162838 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -56,7 +56,7 @@ static void test_D3DKMTOpenAdapterFromGdiDisplayName(void)
     if (!pD3DKMTOpenAdapterFromGdiDisplayName
         || pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc) == STATUS_PROCEDURE_NOT_FOUND)
     {
-        skip("D3DKMTOpenAdapterFromGdiDisplayName() is unavailable.\n");
+        win_skip("D3DKMTOpenAdapterFromGdiDisplayName() is unavailable.\n");
         return;
     }
 
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index c87321058c..5436cb6612 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -168,6 +168,7 @@ extern "C"
 NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc);
 NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc);
 NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc);
+NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc);
 
 #ifdef __cplusplus
 }
-- 
2.20.1





More information about the wine-devel mailing list