[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