From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 4 ++-- dlls/win32u/vulkan.c | 18 +++++++++++++++--- dlls/win32u/win32u_private.h | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index ded774215fe..b60639374b3 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1755,7 +1755,7 @@ NTSTATUS d3dkmt_destroy_resource( D3DKMT_HANDLE local ) }
/* create a D3DKMT global or shared sync */ -D3DKMT_HANDLE d3dkmt_create_sync( D3DKMT_HANDLE *global ) +D3DKMT_HANDLE d3dkmt_create_sync( int fd, D3DKMT_HANDLE *global ) { struct d3dkmt_object *sync = NULL; NTSTATUS status; @@ -1763,7 +1763,7 @@ D3DKMT_HANDLE d3dkmt_create_sync( D3DKMT_HANDLE *global ) TRACE( "global %p\n", global );
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) goto failed; - if ((status = d3dkmt_object_create( sync, -1, !global, NULL, 0 ))) goto failed; + if ((status = d3dkmt_object_create( sync, fd, !global, NULL, 0 ))) goto failed; if (global) *global = sync->global; return sync->local;
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index bb660fd5d0c..30282ff3d5e 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1478,9 +1478,20 @@ static VkResult win32u_vkCreateSemaphore( VkDevice client_device, const VkSemaph
if (export_info) { - FIXME( "Exporting semaphore handle not yet implemented!\n" ); + VkSemaphoreGetFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, .semaphore = host_semaphore}; + int fd = -1;
- if (!(semaphore->local = d3dkmt_create_sync( nt_shared ? NULL : &semaphore->global ))) goto failed; + switch ((fd_info.handleType = get_host_external_semaphore_type())) + { + case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT: + if ((res = device->p_vkGetSemaphoreFdKHR( device->host.device, &fd_info, &fd ))) goto failed; + break; + default: + FIXME( "Unsupported handle type %#x\n", fd_info.handleType ); + break; + } + + if (!(semaphore->local = d3dkmt_create_sync( fd, nt_shared ? NULL : &semaphore->global ))) goto failed; if (nt_shared && !(semaphore->shared = create_shared_semaphore_handle( semaphore->local, &export_win32 ))) goto failed; }
@@ -1491,6 +1502,7 @@ static VkResult win32u_vkCreateSemaphore( VkDevice client_device, const VkSemaph return res;
failed: + WARN( "Failed to create semaphore, res %d\n", res ); device->p_vkDestroySemaphore( device->host.device, host_semaphore, NULL ); if (semaphore->local) d3dkmt_destroy_sync( semaphore->local ); free( semaphore ); @@ -1667,7 +1679,7 @@ static VkResult win32u_vkCreateFence( VkDevice client_device, const VkFenceCreat { FIXME( "Exporting fence handle not yet implemented!\n" );
- if (!(fence->local = d3dkmt_create_sync( nt_shared ? NULL : &fence->global ))) goto failed; + if (!(fence->local = d3dkmt_create_sync( -1, nt_shared ? NULL : &fence->global ))) goto failed; if (nt_shared && !(fence->shared = create_shared_semaphore_handle( fence->local, &export_win32 ))) goto failed; }
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 99762011ba0..20a76bb6e40 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -211,7 +211,7 @@ extern D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ); 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_create_sync( int fd, D3DKMT_HANDLE *global ); extern D3DKMT_HANDLE d3dkmt_open_sync( D3DKMT_HANDLE global, HANDLE shared ); extern NTSTATUS d3dkmt_destroy_sync( D3DKMT_HANDLE local );