Except for keyed mutexes which will be implemented separately, this should be the last remaining bits to make vulkan shared win32 resources usable.
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 );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 30282ff3d5e..1f5daa8f245 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1555,9 +1555,11 @@ static VkResult win32u_vkGetSemaphoreWin32HandleKHR( VkDevice client_device, con
static VkResult win32u_vkImportSemaphoreWin32HandleKHR( VkDevice client_device, const VkImportSemaphoreWin32HandleInfoKHR *handle_info ) { + VkImportSemaphoreFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR}; struct vulkan_device *device = vulkan_device_from_handle( client_device ); struct semaphore *semaphore = semaphore_from_handle( handle_info->semaphore ); D3DKMT_HANDLE local, global = 0; + VkResult res = VK_SUCCESS; HANDLE shared = NULL;
TRACE( "device %p, handle_info %p\n", device, handle_info ); @@ -1587,9 +1589,16 @@ static VkResult win32u_vkImportSemaphoreWin32HandleKHR( VkDevice client_device, return VK_ERROR_INVALID_EXTERNAL_HANDLE; }
- FIXME( "Importing memory handle not yet implemented!\n" ); + if ((fd_info.fd = d3dkmt_object_get_fd( local )) < 0) res = VK_ERROR_INVALID_EXTERNAL_HANDLE; + else + { + fd_info.handleType = get_host_external_semaphore_type(); + fd_info.semaphore = semaphore->obj.host.semaphore; + fd_info.flags = handle_info->flags; + res = device->p_vkImportSemaphoreFdKHR( device->host.device, &fd_info ); + }
- if (handle_info->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) + if (res || handle_info->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) { /* FIXME: Should we still keep the temporary handles for vkGetSemaphoreWin32HandleKHR? */ if (shared) NtClose( shared ); @@ -1603,7 +1612,7 @@ static VkResult win32u_vkImportSemaphoreWin32HandleKHR( VkDevice client_device, semaphore->global = global; semaphore->local = local; } - return VK_SUCCESS; + return res; }
static void win32u_vkGetPhysicalDeviceExternalSemaphoreProperties( VkPhysicalDevice client_physical_device, const VkPhysicalDeviceExternalSemaphoreInfo *client_semaphore_info,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 1f5daa8f245..24acc8ef1a1 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1686,9 +1686,20 @@ static VkResult win32u_vkCreateFence( VkDevice client_device, const VkFenceCreat
if (export_info) { - FIXME( "Exporting fence handle not yet implemented!\n" ); + VkFenceGetFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, .fence = host_fence}; + int fd = -1; + + switch ((fd_info.handleType = get_host_external_fence_type())) + { + case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT: + if ((res = device->p_vkGetFenceFdKHR( device->host.device, &fd_info, &fd ))) goto failed; + break; + default: + FIXME( "Unsupported handle type %#x\n", fd_info.handleType ); + break; + }
- if (!(fence->local = d3dkmt_create_sync( -1, nt_shared ? NULL : &fence->global ))) goto failed; + if (!(fence->local = d3dkmt_create_sync( fd, nt_shared ? NULL : &fence->global ))) goto failed; if (nt_shared && !(fence->shared = create_shared_semaphore_handle( fence->local, &export_win32 ))) goto failed; }
@@ -1699,6 +1710,7 @@ static VkResult win32u_vkCreateFence( VkDevice client_device, const VkFenceCreat return res;
failed: + WARN( "Failed to create fence, res %d\n", res ); device->p_vkDestroyFence( device->host.device, host_fence, NULL ); if (fence->local) d3dkmt_destroy_sync( fence->local ); free( fence );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 24acc8ef1a1..cffbd3b86e6 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1762,10 +1762,12 @@ static VkResult win32u_vkGetFenceWin32HandleKHR( VkDevice client_device, const V
static VkResult win32u_vkImportFenceWin32HandleKHR( VkDevice client_device, const VkImportFenceWin32HandleInfoKHR *handle_info ) { + VkImportFenceFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR}; struct vulkan_device *device = vulkan_device_from_handle( client_device ); struct fence *fence = fence_from_handle( handle_info->fence ); D3DKMT_HANDLE local, global = 0; HANDLE shared = NULL; + VkResult res;
TRACE( "device %p, handle_info %p\n", device, handle_info );
@@ -1793,9 +1795,16 @@ static VkResult win32u_vkImportFenceWin32HandleKHR( VkDevice client_device, cons return VK_ERROR_INVALID_EXTERNAL_HANDLE; }
- FIXME( "Importing memory handle not yet implemented!\n" ); + if ((fd_info.fd = d3dkmt_object_get_fd( local )) < 0) res = VK_ERROR_INVALID_EXTERNAL_HANDLE; + else + { + fd_info.handleType = get_host_external_fence_type(); + fd_info.fence = fence->obj.host.fence; + fd_info.flags = handle_info->flags; + res = device->p_vkImportFenceFdKHR( device->host.device, &fd_info ); + }
- if (handle_info->flags & VK_FENCE_IMPORT_TEMPORARY_BIT) + if (res || handle_info->flags & VK_FENCE_IMPORT_TEMPORARY_BIT) { /* FIXME: Should we still keep the temporary handles for vkGetFenceWin32HandleKHR? */ if (shared) NtClose( shared );