Module: wine Branch: master Commit: c7da2450c9d05a4957bf9f2d42990826f26dff6f URL: https://gitlab.winehq.org/wine/wine/-/commit/c7da2450c9d05a4957bf9f2d4299082...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Feb 24 12:38:06 2024 +0100
winevulkan: Introduce a new get_host_surface_extension driver entry.
---
dlls/winemac.drv/vulkan.c | 6 ++++++ dlls/winevulkan/vulkan.c | 28 ++++++++++++++++++---------- dlls/winewayland.drv/vulkan.c | 6 ++++++ dlls/winex11.drv/vulkan.c | 6 ++++++ include/wine/vulkan_driver.h | 1 + 5 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index e76422280af..63c4896e54d 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 fd1d2006318..8a022195ec2 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 c7cbdc90e28..6bac804a118 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 6216a7eb5e8..31bfdb98f86 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 495331e397d..cd76dcbbcc2 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); };