From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 21 +++++++++++++++++++++ dlls/winevulkan/vulkan.c | 18 +++++++++++++++--- dlls/winevulkan/vulkan_private.h | 1 + dlls/winevulkan/vulkan_thunks.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 3 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 809591b3c97..98607dbe6ce 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2771,6 +2771,12 @@ 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_surface_extensions[] =\n{\n") + for ext in self.registry.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 +2799,17 @@ class VkGenerator(object): f.write(" return FALSE;\n") f.write("}\n\n")
+ f.write("BOOL wine_vk_is_surface_extension(const char *name)\n") + f.write("{\n") + f.write(" unsigned int i;\n") + f.write(" for (i = 0; i < ARRAY_SIZE(vk_surface_extensions); i++)\n") + f.write(" {\n") + f.write(" if (strcmp(vk_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 +3211,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 +3489,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..e5fdde17caf 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, has_surface = 0; VkResult res;
res = vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, NULL); @@ -1027,11 +1027,14 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t */ for (i = 0; i < num_host_properties; i++) { - if (wine_vk_instance_extension_supported(host_properties[i].extensionName)) + if (wine_vk_is_surface_extension(host_properties[i].extensionName)) + has_surface = 1; + else if (wine_vk_instance_extension_supported(host_properties[i].extensionName)) num_properties++; else TRACE("Instance extension '%s' is not supported.\n", host_properties[i].extensionName); } + num_properties += has_surface;
if (!properties) { @@ -1043,12 +1046,21 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t
for (i = 0, j = 0; i < num_host_properties && j < *count; i++) { - if (wine_vk_instance_extension_supported(host_properties[i].extensionName)) + if (wine_vk_instance_extension_supported(host_properties[i].extensionName) && + !wine_vk_is_surface_extension(host_properties[i].extensionName)) { TRACE("Enabling extension '%s'.\n", host_properties[i].extensionName); properties[j++] = host_properties[i]; } } + + if (has_surface && j < *count) + { + snprintf(properties[j].extensionName, sizeof(properties[j].extensionName), + VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + properties[j].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION; + } + *count = min(*count, num_properties);
free(host_properties); diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index b44285722a7..c5db8e7df4e 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_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..3fc99bb79e0 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -46749,6 +46749,25 @@ static const char * const vk_instance_extensions[] = "VK_KHR_win32_surface", };
+static const char * const vk_surface_extensions[] = +{ + "VK_KHR_xlib_surface", + "VK_KHR_xcb_surface", + "VK_KHR_wayland_surface", + "VK_KHR_mir_surface", + "VK_KHR_android_surface", + "VK_KHR_win32_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_headless_surface", + "VK_EXT_directfb_surface", + "VK_QNX_screen_surface", +}; + BOOL wine_vk_device_extension_supported(const char *name) { unsigned int i; @@ -46771,6 +46790,17 @@ BOOL wine_vk_instance_extension_supported(const char *name) return FALSE; }
+BOOL wine_vk_is_surface_extension(const char *name) +{ + unsigned int i; + for (i = 0; i < ARRAY_SIZE(vk_surface_extensions); i++) + { + if (strcmp(vk_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 | 1 - dlls/winevulkan/vulkan.c | 15 ++++++---- dlls/winewayland.drv/vulkan.c | 45 ---------------------------- dlls/winex11.drv/vulkan.c | 44 --------------------------- include/wine/vulkan_driver.h | 1 - 7 files changed, 9 insertions(+), 154 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 98607dbe6ce..102907ce1ff 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -201,7 +201,6 @@ USER_DRIVER_FUNCS = { "vkDestroyInstance", "vkDestroySurfaceKHR", "vkDestroySwapchainKHR", - "vkEnumerateInstanceExtensionProperties", "vkGetDeviceProcAddr", "vkGetInstanceProcAddr", "vkGetPhysicalDeviceWin32PresentationSupportKHR", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index e5fdde17caf..cca24c0afe6 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -32,6 +32,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (*p_vkEnumerateInstanceVersion)(uint32_t *version); +static VkResult (*p_vkEnumerateInstanceExtensionProperties)(const char *name, uint32_t *count, + VkExtensionProperties *properties); + 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 +549,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 +1013,14 @@ VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t unsigned int i, j, has_surface = 0; 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); @@ -1078,10 +1085,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..66b8c6ff813 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -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 | 6 ++++-- dlls/winewayland.drv/vulkan.c | 6 ++++++ dlls/winex11.drv/vulkan.c | 6 ++++++ include/wine/vulkan_driver.h | 1 + 5 files changed, 23 insertions(+), 2 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 cca24c0afe6..244356217be 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -573,7 +573,7 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * VkDebugUtilsMessengerCreateInfoEXT *debug_utils_messenger; VkDebugReportCallbackCreateInfoEXT *debug_report_callback; VkBaseInStructure *header; - unsigned int i; + int i, surface_index = -1;
*dst = *src;
@@ -632,10 +632,11 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * if (!strcmp(extension_name, "VK_KHR_win32_surface")) { object->enable_win32_surface = VK_TRUE; + surface_index = i; } }
- if (use_external_memory()) + if (use_external_memory() || object->enable_win32_surface) { const char **new_extensions;
@@ -645,6 +646,7 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * dst->enabledExtensionCount * sizeof(*dst->ppEnabledExtensionNames)); new_extensions[dst->enabledExtensionCount++] = "VK_KHR_get_physical_device_properties2"; new_extensions[dst->enabledExtensionCount++] = "VK_KHR_external_memory_capabilities"; + if (surface_index >= 0) new_extensions[surface_index] = vk_funcs->p_get_host_surface_extension(); dst->ppEnabledExtensionNames = new_extensions; }
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 66b8c6ff813..7be4cc9e245 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/winevulkan/vulkan.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 244356217be..a80a84071a5 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -32,9 +32,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
-static VkResult (*p_vkEnumerateInstanceVersion)(uint32_t *version); -static VkResult (*p_vkEnumerateInstanceExtensionProperties)(const char *name, uint32_t *count, - VkExtensionProperties *properties); +static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; +static PFN_vkEnumerateInstanceExtensionProperties p_vkEnumerateInstanceExtensionProperties;
static int window_surface_compare(const void *key, const struct rb_entry *entry) { @@ -1221,7 +1220,7 @@ void wine_vkDestroyCommandPool(VkDevice device_handle, VkCommandPool handle, }
static VkResult wine_vk_enumerate_physical_device_groups(struct wine_instance *instance, - VkResult (*p_vkEnumeratePhysicalDeviceGroups)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *), + PFN_vkEnumeratePhysicalDeviceGroups p_vkEnumeratePhysicalDeviceGroups, uint32_t *count, VkPhysicalDeviceGroupProperties *properties) { unsigned int i, j;
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 | 1 - 9 files changed, 16 insertions(+), 243 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 102907ce1ff..e98c83ba75c 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -195,7 +195,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 a80a84071a5..a9a82b9c7d6 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");
@@ -874,7 +876,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 7be4cc9e245..f2bb3b0c456 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -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 | 1 - dlls/winevulkan/vulkan.c | 8 ++++++-- dlls/winewayland.drv/vulkan.c | 14 -------------- dlls/winex11.drv/vulkan.c | 13 ------------- dlls/winex11.drv/xrandr.c | 6 +++++- include/wine/vulkan_driver.h | 1 - 9 files changed, 14 insertions(+), 47 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 e98c83ba75c..deec276436a 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -197,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 a9a82b9c7d6..f1a45b366e5 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -905,8 +905,10 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, res = wine_vk_instance_init_physical_devices(object); if (res != VK_SUCCESS) { + PFN_vkDestroyInstance p_vkDestroyInstance; ERR("Failed to load physical devices, res=%d\n", res); - vk_funcs->p_vkDestroyInstance(object->host_instance, NULL /* allocator */); + p_vkDestroyInstance = vk_funcs->p_vkGetInstanceProcAddr(object->host_instance, "vkDestroyInstance"); + p_vkDestroyInstance(object->host_instance, NULL /* allocator */); free(object->utils_messengers); free(object); return res; @@ -963,6 +965,7 @@ void wine_vkDestroyDevice(VkDevice handle, const VkAllocationCallbacks *allocato void wine_vkDestroyInstance(VkInstance handle, const VkAllocationCallbacks *allocator) { struct wine_instance *instance = wine_instance_from_handle(handle); + PFN_vkDestroyInstance p_vkDestroyInstance; unsigned int i;
if (allocator) @@ -970,7 +973,8 @@ void wine_vkDestroyInstance(VkInstance handle, const VkAllocationCallbacks *allo if (!instance) return;
- vk_funcs->p_vkDestroyInstance(instance->host_instance, NULL /* allocator */); + p_vkDestroyInstance = vk_funcs->p_vkGetInstanceProcAddr(instance->host_instance, "vkDestroyInstance"); + 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/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..0fc25414026 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 ); + { + VkResult (*p_vkDestroyInstance)(VkInstance handle, const VkAllocationCallbacks *allocator); + 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 f2bb3b0c456..44aa45308aa 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -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 *);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=144434
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: input.c:3875: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 00000000006C00F0, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
Jacek Caban (@jacek) commented about dlls/winevulkan/vulkan.c:
{
if (wine_vk_instance_extension_supported(host_properties[i].extensionName))
if (wine_vk_instance_extension_supported(host_properties[i].extensionName) &&
}!wine_vk_is_surface_extension(host_properties[i].extensionName)) { TRACE("Enabling extension '%s'.\n", host_properties[i].extensionName); properties[j++] = host_properties[i]; }
- if (has_surface && j < *count)
- {
snprintf(properties[j].extensionName, sizeof(properties[j].extensionName),
VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
properties[j].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION;
- }
Conditioning exposing win32 surface extension on presence of any surface extension does not seem accurate. If we'd want to be paranoid, the driver may expose a different extension than Wine driver expects. In practice this is mostly fine because we'd just always expose the extension.
However, could we just expose it unconditionally? Or just check only for `VK_KHR_surface`? I think it's always present on Windows. On Wine, if fail to deliver the surface extension, it's a bug there, not here.
Jacek Caban (@jacek) commented about dlls/winevulkan/vulkan_thunks.c:
+static const char * const vk_surface_extensions[] = +{
- "VK_KHR_xlib_surface",
- "VK_KHR_xcb_surface",
- "VK_KHR_wayland_surface",
- "VK_KHR_mir_surface",
- "VK_KHR_android_surface",
- "VK_KHR_win32_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_headless_surface",
It's not a big deal as it's not yet supported anyway, but `VK_EXT_headless_surface` shouldn't be filtered like that like that.
Jacek Caban (@jacek) commented about dlls/winevulkan/vulkan.c:
if (!strcmp(extension_name, "VK_KHR_win32_surface")) { object->enable_win32_surface = VK_TRUE;
}surface_index = i; }
- if (use_external_memory())
- if (use_external_memory() || object->enable_win32_surface)
That makes `VK_KHR_external_memory_capabilities` required almost unconditionally, which is not really needed. (It's outside the scope of this MR, but we could make it optional on wow64 now with placed map.)
Jacek Caban (@jacek) commented about dlls/winevulkan/vulkan.c:
if (!strcmp(extension_name, "VK_KHR_win32_surface")) { object->enable_win32_surface = VK_TRUE;
surface_index = i;
This is not enough, "VK_KHR_win32_surface" may be specified multiple times.
It's also missing Vulkan driver version increment.