-- v3: winevulkan: Remove now unnecessary vkDestroyInstance driver entry. winevulkan: Remove now unnecessary vkCreateInstance driver entry. winevulkan: Introduce a new get_host_surface_extension driver entry. winevulkan: Remove now unnecessary vkEnumerateInstanceExtensionProperties driver entry. winevulkan: Strip surface extensions in vkEnumerateInstanceExtensionProperties.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 28 ++++++++++++++++++++++++++++ dlls/winevulkan/vulkan.c | 15 +++++++++++---- dlls/winevulkan/vulkan_private.h | 1 + dlls/winevulkan/vulkan_thunks.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 809591b3c97..1455247870f 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -144,6 +144,12 @@ CORE_EXTENSIONS = [ "VK_KHR_win32_surface", ]
+# List of surface extensions that can be exposed directly to the PE side +WIN_SURFACE_EXTENSIONS = [ + "VK_KHR_win32_surface", + "VK_EXT_headless_surface", +] + # Some experimental extensions are used by shipping applications so their API is extremely unlikely # to change in a backwards-incompatible way. Allow translation of those extensions with WineVulkan. ALLOWED_X_EXTENSIONS = [ @@ -2771,6 +2777,13 @@ class VkGenerator(object): f.write(" "{0}",\n".format(ext["name"])) f.write("};\n\n")
+ # Create array of surface extensions. + f.write("static const char * const vk_host_surface_extensions[] =\n{\n") + for ext in self.registry.surface_extensions: + if ext["name"] not in WIN_SURFACE_EXTENSIONS: + f.write(" "{0}",\n".format(ext["name"])) + f.write("};\n\n") + f.write("BOOL wine_vk_device_extension_supported(const char *name)\n") f.write("{\n") f.write(" unsigned int i;\n") @@ -2793,6 +2806,17 @@ class VkGenerator(object): f.write(" return FALSE;\n") f.write("}\n\n")
+ f.write("BOOL wine_vk_is_host_surface_extension(const char *name)\n") + f.write("{\n") + f.write(" unsigned int i;\n") + f.write(" for (i = 0; i < ARRAY_SIZE(vk_host_surface_extensions); i++)\n") + f.write(" {\n") + f.write(" if (strcmp(vk_host_surface_extensions[i], name) == 0)\n") + f.write(" return TRUE;\n") + f.write(" }\n") + f.write(" return FALSE;\n") + f.write("}\n\n") + f.write("BOOL wine_vk_is_type_wrapped(VkObjectType type)\n") f.write("{\n") f.write(" return FALSE") @@ -3194,6 +3218,7 @@ class VkRegistry(object): # We aggregate all types in here for cross-referencing. self.funcs = {} self.types = {} + self.surface_extensions = []
self.version_regex = re.compile( r'^' @@ -3471,6 +3496,9 @@ class VkRegistry(object): def process_ext(ext, deferred=False): ext_name = ext.attrib["name"]
+ if ext_name.endswith('_surface') and ext.attrib.get('depends', None) == 'VK_KHR_surface': + self.surface_extensions.append({"name" : ext_name}) + # Set extension name on any functions calls part of this extension as we # were not aware of the name during initial parsing. commands = ext.findall("require/command") diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 0846f2dfc73..7b91202b961 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1003,7 +1003,7 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t { uint32_t num_properties = 0, num_host_properties; VkExtensionProperties *host_properties; - unsigned int i, j; + unsigned int i, j, surface; VkResult res;
res = vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, NULL); @@ -1025,9 +1025,10 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t * including extension fixup (e.g. VK_KHR_xlib_surface -> VK_KHR_win32_surface). It is * up to us here to filter the list down to extensions for which we have thunks. */ - for (i = 0; i < num_host_properties; i++) + for (i = 0, surface = 0; i < num_host_properties; i++) { - if (wine_vk_instance_extension_supported(host_properties[i].extensionName)) + if (wine_vk_instance_extension_supported(host_properties[i].extensionName) + || (wine_vk_is_host_surface_extension(host_properties[i].extensionName) && !surface++)) num_properties++; else TRACE("Instance extension '%s' is not supported.\n", host_properties[i].extensionName); @@ -1041,13 +1042,19 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t return VK_SUCCESS; }
- for (i = 0, j = 0; i < num_host_properties && j < *count; i++) + for (i = 0, j = 0, surface = 0; i < num_host_properties && j < *count; i++) { if (wine_vk_instance_extension_supported(host_properties[i].extensionName)) { TRACE("Enabling extension '%s'.\n", host_properties[i].extensionName); properties[j++] = host_properties[i]; } + else if (wine_vk_is_host_surface_extension(host_properties[i].extensionName) && !surface++) + { + VkExtensionProperties win32_surface = {VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_SPEC_VERSION}; + TRACE("Enabling VK_KHR_win32_surface.\n"); + properties[j++] = win32_surface; + } } *count = min(*count, num_properties);
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index b44285722a7..f5109aa6377 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -270,6 +270,7 @@ static inline VkSwapchainKHR wine_swapchain_to_handle(struct wine_swapchain *sur
BOOL wine_vk_device_extension_supported(const char *name); BOOL wine_vk_instance_extension_supported(const char *name); +BOOL wine_vk_is_host_surface_extension(const char *name);
BOOL wine_vk_is_type_wrapped(VkObjectType type);
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 93e52b46a9d..9075b5ff11f 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -46749,6 +46749,23 @@ static const char * const vk_instance_extensions[] = "VK_KHR_win32_surface", };
+static const char * const vk_host_surface_extensions[] = +{ + "VK_KHR_xlib_surface", + "VK_KHR_xcb_surface", + "VK_KHR_wayland_surface", + "VK_KHR_mir_surface", + "VK_KHR_android_surface", + "VK_GGP_stream_descriptor_surface", + "VK_NN_vi_surface", + "VK_MVK_ios_surface", + "VK_MVK_macos_surface", + "VK_FUCHSIA_imagepipe_surface", + "VK_EXT_metal_surface", + "VK_EXT_directfb_surface", + "VK_QNX_screen_surface", +}; + BOOL wine_vk_device_extension_supported(const char *name) { unsigned int i; @@ -46771,6 +46788,17 @@ BOOL wine_vk_instance_extension_supported(const char *name) return FALSE; }
+BOOL wine_vk_is_host_surface_extension(const char *name) +{ + unsigned int i; + for (i = 0; i < ARRAY_SIZE(vk_host_surface_extensions); i++) + { + if (strcmp(vk_host_surface_extensions[i], name) == 0) + return TRUE; + } + return FALSE; +} + BOOL wine_vk_is_type_wrapped(VkObjectType type) { return FALSE ||
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 1 - dlls/winemac.drv/vulkan.c | 56 ----------------------------------- dlls/winevulkan/make_vulkan | 6 ---- dlls/winevulkan/vulkan.c | 14 +++++---- dlls/winewayland.drv/vulkan.c | 45 ---------------------------- dlls/winex11.drv/vulkan.c | 44 --------------------------- include/wine/vulkan_driver.h | 3 +- 7 files changed, 9 insertions(+), 160 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 853e0a973a3..f57b2999a9c 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -64,7 +64,6 @@ static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name TRACE( "instance %p, name %s\n", instance, debugstr_a(name) );
if (!strcmp( name, "vkCreateInstance" )) return vulkan_funcs.p_vkCreateInstance; - if (!strcmp( name, "vkEnumerateInstanceExtensionProperties" )) return vulkan_funcs.p_vkEnumerateInstanceExtensionProperties;
if (!instance) return p_vkGetInstanceProcAddr( instance, name );
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 52928ec3d44..e76422280af 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -84,7 +84,6 @@ static VkResult (*pvkCreateMetalSurfaceEXT)(VkInstance, const VkMetalSurfaceCrea static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); -static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -318,59 +317,6 @@ static void macdrv_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapcha pvkDestroySwapchainKHR(device, swapchain, NULL /* allocator */); }
-static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_name, - uint32_t *count, VkExtensionProperties* properties) -{ - unsigned int i; - BOOL seen_surface = FALSE; - VkResult res; - - TRACE("layer_name %s, count %p, properties %p\n", debugstr_a(layer_name), count, properties); - - /* This shouldn't get called with layer_name set, the ICD loader prevents it. */ - if (layer_name) - { - ERR("Layer enumeration not supported from ICD.\n"); - return VK_ERROR_LAYER_NOT_PRESENT; - } - - /* We will return at most the same number of instance extensions reported by the host back to - * winevulkan. Along the way we may replace MoltenVK extensions with their win32 equivalents, - * or remove redundant extensions outright. - * Winevulkan will perform more detailed filtering as it knows whether it has thunks - * for a particular extension. - */ - res = pvkEnumerateInstanceExtensionProperties(layer_name, count, properties); - if (!properties || res < 0) - return res; - - for (i = 0; i < *count; i++) - { - /* For now the only MoltenVK extensions we need to fixup. Long-term we may need an array. */ - if (!strcmp(properties[i].extensionName, "VK_MVK_macos_surface") || - !strcmp(properties[i].extensionName, "VK_EXT_metal_surface")) - { - if (seen_surface) - { - /* If we've already seen a surface extension, just hide this one. */ - memmove(properties + i, properties + i + 1, (*count - i - 1) * sizeof(*properties)); - --*count; - --i; - continue; - } - TRACE("Substituting %s for VK_KHR_win32_surface\n", properties[i].extensionName); - - snprintf(properties[i].extensionName, sizeof(properties[i].extensionName), - VK_KHR_WIN32_SURFACE_EXTENSION_NAME); - properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION; - seen_surface = TRUE; - } - } - - TRACE("Returning %u extensions.\n", *count); - return res; -} - static VkBool32 macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -432,7 +378,6 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_vkDestroyInstance, macdrv_vkDestroySurfaceKHR, macdrv_vkDestroySwapchainKHR, - macdrv_vkEnumerateInstanceExtensionProperties, NULL, NULL, macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, @@ -458,7 +403,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d LOAD_FUNCPTR(vkDestroyInstance) LOAD_FUNCPTR(vkDestroySurfaceKHR) LOAD_FUNCPTR(vkDestroySwapchainKHR) - LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) LOAD_FUNCPTR(vkGetSwapchainImagesKHR) LOAD_FUNCPTR(vkQueuePresentKHR) #undef LOAD_FUNCPTR diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 1455247870f..fd4362e1e4e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -164,11 +164,6 @@ PERF_CRITICAL_FUNCTIONS = [ "vkGetDescriptorEXT", ]
-# Functions part of our winevulkan graphics driver interface. -# DRIVER_VERSION should be bumped on any change to driver interface -# in FUNCTION_OVERRIDES -DRIVER_VERSION = 19 - # Table of functions for which we have a special implementation. # These are regular device / instance functions for which we need # to do more work compared to a regular thunk or because they are @@ -207,7 +202,6 @@ USER_DRIVER_FUNCS = { "vkDestroyInstance", "vkDestroySurfaceKHR", "vkDestroySwapchainKHR", - "vkEnumerateInstanceExtensionProperties", "vkGetDeviceProcAddr", "vkGetInstanceProcAddr", "vkGetPhysicalDeviceWin32PresentationSupportKHR", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 7b91202b961..fd1d2006318 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -32,6 +32,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; +static PFN_vkEnumerateInstanceExtensionProperties p_vkEnumerateInstanceExtensionProperties; + static int window_surface_compare(const void *key, const struct rb_entry *entry) { const struct wine_surface *surface = RB_ENTRY_VALUE(entry, struct wine_surface, window_entry); @@ -545,6 +548,9 @@ NTSTATUS init_vulkan(void *args) return STATUS_UNSUCCESSFUL; }
+ p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); + p_vkEnumerateInstanceExtensionProperties = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); + if (is_wow64()) { SYSTEM_BASIC_INFORMATION info; @@ -1006,14 +1012,14 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t unsigned int i, j, surface; VkResult res;
- res = vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, NULL); + res = p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, NULL); if (res != VK_SUCCESS) return res;
if (!(host_properties = calloc(num_host_properties, sizeof(*host_properties)))) return VK_ERROR_OUT_OF_HOST_MEMORY;
- res = vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, host_properties); + res = p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, host_properties); if (res != VK_SUCCESS) { ERR("Failed to retrieve host properties, res=%d.\n", res); @@ -1073,10 +1079,6 @@ VkResult wine_vkEnumerateInstanceVersion(uint32_t *version) { VkResult res;
- static VkResult (*p_vkEnumerateInstanceVersion)(uint32_t *version); - if (!p_vkEnumerateInstanceVersion) - p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); - if (p_vkEnumerateInstanceVersion) { res = p_vkEnumerateInstanceVersion(version); diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index ec5e9fe6ae8..c7cbdc90e28 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -59,7 +59,6 @@ static VkResult (*pvkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurface static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); -static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -442,48 +441,6 @@ static void wayland_vkDestroySwapchainKHR(VkDevice device, } }
-static VkResult wayland_vkEnumerateInstanceExtensionProperties(const char *layer_name, - uint32_t *count, - VkExtensionProperties* properties) -{ - unsigned int i; - VkResult res; - - TRACE("layer_name %s, count %p, properties %p\n", debugstr_a(layer_name), count, properties); - - /* This shouldn't get called with layer_name set, the ICD loader prevents it. */ - if (layer_name) - { - ERR("Layer enumeration not supported from ICD.\n"); - return VK_ERROR_LAYER_NOT_PRESENT; - } - - /* We will return the same number of instance extensions reported by the host back to - * winevulkan. Along the way we may replace xlib extensions with their win32 equivalents. - * Winevulkan will perform more detailed filtering as it knows whether it has thunks - * for a particular extension. - */ - res = pvkEnumerateInstanceExtensionProperties(layer_name, count, properties); - if (!properties || res < 0) - return res; - - for (i = 0; i < *count; i++) - { - /* For now the only wayland extension we need to fixup. Long-term we may need an array. */ - if (!strcmp(properties[i].extensionName, "VK_KHR_wayland_surface")) - { - TRACE("Substituting VK_KHR_wayland_surface for VK_KHR_win32_surface\n"); - - snprintf(properties[i].extensionName, sizeof(properties[i].extensionName), - VK_KHR_WIN32_SURFACE_EXTENSION_NAME); - properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION; - } - } - - TRACE("Returning %u extensions.\n", *count); - return res; -} - static VkBool32 wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -525,7 +482,6 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkDestroyInstance = wayland_vkDestroyInstance, .p_vkDestroySurfaceKHR = wayland_vkDestroySurfaceKHR, .p_vkDestroySwapchainKHR = wayland_vkDestroySwapchainKHR, - .p_vkEnumerateInstanceExtensionProperties = wayland_vkEnumerateInstanceExtensionProperties, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, .p_vkGetSwapchainImagesKHR = wayland_vkGetSwapchainImagesKHR, .p_vkQueuePresentKHR = wayland_vkQueuePresentKHR, @@ -550,7 +506,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR(vkDestroyInstance); LOAD_FUNCPTR(vkDestroySurfaceKHR); LOAD_FUNCPTR(vkDestroySwapchainKHR); - LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); LOAD_FUNCPTR(vkGetSwapchainImagesKHR); LOAD_FUNCPTR(vkQueuePresentKHR); diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 39a76c0a0e9..6216a7eb5e8 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -82,7 +82,6 @@ static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreate static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); -static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -349,47 +348,6 @@ static void X11DRV_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapcha pvkDestroySwapchainKHR(device, swapchain, NULL /* allocator */); }
-static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_name, - uint32_t *count, VkExtensionProperties* properties) -{ - unsigned int i; - VkResult res; - - TRACE("layer_name %s, count %p, properties %p\n", debugstr_a(layer_name), count, properties); - - /* This shouldn't get called with layer_name set, the ICD loader prevents it. */ - if (layer_name) - { - ERR("Layer enumeration not supported from ICD.\n"); - return VK_ERROR_LAYER_NOT_PRESENT; - } - - /* We will return the same number of instance extensions reported by the host back to - * winevulkan. Along the way we may replace xlib extensions with their win32 equivalents. - * Winevulkan will perform more detailed filtering as it knows whether it has thunks - * for a particular extension. - */ - res = pvkEnumerateInstanceExtensionProperties(layer_name, count, properties); - if (!properties || res < 0) - return res; - - for (i = 0; i < *count; i++) - { - /* For now the only x11 extension we need to fixup. Long-term we may need an array. */ - if (!strcmp(properties[i].extensionName, "VK_KHR_xlib_surface")) - { - TRACE("Substituting VK_KHR_xlib_surface for VK_KHR_win32_surface\n"); - - snprintf(properties[i].extensionName, sizeof(properties[i].extensionName), - VK_KHR_WIN32_SURFACE_EXTENSION_NAME); - properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION; - } - } - - TRACE("Returning %u extensions.\n", *count); - return res; -} - static VkBool32 X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -455,7 +413,6 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkDestroyInstance, X11DRV_vkDestroySurfaceKHR, X11DRV_vkDestroySwapchainKHR, - X11DRV_vkEnumerateInstanceExtensionProperties, NULL, NULL, X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR, @@ -482,7 +439,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR( vkDestroyInstance ); LOAD_FUNCPTR( vkDestroySurfaceKHR ); LOAD_FUNCPTR( vkDestroySwapchainKHR ); - LOAD_FUNCPTR( vkEnumerateInstanceExtensionProperties ); LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); LOAD_FUNCPTR( vkGetSwapchainImagesKHR ); LOAD_FUNCPTR( vkQueuePresentKHR ); diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 6c72548e02f..495331e397d 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 19 +#define WINE_VULKAN_DRIVER_VERSION 20
struct vulkan_funcs { @@ -35,7 +35,6 @@ struct vulkan_funcs void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); void (*p_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); void (*p_vkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); - VkResult (*p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *); void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *); VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t);
From: Rémi Bernon rbernon@codeweavers.com
--- 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); };
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 4 +- dlls/win32u/vulkan.c | 2 - dlls/winemac.drv/vulkan.c | 78 ----------------------------------- dlls/winevulkan/make_vulkan | 1 - dlls/winevulkan/vulkan.c | 4 +- dlls/winewayland.drv/vulkan.c | 74 --------------------------------- dlls/winex11.drv/vulkan.c | 78 ----------------------------------- dlls/winex11.drv/xrandr.c | 17 ++++---- include/wine/vulkan_driver.h | 3 +- 9 files changed, 17 insertions(+), 244 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 3b6a3933bb2..795480c9968 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -78,6 +78,7 @@ static void d3dkmt_init_vulkan(void) .enabledExtensionCount = ARRAY_SIZE( extensions ), .ppEnabledExtensionNames = extensions, }; + PFN_vkCreateInstance p_vkCreateInstance; VkResult vr;
if (!(vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) @@ -86,7 +87,8 @@ static void d3dkmt_init_vulkan(void) return; }
- if ((vr = vulkan_funcs->p_vkCreateInstance( &create_info, NULL, &d3dkmt_vk_instance ))) + p_vkCreateInstance = vulkan_funcs->p_vkGetInstanceProcAddr( NULL, "vkCreateInstance" ); + if ((vr = p_vkCreateInstance( &create_info, NULL, &d3dkmt_vk_instance ))) { WARN( "Failed to create a Vulkan instance, vr %d.\n", vr ); vulkan_funcs = NULL; diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index f57b2999a9c..a1635e618c0 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -63,8 +63,6 @@ static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name { TRACE( "instance %p, name %s\n", instance, debugstr_a(name) );
- if (!strcmp( name, "vkCreateInstance" )) return vulkan_funcs.p_vkCreateInstance; - if (!instance) return p_vkGetInstanceProcAddr( instance, name );
if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return vulkan_funcs.p_vkCreateWin32SurfaceKHR; diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 63c4896e54d..154538e0a20 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -77,7 +77,6 @@ typedef struct VkMetalSurfaceCreateInfoEXT const void *pLayer; /* CAMetalLayer */ } VkMetalSurfaceCreateInfoEXT;
-static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateMacOSSurfaceMVK)(VkInstance, const VkMacOSSurfaceCreateInfoMVK*, const VkAllocationCallbacks *, VkSurfaceKHR *); static VkResult (*pvkCreateMetalSurfaceEXT)(VkInstance, const VkMetalSurfaceCreateInfoEXT*, const VkAllocationCallbacks *, VkSurfaceKHR *); @@ -95,54 +94,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; }
-/* Helper function for converting between win32 and MoltenVK compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. - */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with MoltenVK ones else copy. Long-term, when we - * support more extensions, we should store these in a list. - */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - { - enabled_extensions[i] = pvkCreateMetalSurfaceEXT ? "VK_EXT_metal_surface" : "VK_MVK_macos_surface"; - } - else - { - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static void wine_vk_surface_destroy(VkInstance instance, struct wine_vk_surface *surface) { pvkDestroySurfaceKHR(instance, surface->host_surface, NULL /* allocator */); @@ -156,33 +107,6 @@ static void wine_vk_surface_destroy(VkInstance instance, struct wine_vk_surface free(surface); }
-static VkResult macdrv_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. - */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult macdrv_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain) @@ -377,7 +301,6 @@ static VkSurfaceKHR macdrv_wine_get_host_surface(VkSurfaceKHR surface)
static const struct vulkan_funcs vulkan_funcs = { - macdrv_vkCreateInstance, macdrv_vkCreateSwapchainKHR, macdrv_vkCreateWin32SurfaceKHR, macdrv_vkDestroyInstance, @@ -402,7 +325,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d }
#define LOAD_FUNCPTR(f) if ((p##f = dlsym(vulkan_handle, #f)) == NULL) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR(vkCreateInstance) LOAD_FUNCPTR(vkCreateSwapchainKHR) LOAD_FUNCPTR(vkCreateMacOSSurfaceMVK) LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index fd4362e1e4e..46d36c3222e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -196,7 +196,6 @@ FUNCTION_OVERRIDES = {
# functions for which a user driver entry must be generated USER_DRIVER_FUNCS = { - "vkCreateInstance", "vkCreateSwapchainKHR", "vkCreateWin32SurfaceKHR", "vkDestroyInstance", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 8a022195ec2..6adae76321c 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -32,6 +32,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static PFN_vkCreateInstance p_vkCreateInstance; static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; static PFN_vkEnumerateInstanceExtensionProperties p_vkEnumerateInstanceExtensionProperties;
@@ -548,6 +549,7 @@ NTSTATUS init_vulkan(void *args) return STATUS_UNSUCCESSFUL; }
+ p_vkCreateInstance = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkCreateInstance"); p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); p_vkEnumerateInstanceExtensionProperties = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties");
@@ -880,7 +882,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, init_conversion_context(&ctx); res = wine_vk_instance_convert_create_info(&ctx, create_info, &create_info_host, object); if (res == VK_SUCCESS) - res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->host_instance); + res = p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->host_instance); free_conversion_context(&ctx); if (res != VK_SUCCESS) { diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 6bac804a118..834ba9a4dcf 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -53,7 +53,6 @@ typedef struct VkWaylandSurfaceCreateInfoKHR struct wl_surface *surface; } VkWaylandSurfaceCreateInfoKHR;
-static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); @@ -144,49 +143,6 @@ static struct wine_vk_swapchain *wine_vk_swapchain_from_handle(VkSwapchainKHR ha return NULL; }
-/* Helper function for converting between win32 and Wayland compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, - sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with Wayland ones else copy. Long-term, when we - * support more extensions, we should store these in a list. */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - enabled_extensions[i] = "VK_KHR_wayland_surface"; - else - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static void vk_result_update_out_of_date(VkResult *res) { /* If the current result is less severe than out_of_date, which for @@ -250,34 +206,6 @@ static VkResult check_queue_present(const VkPresentInfoKHR *present_info, return res; }
-static VkResult wayland_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, - VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult wayland_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, @@ -481,7 +409,6 @@ static VkSurfaceKHR wayland_wine_get_host_surface(VkSurfaceKHR surface)
static const struct vulkan_funcs vulkan_funcs = { - .p_vkCreateInstance = wayland_vkCreateInstance, .p_vkCreateSwapchainKHR = wayland_vkCreateSwapchainKHR, .p_vkCreateWin32SurfaceKHR = wayland_vkCreateWin32SurfaceKHR, .p_vkDestroyInstance = wayland_vkDestroyInstance, @@ -506,7 +433,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * }
#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR(vkCreateInstance); LOAD_FUNCPTR(vkCreateSwapchainKHR); LOAD_FUNCPTR(vkCreateWaylandSurfaceKHR); LOAD_FUNCPTR(vkDestroyInstance); diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 31bfdb98f86..49dc6dfb8fe 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -76,7 +76,6 @@ typedef struct VkXlibSurfaceCreateInfoKHR Window window; } VkXlibSurfaceCreateInfoKHR;
-static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); @@ -93,54 +92,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; }
-/* Helper function for converting between win32 and X11 compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. - */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with X11 ones else copy. Long-term, when we - * support more extensions, we should store these in a list. - */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - { - enabled_extensions[i] = "VK_KHR_xlib_surface"; - } - else - { - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static struct wine_vk_surface *wine_vk_surface_grab(struct wine_vk_surface *surface) { InterlockedIncrement(&surface->ref); @@ -198,33 +149,6 @@ void vulkan_thread_detach(void) pthread_mutex_unlock(&vulkan_mutex); }
-static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. - */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult X11DRV_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain) @@ -412,7 +336,6 @@ static VkSurfaceKHR X11DRV_wine_get_host_surface( VkSurfaceKHR surface )
static const struct vulkan_funcs vulkan_funcs = { - X11DRV_vkCreateInstance, X11DRV_vkCreateSwapchainKHR, X11DRV_vkCreateWin32SurfaceKHR, X11DRV_vkDestroyInstance, @@ -439,7 +362,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * init_recursive_mutex( &vulkan_mutex );
#define LOAD_FUNCPTR( f ) if (!(p##f = dlsym( vulkan_handle, #f ))) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR( vkCreateInstance ); LOAD_FUNCPTR( vkCreateSwapchainKHR ); LOAD_FUNCPTR( vkCreateXlibSurfaceKHR ); LOAD_FUNCPTR( vkDestroyInstance ); diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index b829c677ff1..ec03ed6b61a 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -648,6 +648,7 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid VkPhysicalDevice *vk_physical_devices = NULL; VkPhysicalDeviceProperties2 properties2; VkPhysicalDeviceMemoryProperties mem_properties; + PFN_vkCreateInstance pvkCreateInstance; VkInstanceCreateInfo create_info; VkPhysicalDeviceIDProperties id; VkInstance vk_instance = NULL; @@ -664,13 +665,6 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid create_info.enabledExtensionCount = ARRAY_SIZE(extensions); create_info.ppEnabledExtensionNames = extensions;
- vr = vulkan_funcs->p_vkCreateInstance( &create_info, NULL, &vk_instance ); - if (vr != VK_SUCCESS) - { - WARN("Failed to create a Vulkan instance, vr %d.\n", vr); - goto done; - } - #define LOAD_VK_FUNC(f) \ if (!(p##f = (void *)vulkan_funcs->p_vkGetInstanceProcAddr( vk_instance, #f ))) \ { \ @@ -678,6 +672,15 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid goto done; \ }
+ LOAD_VK_FUNC( vkCreateInstance ) + + vr = pvkCreateInstance( &create_info, NULL, &vk_instance ); + if (vr != VK_SUCCESS) + { + WARN( "Failed to create a Vulkan instance, vr %d.\n", vr ); + goto done; + } + LOAD_VK_FUNC(vkEnumeratePhysicalDevices) LOAD_VK_FUNC(vkGetPhysicalDeviceProperties2KHR) LOAD_VK_FUNC(vkGetRandROutputDisplayEXT) diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index cd76dcbbcc2..1c7df64bb24 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 20 +#define WINE_VULKAN_DRIVER_VERSION 21
struct vulkan_funcs { @@ -29,7 +29,6 @@ struct vulkan_funcs * needs to provide. Other function calls will be provided indirectly by dispatch * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice. */ - VkResult (*p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); VkResult (*p_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 4 +++- dlls/win32u/vulkan.c | 1 - dlls/winemac.drv/vulkan.c | 13 ------------- dlls/winevulkan/make_vulkan | 2 -- dlls/winevulkan/vulkan.c | 4 ++-- dlls/winevulkan/vulkan_thunks.h | 2 ++ dlls/winewayland.drv/vulkan.c | 14 -------------- dlls/winex11.drv/vulkan.c | 13 ------------- dlls/winex11.drv/xrandr.c | 6 +++++- include/wine/vulkan_driver.h | 3 +-- 10 files changed, 13 insertions(+), 49 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 795480c9968..e75a29e0934 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -78,6 +78,7 @@ static void d3dkmt_init_vulkan(void) .enabledExtensionCount = ARRAY_SIZE( extensions ), .ppEnabledExtensionNames = extensions, }; + PFN_vkDestroyInstance p_vkDestroyInstance; PFN_vkCreateInstance p_vkCreateInstance; VkResult vr;
@@ -95,11 +96,12 @@ static void d3dkmt_init_vulkan(void) return; }
+ p_vkDestroyInstance = vulkan_funcs->p_vkGetInstanceProcAddr( d3dkmt_vk_instance, "vkDestroyInstance" ); #define LOAD_VK_FUNC( f ) \ if (!(p##f = (void *)vulkan_funcs->p_vkGetInstanceProcAddr( d3dkmt_vk_instance, #f ))) \ { \ WARN( "Failed to load " #f ".\n" ); \ - vulkan_funcs->p_vkDestroyInstance( d3dkmt_vk_instance, NULL ); \ + p_vkDestroyInstance( d3dkmt_vk_instance, NULL ); \ vulkan_funcs = NULL; \ return; \ } diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index a1635e618c0..eac6793fea5 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -66,7 +66,6 @@ static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name if (!instance) return p_vkGetInstanceProcAddr( instance, name );
if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return vulkan_funcs.p_vkCreateWin32SurfaceKHR; - if (!strcmp( name, "vkDestroyInstance" )) return vulkan_funcs.p_vkDestroyInstance; if (!strcmp( name, "vkDestroySurfaceKHR" )) return vulkan_funcs.p_vkDestroySurfaceKHR; if (!strcmp( name, "vkGetInstanceProcAddr" )) return win32u_vkGetInstanceProcAddr; if (!strcmp( name, "vkGetPhysicalDeviceWin32PresentationSupportKHR" )) return vulkan_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR; diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 154538e0a20..288bd9af4b1 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -80,7 +80,6 @@ typedef struct VkMetalSurfaceCreateInfoEXT static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateMacOSSurfaceMVK)(VkInstance, const VkMacOSSurfaceCreateInfoMVK*, const VkAllocationCallbacks *, VkSurfaceKHR *); static VkResult (*pvkCreateMetalSurfaceEXT)(VkInstance, const VkMetalSurfaceCreateInfoEXT*, const VkAllocationCallbacks *, VkSurfaceKHR *); -static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); @@ -207,16 +206,6 @@ err: return res; }
-static void macdrv_vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *allocator) -{ - TRACE("%p %p\n", instance, allocator); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - pvkDestroyInstance(instance, NULL /* allocator */); -} - static void macdrv_vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *allocator) { @@ -303,7 +292,6 @@ static const struct vulkan_funcs vulkan_funcs = { macdrv_vkCreateSwapchainKHR, macdrv_vkCreateWin32SurfaceKHR, - macdrv_vkDestroyInstance, macdrv_vkDestroySurfaceKHR, macdrv_vkDestroySwapchainKHR, NULL, @@ -328,7 +316,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d LOAD_FUNCPTR(vkCreateSwapchainKHR) LOAD_FUNCPTR(vkCreateMacOSSurfaceMVK) LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) - LOAD_FUNCPTR(vkDestroyInstance) LOAD_FUNCPTR(vkDestroySurfaceKHR) LOAD_FUNCPTR(vkDestroySwapchainKHR) LOAD_FUNCPTR(vkGetSwapchainImagesKHR) diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 46d36c3222e..7e3a7d04b19 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -175,7 +175,6 @@ FUNCTION_OVERRIDES = {
# Instance functions "vkCreateDevice" : {"extra_param" : "client_ptr"}, - "vkDestroyInstance" : {"dispatch" : False}, "vkGetPhysicalDeviceExternalBufferProperties" : {"dispatch" : False}, "vkGetPhysicalDeviceExternalFenceProperties" : {"dispatch" : False}, "vkGetPhysicalDeviceExternalSemaphoreProperties" : {"dispatch" : False}, @@ -198,7 +197,6 @@ FUNCTION_OVERRIDES = { USER_DRIVER_FUNCS = { "vkCreateSwapchainKHR", "vkCreateWin32SurfaceKHR", - "vkDestroyInstance", "vkDestroySurfaceKHR", "vkDestroySwapchainKHR", "vkGetDeviceProcAddr", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 6adae76321c..571c1d54575 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -912,7 +912,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, if (res != VK_SUCCESS) { ERR("Failed to load physical devices, res=%d\n", res); - vk_funcs->p_vkDestroyInstance(object->host_instance, NULL /* allocator */); + object->funcs.p_vkDestroyInstance(object->host_instance, NULL /* allocator */); free(object->utils_messengers); free(object); return res; @@ -976,7 +976,7 @@ void wine_vkDestroyInstance(VkInstance handle, const VkAllocationCallbacks *allo if (!instance) return;
- vk_funcs->p_vkDestroyInstance(instance->host_instance, NULL /* allocator */); + instance->funcs.p_vkDestroyInstance(instance->host_instance, NULL /* allocator */); for (i = 0; i < instance->phys_dev_count; i++) { remove_handle_mapping(instance, &instance->phys_devs[i].wrapper_entry); diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 2321bb91c09..5fe178d52b5 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -591,6 +591,7 @@ struct vulkan_instance_funcs void (*p_vkDebugReportMessageEXT)(VkInstance, VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t, int32_t, const char *, const char *); void (*p_vkDestroyDebugReportCallbackEXT)(VkInstance, VkDebugReportCallbackEXT, const VkAllocationCallbacks *); void (*p_vkDestroyDebugUtilsMessengerEXT)(VkInstance, VkDebugUtilsMessengerEXT, const VkAllocationCallbacks *); + void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); void (*p_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); VkResult (*p_vkEnumeratePhysicalDeviceGroups)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *); VkResult (*p_vkEnumeratePhysicalDeviceGroupsKHR)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *); @@ -1161,6 +1162,7 @@ struct vulkan_instance_funcs USE_VK_FUNC(vkDebugReportMessageEXT) \ USE_VK_FUNC(vkDestroyDebugReportCallbackEXT) \ USE_VK_FUNC(vkDestroyDebugUtilsMessengerEXT) \ + USE_VK_FUNC(vkDestroyInstance) \ USE_VK_FUNC(vkDestroySurfaceKHR) \ USE_VK_FUNC(vkEnumeratePhysicalDeviceGroups) \ USE_VK_FUNC(vkEnumeratePhysicalDeviceGroupsKHR) \ diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 834ba9a4dcf..1d7492fae36 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -55,7 +55,6 @@ typedef struct VkWaylandSurfaceCreateInfoKHR
static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); -static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); @@ -322,17 +321,6 @@ err: return res; }
-static void wayland_vkDestroyInstance(VkInstance instance, - const VkAllocationCallbacks *allocator) -{ - TRACE("%p %p\n", instance, allocator); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - pvkDestroyInstance(instance, NULL /* allocator */); -} - static void wayland_vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *allocator) { @@ -411,7 +399,6 @@ static const struct vulkan_funcs vulkan_funcs = { .p_vkCreateSwapchainKHR = wayland_vkCreateSwapchainKHR, .p_vkCreateWin32SurfaceKHR = wayland_vkCreateWin32SurfaceKHR, - .p_vkDestroyInstance = wayland_vkDestroyInstance, .p_vkDestroySurfaceKHR = wayland_vkDestroySurfaceKHR, .p_vkDestroySwapchainKHR = wayland_vkDestroySwapchainKHR, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, @@ -435,7 +422,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * #define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) return STATUS_PROCEDURE_NOT_FOUND; LOAD_FUNCPTR(vkCreateSwapchainKHR); LOAD_FUNCPTR(vkCreateWaylandSurfaceKHR); - LOAD_FUNCPTR(vkDestroyInstance); LOAD_FUNCPTR(vkDestroySurfaceKHR); LOAD_FUNCPTR(vkDestroySwapchainKHR); LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 49dc6dfb8fe..edd4553f7f7 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -78,7 +78,6 @@ typedef struct VkXlibSurfaceCreateInfoKHR
static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); -static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); @@ -237,16 +236,6 @@ err: return res; }
-static void X11DRV_vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *allocator) -{ - TRACE("%p %p\n", instance, allocator); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - pvkDestroyInstance(instance, NULL /* allocator */); -} - static void X11DRV_vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *allocator) { @@ -338,7 +327,6 @@ static const struct vulkan_funcs vulkan_funcs = { X11DRV_vkCreateSwapchainKHR, X11DRV_vkCreateWin32SurfaceKHR, - X11DRV_vkDestroyInstance, X11DRV_vkDestroySurfaceKHR, X11DRV_vkDestroySwapchainKHR, NULL, @@ -364,7 +352,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * #define LOAD_FUNCPTR( f ) if (!(p##f = dlsym( vulkan_handle, #f ))) return STATUS_PROCEDURE_NOT_FOUND; LOAD_FUNCPTR( vkCreateSwapchainKHR ); LOAD_FUNCPTR( vkCreateXlibSurfaceKHR ); - LOAD_FUNCPTR( vkDestroyInstance ); LOAD_FUNCPTR( vkDestroySurfaceKHR ); LOAD_FUNCPTR( vkDestroySwapchainKHR ); LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index ec03ed6b61a..ab48b1b1998 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -758,7 +758,11 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid done: free( vk_physical_devices ); if (vk_instance) - vulkan_funcs->p_vkDestroyInstance( vk_instance, NULL ); + { + PFN_vkDestroyInstance p_vkDestroyInstance; + p_vkDestroyInstance = vulkan_funcs->p_vkGetInstanceProcAddr( vk_instance, "vkDestroyInstance" ); + p_vkDestroyInstance( vk_instance, NULL ); + } return ret; }
diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 1c7df64bb24..3dfa63de952 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 21 +#define WINE_VULKAN_DRIVER_VERSION 22
struct vulkan_funcs { @@ -31,7 +31,6 @@ struct vulkan_funcs */ VkResult (*p_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); - void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); void (*p_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); void (*p_vkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *);
On Thu Mar 28 15:43:30 2024 +0000, Rémi Bernon wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/5409/diffs?diff_id=107609&start_sha=18a7d75df0e7a375695b60c2adccc8e09bd42983#561751f09a3d9e02a084f385e9182f0184b50581_983_979)
Right did that instead, thanks.
On Thu Mar 28 15:16:18 2024 +0000, Jacek Caban wrote:
This may expose the extension multiple times.
Should be better now.
This merge request was approved by Jacek Caban.