[PATCH v2 3/4] gdi32: Implement D3DKMTCreateDevice.
Zhiyi Zhang
zzhang at codeweavers.com
Tue Jun 4 05:47:10 CDT 2019
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
.../api-ms-win-dx-d3dkmt-l1-1-0.spec | 2 +-
dlls/d3d11/d3d11.spec | 2 +-
dlls/gdi32/driver.c | 46 +++++++++++++++++++
dlls/gdi32/gdi32.spec | 1 +
dlls/gdi32/tests/driver.c | 2 +-
include/ddk/d3dkmthk.h | 1 +
include/wine/gdi_driver.h | 6 +++
7 files changed, 57 insertions(+), 3 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 43186e8fcc..cb7935bbbc 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
@@ -12,7 +12,7 @@
@ stub D3DKMTCreateAllocation2
@ stub D3DKMTCreateContext
@ stdcall D3DKMTCreateDCFromMemory(ptr) gdi32.D3DKMTCreateDCFromMemory
-@ stub D3DKMTCreateDevice
+@ stdcall D3DKMTCreateDevice(ptr) gdi32.D3DKMTCreateDevice
@ stub D3DKMTCreateKeyedMutex
@ stub D3DKMTCreateKeyedMutex2
@ stub D3DKMTCreateOutputDupl
diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec
index 87304b7c13..e4692ace9c 100644
--- a/dlls/d3d11/d3d11.spec
+++ b/dlls/d3d11/d3d11.spec
@@ -8,7 +8,7 @@
@ stdcall D3DKMTCloseAdapter(ptr) gdi32.D3DKMTCloseAdapter
@ stub D3DKMTCreateAllocation
@ stub D3DKMTCreateContext
-@ stub D3DKMTCreateDevice
+@ stdcall D3DKMTCreateDevice(ptr) gdi32.D3DKMTCreateDevice
@ stub D3DKMTCreateSynchronizationObject
@ stub D3DKMTDestroyAllocation
@ stub D3DKMTDestroyContext
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index e20621f873..0518f1e65f 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -56,6 +56,7 @@ static struct list drivers = LIST_INIT( drivers );
static struct graphics_driver *display_driver;
static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters );
+static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices );
const struct gdi_dc_funcs *font_driver = NULL;
@@ -1332,3 +1333,48 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
LeaveCriticalSection( &driver_section );
return STATUS_SUCCESS;
}
+
+/******************************************************************************
+ * D3DKMTCreateDevice [GDI32.@]
+ */
+NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc )
+{
+ static D3DKMT_HANDLE handle_start = 0;
+ struct d3dkmt_adapter *adapter;
+ struct d3dkmt_device *device;
+ BOOL found = FALSE;
+
+ TRACE("(%p)\n", desc);
+
+ if (!desc)
+ return STATUS_INVALID_PARAMETER;
+
+ EnterCriticalSection( &driver_section );
+ LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry )
+ {
+ if (adapter->handle == desc->hAdapter)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ LeaveCriticalSection( &driver_section );
+
+ if (!found)
+ return STATUS_INVALID_PARAMETER;
+
+ if (desc->Flags.LegacyMode || desc->Flags.RequestVSync || desc->Flags.DisableGpuTimeout)
+ WARN("Flags unsupported.\n");
+
+ device = heap_alloc_zero( sizeof( *device ) );
+ if (!device)
+ return STATUS_NO_MEMORY;
+
+ device->handle = ++handle_start;
+ desc->hDevice = device->handle;
+
+ EnterCriticalSection( &driver_section );
+ list_add_tail( &d3dkmt_devices, &device->entry );
+ LeaveCriticalSection( &driver_section );
+ return STATUS_SUCCESS;
+}
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 5c17ed9ee8..88fe846eb8 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -82,6 +82,7 @@
@ stdcall CreateSolidBrush(long)
@ stdcall D3DKMTCloseAdapter(ptr)
@ stdcall D3DKMTCreateDCFromMemory(ptr)
+@ stdcall D3DKMTCreateDevice(ptr)
@ stdcall D3DKMTDestroyDCFromMemory(ptr)
@ stdcall D3DKMTEscape(ptr)
@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index caded27aef..f8cd1d14bd 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -196,7 +196,7 @@ static void test_D3DKMTCreateDevice(void)
if (!pD3DKMTCreateDevice || pD3DKMTCreateDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND)
{
- skip("D3DKMTCreateDevice() or D3DKMTDestroyDevice() is unavailable.\n");
+ win_skip("D3DKMTCreateDevice() is unavailable.\n");
return;
}
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index 5436cb6612..90bf907e30 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -166,6 +166,7 @@ extern "C"
#endif /* __cplusplus */
NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc);
+NTSTATUS WINAPI D3DKMTCreateDevice(D3DKMT_CREATEDEVICE *desc);
NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc);
NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc);
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc);
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 5d09462774..2da25cc2f5 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -72,6 +72,12 @@ struct d3dkmt_adapter
struct list entry; /* List entry */
};
+struct d3dkmt_device
+{
+ D3DKMT_HANDLE handle; /* Kernel mode graphics device handle*/
+ struct list entry; /* List entry */
+};
+
struct gdi_dc_funcs
{
INT (*pAbortDoc)(PHYSDEV);
--
2.20.1
More information about the wine-devel
mailing list