 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 1 + dlls/winevulkan/vulkan.c | 16 ++++++++++++++++ dlls/winevulkan/vulkan_private.h | 1 + dlls/winewayland.drv/vulkan.c | 1 + dlls/winex11.drv/vulkan.c | 1 + 5 files changed, 20 insertions(+)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 3e0300184c0..6e54d0dc654 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1601,6 +1601,7 @@ static const char *nulldrv_get_host_extension( const char *name ) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_EXT_headless_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; + if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; return name; }
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index af14a493ec0..71785d97ca5 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -367,6 +367,7 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi for (i = 0; i < num_host_properties; i++) { if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32")) + || !strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32")) || wine_vk_device_extension_supported(host_properties[i].extensionName)) { TRACE("Enabling extension '%s' for physical device %p\n", host_properties[i].extensionName, physical_device); @@ -403,6 +404,11 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_memory_win32"); physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION; } + else if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32"))) + { + strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_semaphore_win32"); + physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION; + } else if (wine_vk_device_extension_supported(host_properties[i].extensionName)) { physical_device->extensions[j] = host_properties[i]; @@ -582,6 +588,11 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device *extension = vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"); if (!strcmp(*extension, "VK_EXT_external_memory_dma_buf")) extensions[count++] = "VK_KHR_external_memory_fd"; } + if (!strcmp(*extension, "VK_KHR_external_semaphore_win32")) + { + device->has_external_semaphore_win32 = true; + *extension = vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32"); + } }
if (physical_device->map_placed_align) @@ -1782,6 +1793,11 @@ static NTSTATUS is_available_device_function(VkDevice handle, const char *name) if (!strcmp(name, "vkGetMemoryWin32HandlePropertiesKHR")) return device->has_external_memory_win32;
+ if (!strcmp(name, "vkGetSemaphoreWin32HandleKHR")) + return device->has_external_semaphore_win32; + if (!strcmp(name, "vkImportSemaphoreWin32HandleKHR")) + return device->has_external_semaphore_win32; + return !!vk_funcs->p_vkGetDeviceProcAddr(device->obj.host.device, name); }
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index d3ef04ada20..37aae0ca004 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -42,6 +42,7 @@ struct wine_device { struct vulkan_device obj; bool has_external_memory_win32; + bool has_external_semaphore_win32; uint64_t queue_count; struct wine_queue queues[]; }; diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index cd5c5295cb1..b70d2636df3 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -85,6 +85,7 @@ static const char *wayland_get_host_extension(const char *name) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_wayland_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; + if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; return name; }
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index f49f382b3a6..a3277bb999b 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -82,6 +82,7 @@ static const char *X11DRV_get_host_extension( const char *name ) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_xlib_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; + if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; return name; }