diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index e76422280afcae217d7746bd8eecd95f6c89a7da..63c4896e54d236e217db689560ac020480892126 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -361,6 +361,11 @@ static VkResult macdrv_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR * return res; } +static const char *macdrv_get_host_surface_extension(void) +{ + return pvkCreateMetalSurfaceEXT ? "VK_EXT_metal_surface" : "VK_MVK_macos_surface"; +} + static VkSurfaceKHR macdrv_wine_get_host_surface(VkSurfaceKHR surface) { struct wine_vk_surface *mac_surface = surface_from_handle(surface); @@ -384,6 +389,7 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_vkGetSwapchainImagesKHR, macdrv_vkQueuePresentKHR, + macdrv_get_host_surface_extension, macdrv_wine_get_host_surface, }; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index fd1d2006318e03e7d15c44289428a2bee21f9df5..8a022195ec2a419ed959ebb03d0d18db9835282e 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -571,6 +571,7 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * { VkDebugUtilsMessengerCreateInfoEXT *debug_utils_messenger; VkDebugReportCallbackCreateInfoEXT *debug_report_callback; + const char **new_extensions; VkBaseInStructure *header; unsigned int i; @@ -614,39 +615,46 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * return VK_ERROR_LAYER_NOT_PRESENT; } - TRACE("Enabled %u instance extensions.\n", dst->enabledExtensionCount); - for (i = 0; i < dst->enabledExtensionCount; i++) + for (i = 0; i < src->enabledExtensionCount; i++) { - const char *extension_name = dst->ppEnabledExtensionNames[i]; + const char *extension_name = src->ppEnabledExtensionNames[i]; TRACE("Extension %u: %s.\n", i, debugstr_a(extension_name)); if (!wine_vk_instance_extension_supported(extension_name)) { WARN("Extension %s is not supported.\n", debugstr_a(extension_name)); return VK_ERROR_EXTENSION_NOT_PRESENT; } + } + + new_extensions = conversion_context_alloc(ctx, (src->enabledExtensionCount + 2) * + sizeof(*src->ppEnabledExtensionNames)); + memcpy(new_extensions, src->ppEnabledExtensionNames, + dst->enabledExtensionCount * sizeof(*dst->ppEnabledExtensionNames)); + dst->ppEnabledExtensionNames = new_extensions; + dst->enabledExtensionCount = src->enabledExtensionCount; + + for (i = 0; i < dst->enabledExtensionCount; i++) + { + const char *extension_name = dst->ppEnabledExtensionNames[i]; if (!strcmp(extension_name, "VK_EXT_debug_utils") || !strcmp(extension_name, "VK_EXT_debug_report")) { object->enable_wrapper_list = VK_TRUE; } if (!strcmp(extension_name, "VK_KHR_win32_surface")) { + new_extensions[i] = vk_funcs->p_get_host_surface_extension(); object->enable_win32_surface = VK_TRUE; } } if (use_external_memory()) { - const char **new_extensions; - - new_extensions = conversion_context_alloc(ctx, (dst->enabledExtensionCount + 2) * - sizeof(*dst->ppEnabledExtensionNames)); - memcpy(new_extensions, src->ppEnabledExtensionNames, - dst->enabledExtensionCount * sizeof(*dst->ppEnabledExtensionNames)); new_extensions[dst->enabledExtensionCount++] = "VK_KHR_get_physical_device_properties2"; new_extensions[dst->enabledExtensionCount++] = "VK_KHR_external_memory_capabilities"; - dst->ppEnabledExtensionNames = new_extensions; } + TRACE("Enabled %u instance extensions.\n", dst->enabledExtensionCount); + return VK_SUCCESS; } diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index c7cbdc90e28f53efada0587765fe07ff1b569f6c..6bac804a118ca37e3685df9bf34cf3f47e52657b 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -469,6 +469,11 @@ static VkResult wayland_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR return check_queue_present(present_info, res); } +static const char *wayland_get_host_surface_extension(void) +{ + return "VK_KHR_wayland_surface"; +} + static VkSurfaceKHR wayland_wine_get_host_surface(VkSurfaceKHR surface) { return wine_vk_surface_from_handle(surface)->host_surface; @@ -485,6 +490,7 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, .p_vkGetSwapchainImagesKHR = wayland_vkGetSwapchainImagesKHR, .p_vkQueuePresentKHR = wayland_vkQueuePresentKHR, + .p_get_host_surface_extension = wayland_get_host_surface_extension, .p_wine_get_host_surface = wayland_wine_get_host_surface, }; diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 6216a7eb5e84cab9c49726304c62995951d2caa0..31bfdb98f869aa0a357f605cbe3e63f74efd3698 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -396,6 +396,11 @@ static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR * return res; } +static const char *X11DRV_get_host_surface_extension(void) +{ + return "VK_KHR_xlib_surface"; +} + static VkSurfaceKHR X11DRV_wine_get_host_surface( VkSurfaceKHR surface ) { struct wine_vk_surface *x11_surface = surface_from_handle(surface); @@ -419,6 +424,7 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkGetSwapchainImagesKHR, X11DRV_vkQueuePresentKHR, + X11DRV_get_host_surface_extension, X11DRV_wine_get_host_surface, }; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 495331e397d9a687e3eed2b91ef3012112284678..cd76dcbbcc29a36e29d6f5055152f7ede69f64a7 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -42,6 +42,7 @@ struct vulkan_funcs VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); /* winevulkan specific functions */ + const char *(*p_get_host_surface_extension)(void); VkSurfaceKHR (*p_wine_get_host_surface)(VkSurfaceKHR); };