[PATCH v4 4/4] gdi32: Implement D3DKMTDestroyDevice.
Zhiyi Zhang
zzhang at codeweavers.com
Wed Jun 5 03:50:01 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 | 29 +++++++++++++++++++
dlls/gdi32/gdi32.spec | 1 +
dlls/gdi32/tests/driver.c | 10 +++----
include/ddk/d3dkmthk.h | 1 +
6 files changed, 38 insertions(+), 7 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 cb7935bbbc..43452cda74 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
@@ -22,7 +22,7 @@
@ stub D3DKMTDestroyAllocation
@ stub D3DKMTDestroyContext
@ stdcall D3DKMTDestroyDCFromMemory(ptr) gdi32.D3DKMTDestroyDCFromMemory
-@ stub D3DKMTDestroyDevice
+@ stdcall D3DKMTDestroyDevice(ptr) gdi32.D3DKMTDestroyDevice
@ stub D3DKMTDestroyKeyedMutex
@ stub D3DKMTDestroyOutputDupl
@ stub D3DKMTDestroyOverlay
diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec
index e4692ace9c..01bc8bfebc 100644
--- a/dlls/d3d11/d3d11.spec
+++ b/dlls/d3d11/d3d11.spec
@@ -12,7 +12,7 @@
@ stub D3DKMTCreateSynchronizationObject
@ stub D3DKMTDestroyAllocation
@ stub D3DKMTDestroyContext
-@ stub D3DKMTDestroyDevice
+@ stdcall D3DKMTDestroyDevice(ptr) gdi32.D3DKMTDestroyDevice
@ stub D3DKMTDestroySynchronizationObject
@ stub D3DKMTEscape
@ stub D3DKMTGetContextSchedulingPriority
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index d5765af2a1..9208f6ecd5 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -1395,3 +1395,32 @@ NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc )
LeaveCriticalSection( &driver_section );
return STATUS_SUCCESS;
}
+
+/******************************************************************************
+ * D3DKMTDestroyDevice [GDI32.@]
+ */
+NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
+{
+ NTSTATUS status = STATUS_INVALID_PARAMETER;
+ struct d3dkmt_device *device;
+
+ TRACE("(%p)\n", desc);
+
+ if (!desc || !desc->hDevice)
+ return STATUS_INVALID_PARAMETER;
+
+ EnterCriticalSection( &driver_section );
+ LIST_FOR_EACH_ENTRY( device, &d3dkmt_devices, struct d3dkmt_device, entry )
+ {
+ if (device->handle == desc->hDevice)
+ {
+ list_remove( &device->entry );
+ heap_free( device );
+ status = STATUS_SUCCESS;
+ break;
+ }
+ }
+ LeaveCriticalSection( &driver_section );
+
+ return status;
+}
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 88fe846eb8..9abd82173c 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -84,6 +84,7 @@
@ stdcall D3DKMTCreateDCFromMemory(ptr)
@ stdcall D3DKMTCreateDevice(ptr)
@ stdcall D3DKMTDestroyDCFromMemory(ptr)
+@ stdcall D3DKMTDestroyDevice(ptr)
@ stdcall D3DKMTEscape(ptr)
@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
@ stdcall D3DKMTOpenAdapterFromHdc(ptr)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index f5c23dad76..b5f6f75a83 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -194,9 +194,9 @@ static void test_D3DKMTCreateDevice(void)
D3DKMT_DESTROYDEVICE destroy_device_desc;
NTSTATUS status;
- if (!pD3DKMTCreateDevice || pD3DKMTCreateDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND || !pD3DKMTDestroyDevice)
+ if (!pD3DKMTCreateDevice || pD3DKMTCreateDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND)
{
- skip("D3DKMTCreateDevice() or D3DKMTDestroyDevice() is unavailable.\n");
+ win_skip("D3DKMTCreateDevice() is unavailable.\n");
return;
}
@@ -240,17 +240,17 @@ static void test_D3DKMTDestroyDevice(void)
if (!pD3DKMTDestroyDevice || pD3DKMTDestroyDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND)
{
- skip("D3DKMTDestroyDevice() is unavailable.\n");
+ win_skip("D3DKMTDestroyDevice() is unavailable.\n");
return;
}
/* Invalid parameters */
status = pD3DKMTDestroyDevice(NULL);
- todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
+ ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
memset(&destroy_device_desc, 0, sizeof(destroy_device_desc));
status = pD3DKMTDestroyDevice(&destroy_device_desc);
- todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
+ ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
}
static void test_D3DKMTCheckVidPnExclusiveOwnership(void)
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index 90bf907e30..081758bf5d 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -169,6 +169,7 @@ 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 D3DKMTDestroyDevice(const D3DKMT_DESTROYDEVICE *desc);
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc);
#ifdef __cplusplus
--
2.20.1
More information about the wine-devel
mailing list