From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/win32u/vulkan.c | 23 +++++++++++++++++++++++ dlls/winevulkan/vulkan.c | 6 +++++- include/wine/vulkan_driver.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index c075fad1c37..a31563e07c8 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -71,6 +71,7 @@ struct device_memory D3DKMT_HANDLE sync; D3DKMT_HANDLE mutex; + VkSemaphore semaphore; }; static inline struct device_memory *device_memory_from_handle( VkDeviceMemory handle ) @@ -359,6 +360,26 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA break; } + if (device->has_win32_keyed_mutex && memory->sync) + { + VkSemaphoreTypeCreateInfo semaphore_type = {.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO}; + VkSemaphoreCreateInfo semaphore_create = {.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, .pNext = &semaphore_type}; + VkImportSemaphoreFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR}; + + semaphore_type.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE; + if ((res = device->p_vkCreateSemaphore( device->host.device, &semaphore_create, NULL, &memory->semaphore ))) goto failed; + + fd_info.handleType = get_host_external_semaphore_type(); + fd_info.semaphore = memory->semaphore; + if ((fd_info.fd = d3dkmt_object_get_fd( memory->sync )) < 0) + { + res = VK_ERROR_INVALID_EXTERNAL_HANDLE; + goto failed; + } + + if ((res = device->p_vkImportSemaphoreFdKHR( device->host.device, &fd_info ))) goto failed; + } + if ((fd_info.fd = d3dkmt_object_get_fd( memory->local )) < 0) { res = VK_ERROR_INVALID_EXTERNAL_HANDLE; @@ -409,6 +430,7 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA failed: WARN( "Failed to allocate memory, res %d\n", res ); if (host_device_memory) device->p_vkFreeMemory( device->host.device, host_device_memory, NULL ); + if (memory->semaphore) device->p_vkDestroySemaphore( device->host.device, memory->semaphore, NULL ); d3dkmt_destroy_resource( memory->local ); d3dkmt_destroy_mutex( memory->mutex ); d3dkmt_destroy_sync( memory->sync ); @@ -446,6 +468,7 @@ static void win32u_vkFreeMemory( VkDevice client_device, VkDeviceMemory client_m NtFreeVirtualMemory( GetCurrentProcess(), &memory->vm_map, &alloc_size, MEM_RELEASE ); } + if (memory->semaphore) device->p_vkDestroySemaphore( device->host.device, memory->semaphore, NULL ); if (memory->shared) NtClose( memory->shared ); d3dkmt_destroy_resource( memory->local ); d3dkmt_destroy_mutex( memory->mutex ); diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 2ac12df6e7c..ec326dda168 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -602,7 +602,11 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device if (!strcmp(*extension, "VK_EXT_swapchain_maintenance1")) has_swapchain_maintenance1 = true; if (!strcmp(*extension, "VK_EXT_surface_maintenance1")) has_surface_maintenance1 = true; if (!strcmp(*extension, "VK_KHR_swapchain")) has_swapchain = true; - if (!strcmp(*extension, "VK_KHR_win32_keyed_mutex")) *extension = "VK_KHR_timeline_semaphore"; + if (!strcmp(*extension, "VK_KHR_win32_keyed_mutex")) + { + device->obj.has_win32_keyed_mutex = true; + *extension = "VK_KHR_timeline_semaphore"; + } if (!strcmp(*extension, "VK_KHR_external_memory_win32")) { if (zero_bits && !physical_device->map_placed_align) diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 54570c3e017..fbc639f69fa 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -116,6 +116,7 @@ struct vulkan_device { VULKAN_OBJECT_HEADER( VkDevice, device ); struct vulkan_physical_device *physical_device; + bool has_win32_keyed_mutex; #define USE_VK_FUNC(x) PFN_ ## x p_ ## x; ALL_VK_DEVICE_FUNCS #undef USE_VK_FUNC -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9268