From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 1 - dlls/winemac.drv/vulkan.c | 5 --- dlls/winevulkan/loader.c | 19 ++++++++++ dlls/winevulkan/make_vulkan | 22 ------------ dlls/winevulkan/vulkan.c | 59 ++++++++++---------------------- dlls/winevulkan/vulkan_loader.h | 12 ------- dlls/winevulkan/vulkan_private.h | 3 -- dlls/winevulkan/vulkan_thunks.c | 32 ----------------- dlls/winewayland.drv/vulkan.c | 1 - dlls/winex11.drv/vulkan.c | 1 - include/wine/vulkan_driver.h | 14 ++++++++ 11 files changed, 52 insertions(+), 117 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 12b31fbc26f..77999d0a0b9 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -2347,7 +2347,6 @@ static VkBool32 nulldrv_get_physical_device_presentation_support( struct vulkan_
static const char *nulldrv_get_host_extension( const char *name ) { - if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_EXT_headless_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; if (!strcmp( name, "VK_KHR_external_fence_win32" )) return "VK_KHR_external_fence_fd"; diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 9ba3befafde..bd8aa50f486 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -102,11 +102,6 @@ static BOOL use_VK_EXT_metal_surface;
static const char *macdrv_get_host_extension(const char *name) { - if (!strcmp( name, "VK_KHR_win32_surface" )) - { - if (use_VK_EXT_metal_surface) return "VK_EXT_metal_surface"; - return "VK_MVK_macos_surface"; - } return name; }
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index e6fc7e21d22..7b20a97feb3 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -107,6 +107,14 @@ PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char return NULL; }
+ if (instance->extensions.has_VK_KHR_win32_surface) + { + if (!strcmp(name, "vkCreateWin32SurfaceKHR")) + return (PFN_vkVoidFunction)vkCreateWin32SurfaceKHR; + if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) + return (PFN_vkVoidFunction)vkGetPhysicalDeviceWin32PresentationSupportKHR; + } + if (!is_available_instance_function(instance, name)) return NULL;
@@ -335,6 +343,7 @@ static BOOL is_instance_extension_supported(const char *extension, struct vulkan VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *ret) { + struct vulkan_instance_extensions extensions = {0}; struct vkCreateInstance_params params; const VkApplicationInfo *app_info; struct VkInstance_T *instance; @@ -356,6 +365,15 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, get_device_proc_addr_instance_procs = TRUE; }
+ TRACE("Enabling %u client instance extensions\n", create_info->enabledExtensionCount); + for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) + { + const char *extension = create_info->ppEnabledExtensionNames[i]; + if (!is_instance_extension_supported(extension, &extensions)) + return VK_ERROR_EXTENSION_NOT_PRESENT; + TRACE(" - %s\n", extension); + } + for (;;) { if (!(instance = vulkan_client_object_create(FIELD_OFFSET(struct VkInstance_T, phys_devs[phys_dev_count])))) @@ -363,6 +381,7 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, instance->phys_dev_count = phys_dev_count; for (i = 0; i < phys_dev_count; i++) instance->phys_devs[i].obj.loader_magic = VULKAN_ICD_MAGIC_VALUE; + instance->extensions = extensions;
params.pCreateInfo = create_info; params.pAllocator = allocator; diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 7673570f61a..a515f3e39f0 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2653,17 +2653,6 @@ class VkGenerator(object): f.write(" "{0}",\n".format(ext["name"])) f.write("};\n\n")
- # Create array of instance extensions. - f.write("static const char * const vk_instance_extensions[] =\n{\n") - for ext in self.registry.extensions: - if ext["type"] != "instance": - continue - if ext["name"] in UNEXPOSED_EXTENSIONS: - continue - - 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") @@ -2675,17 +2664,6 @@ class VkGenerator(object): f.write(" return FALSE;\n") f.write("}\n\n")
- f.write("BOOL wine_vk_instance_extension_supported(const char *name)\n") - f.write("{\n") - f.write(" unsigned int i;\n") - f.write(" for (i = 0; i < ARRAY_SIZE(vk_instance_extensions); i++)\n") - f.write(" {\n") - f.write(" if (strcmp(vk_instance_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") diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index f7217e6ac14..9398b3056bd 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -748,8 +748,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * VkDebugReportCallbackCreateInfoEXT *debug_report_callback; VkBaseInStructure *header; const char **extensions; + uint32_t count = 0; unsigned int i; - uint32_t count;
*dst = *src;
@@ -791,47 +791,31 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * return VK_ERROR_LAYER_NOT_PRESENT; }
- for (i = 0; i < src->enabledExtensionCount; 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; - } - } - - count = src->enabledExtensionCount; - extensions = conversion_context_alloc(ctx, (count + 2) * sizeof(*extensions)); - memcpy(extensions, src->ppEnabledExtensionNames, count * sizeof(*dst->ppEnabledExtensionNames)); - dst->ppEnabledExtensionNames = extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - - for (const char **extension = extensions, **end = extension + count; extension < end; extension++) + if (instance->obj.extensions.has_VK_EXT_debug_utils || instance->obj.extensions.has_VK_EXT_debug_report) { - if (!strcmp(*extension, "VK_EXT_debug_utils") || !strcmp(*extension, "VK_EXT_debug_report")) - { - rb_init(&instance->objects, vulkan_object_compare); - pthread_rwlock_init(&instance->objects_lock, NULL); - } - if (!strcmp(*extension, "VK_KHR_win32_surface")) - { - *extension = vk_funcs->p_get_host_extension("VK_KHR_win32_surface"); - instance->enable_win32_surface = VK_TRUE; - } + rb_init(&instance->objects, vulkan_object_compare); + pthread_rwlock_init(&instance->objects_lock, NULL); }
if (use_external_memory()) { - extensions[count++] = "VK_KHR_get_physical_device_properties2"; - extensions[count++] = "VK_KHR_external_memory_capabilities"; + instance->obj.extensions.has_VK_KHR_get_physical_device_properties2 = 1; + instance->obj.extensions.has_VK_KHR_external_memory_capabilities = 1; }
- TRACE("Enabling %u instance extensions\n", count); + vk_funcs->p_map_instance_extensions(&instance->obj.extensions); + instance->obj.extensions.has_VK_KHR_win32_surface = 0; + + extensions = conversion_context_alloc(ctx, sizeof(instance->obj.extensions) * 8 * sizeof(*extensions)); +#define USE_VK_EXT(x) if (instance->obj.extensions.has_ ## x) extensions[count++] = #x; + ALL_VK_INSTANCE_EXTS +#undef USE_VK_EXT + + TRACE("Enabling %u host instance extensions\n", count); for (const char **extension = extensions, **end = extension + count; extension < end; extension++) TRACE(" - %s\n", debugstr_a(*extension));
+ dst->ppEnabledExtensionNames = extensions; dst->enabledExtensionCount = count; return VK_SUCCESS; } @@ -1057,6 +1041,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, return VK_ERROR_OUT_OF_HOST_MEMORY; } physical_devices = (struct vulkan_physical_device *)(instance + 1); + instance->obj.extensions = client_instance->extensions;
init_conversion_context(&ctx); res = wine_vk_instance_convert_create_info(&ctx, create_info, &create_info_host, instance); @@ -1780,14 +1765,8 @@ void wine_vkDestroyDeferredOperationKHR(VkDevice device_handle,
static NTSTATUS is_available_instance_function(VkInstance handle, const char *name) { - struct wine_instance *instance = wine_instance_from_handle(handle); - - if (!strcmp(name, "vkCreateWin32SurfaceKHR")) - return instance->enable_win32_surface; - if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) - return instance->enable_win32_surface; - - return !!vk_funcs->p_vkGetInstanceProcAddr(instance->obj.host.instance, name); + struct vulkan_instance *instance = vulkan_instance_from_handle(handle); + return !!vk_funcs->p_vkGetInstanceProcAddr(instance->host.instance, name); }
static NTSTATUS is_available_device_function(VkDevice handle, const char *name) diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index e9a4195eee2..9bfc0d87a42 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -40,18 +40,6 @@ /* Magic value defined by Vulkan ICD / Loader spec */ #define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
-struct VkPhysicalDevice_T -{ - struct vulkan_client_object obj; -}; - -struct VkInstance_T -{ - struct vulkan_client_object obj; - uint32_t phys_dev_count; - struct VkPhysicalDevice_T phys_devs[1]; -}; - struct VkQueue_T { struct vulkan_client_object obj; diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 5572c11ed6c..a9ddb6dd67d 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -67,8 +67,6 @@ struct wine_instance { struct vulkan_instance obj;
- VkBool32 enable_win32_surface; - struct wine_debug_utils_messenger *utils_messengers; uint32_t utils_messenger_count;
@@ -111,7 +109,6 @@ static inline struct wine_debug_report_callback *wine_debug_report_callback_from }
BOOL wine_vk_device_extension_supported(const char *name); -BOOL wine_vk_instance_extension_supported(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 dd0ce0acc52..a164c0ee833 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -61370,27 +61370,6 @@ static const char * const vk_device_extensions[] = "VK_VALVE_video_encode_rgb_conversion", };
-static const char * const vk_instance_extensions[] = -{ - "VK_EXT_debug_report", - "VK_EXT_debug_utils", - "VK_EXT_layer_settings", - "VK_EXT_surface_maintenance1", - "VK_EXT_swapchain_colorspace", - "VK_EXT_validation_features", - "VK_EXT_validation_flags", - "VK_KHR_device_group_creation", - "VK_KHR_external_fence_capabilities", - "VK_KHR_external_memory_capabilities", - "VK_KHR_external_semaphore_capabilities", - "VK_KHR_get_physical_device_properties2", - "VK_KHR_get_surface_capabilities2", - "VK_KHR_portability_enumeration", - "VK_KHR_surface", - "VK_KHR_surface_maintenance1", - "VK_KHR_win32_surface", -}; - BOOL wine_vk_device_extension_supported(const char *name) { unsigned int i; @@ -61402,17 +61381,6 @@ BOOL wine_vk_device_extension_supported(const char *name) return FALSE; }
-BOOL wine_vk_instance_extension_supported(const char *name) -{ - unsigned int i; - for (i = 0; i < ARRAY_SIZE(vk_instance_extensions); i++) - { - if (strcmp(vk_instance_extensions[i], name) == 0) - return TRUE; - } - return FALSE; -} - BOOL wine_vk_is_type_wrapped(VkObjectType type) { return FALSE || diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 74a4337de6e..4da02ac74b0 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -83,7 +83,6 @@ static VkBool32 wayland_get_physical_device_presentation_support(struct vulkan_p
static const char *wayland_get_host_extension(const char *name) { - if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_wayland_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; if (!strcmp( name, "VK_KHR_external_fence_win32" )) return "VK_KHR_external_fence_fd"; diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 82335e5c5a7..56763abf38f 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -80,7 +80,6 @@ static VkBool32 X11DRV_get_physical_device_presentation_support( struct vulkan_p
static const char *X11DRV_get_host_extension( const char *name ) { - if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_xlib_surface"; if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; if (!strcmp( name, "VK_KHR_external_semaphore_win32" )) return "VK_KHR_external_semaphore_fd"; if (!strcmp( name, "VK_KHR_external_fence_win32" )) return "VK_KHR_external_fence_fd"; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index ba8599751c1..4cc8f304cab 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -50,6 +50,19 @@ struct vulkan_instance_extensions #undef USE_VK_EXT };
+struct VkPhysicalDevice_T +{ + struct vulkan_client_object obj; +}; + +struct VkInstance_T +{ + struct vulkan_client_object obj; + struct vulkan_instance_extensions extensions; + uint32_t phys_dev_count; + struct VkPhysicalDevice_T phys_devs[1]; +}; + #ifdef WINE_UNIX_LIB
#include "wine/rbtree.h" @@ -82,6 +95,7 @@ static inline void vulkan_object_init( struct vulkan_object *obj, UINT64 host_ha struct vulkan_instance { VULKAN_OBJECT_HEADER( VkInstance, instance ); + struct vulkan_instance_extensions extensions; #define USE_VK_FUNC(x) PFN_ ## x p_ ## x; ALL_VK_INSTANCE_FUNCS #undef USE_VK_FUNC