 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 19 +++++++++++++++++++ dlls/win32u/vulkan.c | 30 ++++++++++++++++++++++++++++-- dlls/win32u/win32u_private.h | 1 + 3 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 878104b009b..7eb3928ba72 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1718,6 +1718,25 @@ failed: return 0; }
+/* open a D3DKMT global or shared sync */ +D3DKMT_HANDLE d3dkmt_open_sync( D3DKMT_HANDLE global, HANDLE shared ) +{ + struct d3dkmt_object *sync = NULL; + NTSTATUS status; + UINT dummy = 0; + + TRACE( "global %#x, shared %p\n", global, shared ); + + if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) goto failed; + if ((status = d3dkmt_object_open( sync, global, shared, NULL, &dummy ))) goto failed; + return sync->local; + +failed: + WARN( "Failed to open sync, status %#x\n", status ); + if (sync) d3dkmt_object_free( sync ); + return 0; +} + /* destroy a locally opened D3DKMT sync */ NTSTATUS d3dkmt_destroy_sync( D3DKMT_HANDLE local ) { diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 558569a06b6..81251a6064a 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1459,10 +1459,36 @@ static VkResult win32u_vkGetSemaphoreWin32HandleKHR( VkDevice client_device, con static VkResult win32u_vkImportSemaphoreWin32HandleKHR( VkDevice client_device, const VkImportSemaphoreWin32HandleInfoKHR *handle_info ) { struct vulkan_device *device = vulkan_device_from_handle( client_device ); + struct semaphore *semaphore = semaphore_from_handle( handle_info->semaphore ); + D3DKMT_HANDLE local, global = 0;
- FIXME( "device %p, handle_info %p stub!\n", device, handle_info ); + TRACE( "device %p, handle_info %p\n", device, handle_info );
- return VK_ERROR_INCOMPATIBLE_DRIVER; + switch (handle_info->handleType) + { + case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT: + global = PtrToUlong( handle_info->handle ); + if (!(local = d3dkmt_open_sync( global, NULL ))) return VK_ERROR_INVALID_EXTERNAL_HANDLE; + break; + default: + FIXME( "Unsupported handle type %#x\n", handle_info->handleType ); + return VK_ERROR_INVALID_EXTERNAL_HANDLE; + } + + FIXME( "Importing memory handle not yet implemented!\n" ); + + if (handle_info->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) + { + /* FIXME: Should we still keep the temporary handles for vkGetSemaphoreWin32HandleKHR? */ + d3dkmt_destroy_sync( local ); + } + else + { + if (semaphore->local) d3dkmt_destroy_sync( semaphore->local ); + semaphore->global = global; + semaphore->local = local; + } + return VK_SUCCESS; }
static void win32u_vkGetPhysicalDeviceExternalSemaphoreProperties( VkPhysicalDevice client_physical_device, const VkPhysicalDeviceExternalSemaphoreInfo *client_semaphore_info, diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 6fbd0b74c9f..6eaa7270b01 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -210,6 +210,7 @@ extern D3DKMT_HANDLE d3dkmt_open_resource( D3DKMT_HANDLE global, HANDLE shared ) extern NTSTATUS d3dkmt_destroy_resource( D3DKMT_HANDLE local );
extern D3DKMT_HANDLE d3dkmt_create_sync( D3DKMT_HANDLE *global ); +extern D3DKMT_HANDLE d3dkmt_open_sync( D3DKMT_HANDLE global, HANDLE shared ); extern NTSTATUS d3dkmt_destroy_sync( D3DKMT_HANDLE local );
/* winstation.c */