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 ||