Moving the client specific extension filtering to the PE side, and tracking supported and enabled extension lists as bitfields. This makes it possible to store the client/host supported/enabled extension list on the vulkan objects, making it easily available and shareable with win32u.
The goal is to then move the Vulkan device and instance wrappers to win32u, to benefit from their infrastructure (function pointer loading, etc), but also because D3DKMT will have to create Vulkan objects on its own for timeline and shared D3D12 fences, and allowing it to create Vulkan wrapped objects will make things easier than having a mix of host handles (in the D3DKMT stack) and wrapped handles (in the Vulkan stack).
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/loader.c | 14 +++++++++++++- dlls/winevulkan/vulkan.c | 15 --------------- dlls/winevulkan/vulkan_loader.h | 3 --- dlls/winevulkan/vulkan_private.h | 2 -- 4 files changed, 13 insertions(+), 21 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 77bed3603af..b5d1b5a1310 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -29,6 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); #define WINE_VULKAN_ICD_VERSION 4
static HINSTANCE hinstance; +static BOOL get_device_proc_addr_instance_procs = FALSE;
VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) { @@ -154,7 +155,7 @@ PFN_vkVoidFunction WINAPI vkGetDeviceProcAddr(VkDevice device, const char *name) * https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/2323 * https://github.com/KhronosGroup/Vulkan-Docs/issues/655 */ - if ((device->quirks & WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR) + if (get_device_proc_addr_instance_procs && ((func = wine_vk_get_instance_proc_addr(name)) || (func = wine_vk_get_phys_dev_proc_addr(name)))) { @@ -324,6 +325,7 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *ret) { struct vkCreateInstance_params params; + const VkApplicationInfo *app_info; struct VkInstance_T *instance; uint32_t phys_dev_count = 8, i; NTSTATUS status; @@ -333,6 +335,16 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, if (!wine_vk_init_once()) return VK_ERROR_INITIALIZATION_FAILED;
+ if ((app_info = create_info->pApplicationInfo)) + { + TRACE("Application name %s, application version %#x.\n", debugstr_a(app_info->pApplicationName), app_info->applicationVersion); + TRACE("Engine name %s, engine version %#x.\n", debugstr_a(app_info->pEngineName), app_info->engineVersion); + TRACE("API version %#x.\n", app_info->apiVersion); + + if (app_info->pEngineName && !strcmp(app_info->pEngineName, "idTech")) + get_device_proc_addr_instance_procs = TRUE; + } + for (;;) { if (!(instance = vulkan_client_object_create(FIELD_OFFSET(struct VkInstance_T, phys_devs[phys_dev_count])))) diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index ec326dda168..d566eec841e 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -980,8 +980,6 @@ VkResult wine_vkCreateDevice(VkPhysicalDevice client_physical_device, const VkDe for (i = 0; i < create_info_host.queueCreateInfoCount; i++) wine_vk_device_init_queues(device, create_info_host.pQueueCreateInfos + i);
- client_device->quirks = CONTAINING_RECORD(instance, struct wine_instance, obj)->quirks; - TRACE("Created device %p, host_device %p.\n", device, device->obj.host.device); for (i = 0; i < device->queue_count; i++) { @@ -999,7 +997,6 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, void *client_ptr) { VkInstanceCreateInfo create_info_host; - const VkApplicationInfo *app_info; struct conversion_context ctx; struct wine_instance *instance; VkInstance host_instance, client_instance = client_ptr; @@ -1058,18 +1055,6 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, return res; }
- if ((app_info = create_info->pApplicationInfo)) - { - TRACE("Application name %s, application version %#x.\n", - debugstr_a(app_info->pApplicationName), app_info->applicationVersion); - TRACE("Engine name %s, engine version %#x.\n", debugstr_a(app_info->pEngineName), - app_info->engineVersion); - TRACE("API version %#x.\n", app_info->apiVersion); - - if (app_info->pEngineName && !strcmp(app_info->pEngineName, "idTech")) - instance->quirks |= WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR; - } - TRACE("Created instance %p, host_instance %p.\n", instance, instance->obj.host.instance);
for (i = 0; i < instance->obj.physical_device_count; i++) diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 6c9cbeb9f83..1d91bdf0216 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -40,8 +40,6 @@ /* Magic value defined by Vulkan ICD / Loader spec */ #define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
-#define WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR 0x00000001 - struct VkPhysicalDevice_T { struct vulkan_client_object obj; @@ -62,7 +60,6 @@ struct VkQueue_T struct VkDevice_T { struct vulkan_client_object obj; - unsigned int quirks; struct VkQueue_T queues[1]; };
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 2324e6f8639..0231cd3291b 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -74,8 +74,6 @@ struct wine_instance
struct wine_debug_report_callback default_callback;
- unsigned int quirks; - struct rb_tree objects; pthread_rwlock_t objects_lock; };
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 21 ++++- dlls/winemac.drv/vulkan.c | 26 +++++- dlls/winevulkan/loader.c | 48 +++++++++-- dlls/winevulkan/loader_thunks.c | 1 + dlls/winevulkan/make_vulkan | 60 +++++--------- dlls/winevulkan/vulkan.c | 131 ++++++++++++++++--------------- dlls/winevulkan/vulkan_loader.h | 3 +- dlls/winevulkan/vulkan_private.h | 2 +- dlls/winevulkan/vulkan_thunks.c | 31 +------- dlls/winewayland.drv/vulkan.c | 7 ++ dlls/winex11.drv/vulkan.c | 7 ++ include/wine/vulkan.h | 26 ++++++ include/wine/vulkan_driver.h | 12 ++- 13 files changed, 229 insertions(+), 146 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index f7b98404d52..12b31fbc26f 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -2266,6 +2266,11 @@ static const char *win32u_get_host_extension( const char *name ) return driver_funcs->p_get_host_extension( name ); }
+static void win32u_map_instance_extensions( struct vulkan_instance_extensions *extensions ) +{ + return driver_funcs->p_map_instance_extensions( extensions ); +} + static struct vulkan_funcs vulkan_funcs = { .p_vkAcquireNextImage2KHR = win32u_vkAcquireNextImage2KHR, @@ -2316,6 +2321,7 @@ static struct vulkan_funcs vulkan_funcs = .p_vkUnmapMemory = win32u_vkUnmapMemory, .p_vkUnmapMemory2KHR = win32u_vkUnmapMemory2KHR, .p_get_host_extension = win32u_get_host_extension, + .p_map_instance_extensions = win32u_map_instance_extensions, };
static VkResult nulldrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, @@ -2348,11 +2354,18 @@ static const char *nulldrv_get_host_extension( const char *name ) return name; }
+static void nulldrv_map_instance_extensions( struct vulkan_instance_extensions *extensions ) +{ + if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_EXT_headless_surface = 1; + if (extensions->has_VK_EXT_headless_surface) extensions->has_VK_KHR_win32_surface = 1; +} + static const struct vulkan_driver_funcs nulldrv_funcs = { .p_vulkan_surface_create = nulldrv_vulkan_surface_create, .p_get_physical_device_presentation_support = nulldrv_get_physical_device_presentation_support, .p_get_host_extension = nulldrv_get_host_extension, + .p_map_instance_extensions = nulldrv_map_instance_extensions, };
static void vulkan_driver_init(void) @@ -2367,7 +2380,6 @@ static void vulkan_driver_init(void) }
if (status == STATUS_NOT_IMPLEMENTED) driver_funcs = &nulldrv_funcs; - else vulkan_funcs.p_get_host_extension = driver_funcs->p_get_host_extension; }
static void vulkan_driver_load(void) @@ -2395,11 +2407,18 @@ static const char *lazydrv_get_host_extension( const char *name ) return driver_funcs->p_get_host_extension( name ); }
+static void lazydrv_map_instance_extensions( struct vulkan_instance_extensions *extensions ) +{ + vulkan_driver_load(); + return driver_funcs->p_map_instance_extensions( extensions ); +} + static const struct vulkan_driver_funcs lazydrv_funcs = { .p_vulkan_surface_create = lazydrv_vulkan_surface_create, .p_get_physical_device_presentation_support = lazydrv_get_physical_device_presentation_support, .p_get_host_extension = lazydrv_get_host_extension, + .p_map_instance_extensions = lazydrv_map_instance_extensions, };
static void vulkan_init_once(void) diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 51d951139b9..9ba3befafde 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -98,18 +98,38 @@ static VkBool32 macdrv_get_physical_device_presentation_support(struct vulkan_ph return VK_TRUE; }
-static const char *host_surface_extension = "VK_MVK_macos_surface"; +static BOOL use_VK_EXT_metal_surface; + static const char *macdrv_get_host_extension(const char *name) { - if (!strcmp( name, "VK_KHR_win32_surface" )) return host_surface_extension; + 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; }
+static void macdrv_map_instance_extensions(struct vulkan_instance_extensions *extensions) +{ + if (use_VK_EXT_metal_surface) + { + if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_EXT_metal_surface = 1; + if (extensions->has_VK_EXT_metal_surface) extensions->has_VK_KHR_win32_surface = 1; + } + else + { + if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_MVK_macos_surface = 1; + if (extensions->has_VK_MVK_macos_surface) extensions->has_VK_KHR_win32_surface = 1; + } +} + static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs = { .p_vulkan_surface_create = macdrv_vulkan_surface_create, .p_get_physical_device_presentation_support = macdrv_get_physical_device_presentation_support, .p_get_host_extension = macdrv_get_host_extension, + .p_map_instance_extensions = macdrv_map_instance_extensions, };
UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs) @@ -120,7 +140,7 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_dr return STATUS_INVALID_PARAMETER; }
- if (dlsym(vulkan_handle, "vkCreateMetalSurfaceEXT")) host_surface_extension = "VK_EXT_metal_surface"; + use_VK_EXT_metal_surface = !!dlsym(vulkan_handle, "vkCreateMetalSurfaceEXT");
*driver_funcs = &macdrv_vulkan_driver_funcs; return STATUS_SUCCESS; diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index b5d1b5a1310..e6fc7e21d22 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -30,6 +30,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
static HINSTANCE hinstance; static BOOL get_device_proc_addr_instance_procs = FALSE; +static struct vulkan_instance_extensions instance_extensions; /* supported client instance extensions */
VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) { @@ -305,13 +306,14 @@ static NTSTATUS WINAPI call_vulkan_debug_utils_callback(void *args, ULONG size)
static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) { - struct vk_callback_funcs callback_funcs = + struct init_params params = { - .call_vulkan_debug_report_callback = (ULONG_PTR)call_vulkan_debug_report_callback, - .call_vulkan_debug_utils_callback = (ULONG_PTR)call_vulkan_debug_utils_callback, + .call_vulkan_debug_report_callback = (UINT_PTR)call_vulkan_debug_report_callback, + .call_vulkan_debug_utils_callback = (UINT_PTR)call_vulkan_debug_utils_callback, + .extensions = &instance_extensions, };
- return !__wine_init_unix_call() && !UNIX_CALL(init, &callback_funcs); + return !__wine_init_unix_call() && !UNIX_CALL(init, ¶ms); }
static BOOL wine_vk_init_once(void) @@ -321,6 +323,15 @@ static BOOL wine_vk_init_once(void) return InitOnceExecuteOnce(&init_once, wine_vk_init, NULL, NULL); }
+static BOOL is_instance_extension_supported(const char *extension, struct vulkan_instance_extensions *extensions) +{ +#define USE_VK_EXT(x) if (!strcmp(extension, #x)) return (extensions->has_ ## x = instance_extensions.has_ ## x); + ALL_VK_CLIENT_INSTANCE_EXTS +#undef USE_VK_EXT + WARN("Extension %s is not supported.\n", debugstr_a(extension)); + return FALSE; +} + VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *ret) { @@ -386,6 +397,8 @@ VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count, VkExtensionProperties *properties) { struct vkEnumerateInstanceExtensionProperties_params params; + struct vulkan_instance_extensions extensions = {0}; + uint32_t i, j, capacity = *count; NTSTATUS status;
TRACE("%p, %p, %p\n", layer_name, count, properties); @@ -406,7 +419,32 @@ VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, params.pPropertyCount = count; params.pProperties = properties; status = UNIX_CALL(vkEnumerateInstanceExtensionProperties, ¶ms); - assert(!status); + assert(!status && "vkEnumerateInstanceExtensionProperties"); + if (params.result) return params.result; + + if (!properties) + { + if (instance_extensions.has_VK_KHR_win32_surface) *count += 1; + return params.result; + } + + TRACE("Client instance extensions:\n"); + for (i = 0, j = 0; i < *count; i++) + { + const char *extension = properties[i].extensionName; + if (!is_instance_extension_supported(extension, &extensions)) continue; + TRACE(" - %s\n", extension); + properties[j++] = properties[i]; + } + if (instance_extensions.has_VK_KHR_win32_surface) + { + static const VkExtensionProperties VK_KHR_win32_surface = {VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_SPEC_VERSION}; + if (j == capacity) return VK_INCOMPLETE; + TRACE(" - VK_KHR_win32_surface\n"); + properties[j++] = VK_KHR_win32_surface; + } + *count = j; + return params.result; }
diff --git a/dlls/winevulkan/loader_thunks.c b/dlls/winevulkan/loader_thunks.c index 2b396998be8..1a210a19b37 100644 --- a/dlls/winevulkan/loader_thunks.c +++ b/dlls/winevulkan/loader_thunks.c @@ -7880,3 +7880,4 @@ void *wine_vk_get_instance_proc_addr(const char *name) } return NULL; } + diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 619dd35cd72..7673570f61a 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -156,12 +156,6 @@ 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 = [ @@ -2670,13 +2664,6 @@ 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") @@ -2699,17 +2686,6 @@ 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") @@ -2749,7 +2725,7 @@ class VkGenerator(object): f.write("const unixlib_entry_t __wine_unix_call_funcs[] =\n") f.write("#endif\n") f.write("{\n") - f.write(" init_vulkan,\n") + f.write(" wow64_init_vulkan,\n") f.write(" vk_is_available_instance_function32,\n") f.write(" vk_is_available_device_function32,\n") for vk_func in self.registry.funcs.values(): @@ -2863,7 +2839,7 @@ class VkGenerator(object): f.write(" }\n") f.write(" }\n") f.write(" return NULL;\n") - f.write("}\n") + f.write("}\n\n")
def generate_loader_thunks_h(self, f): self._generate_copyright(f) @@ -3029,21 +3005,31 @@ class VkGenerator(object): f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) f.write("\n\n")
- f.write("#define ALL_VK_INSTANCE_FUNCS \\n") - first = True + f.write("#define ALL_VK_INSTANCE_FUNCS") for vk_func in self.registry.instance_funcs + self.registry.phys_dev_funcs: if not vk_func.is_required(): continue - if not vk_func.needs_dispatch(): - LOGGER.debug("skipping {0} in ALL_VK_INSTANCE_FUNCS".format(vk_func.name)) continue + f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) + f.write("\n\n")
- if first: - f.write(" USE_VK_FUNC({0})".format(vk_func.name)) - first = False - else: - f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) + f.write("#define ALL_VK_CLIENT_INSTANCE_EXTS") + for ext in self.registry.extensions: + if ext["type"] != "instance": + continue + if ext["name"] in UNEXPOSED_EXTENSIONS: + continue + f.write(f" \\n USE_VK_EXT({ext["name"]})") + f.write("\n\n") + + f.write("#define ALL_VK_INSTANCE_EXTS ALL_VK_CLIENT_INSTANCE_EXTS") + for ext in self.registry.extensions: + if ext["type"] != "instance": + continue + if ext["name"] not in UNEXPOSED_EXTENSIONS: + continue + f.write(f" \\n USE_VK_EXT({ext["name"]})") f.write("\n\n")
f.write("#endif /* __WINE_VULKAN_H */\n") @@ -3100,7 +3086,6 @@ 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'^' @@ -3377,9 +3362,6 @@ 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 d566eec841e..f7217e6ac14 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -35,6 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static PFN_vkCreateInstance p_vkCreateInstance; static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; static PFN_vkEnumerateInstanceExtensionProperties p_vkEnumerateInstanceExtensionProperties; +static struct vulkan_instance_extensions instance_extensions; /* supported host instance extensions */
static struct wine_instance *wine_instance_from_handle(VkInstance handle) { @@ -131,7 +132,8 @@ static uint64_t client_handle_from_host(struct vulkan_instance *obj, uint64_t ho return result; }
-struct vk_callback_funcs callback_funcs; +static UINT64 call_vulkan_debug_report_callback; +static UINT64 call_vulkan_debug_utils_callback;
static UINT append_string(const char *name, char *strings, UINT *strings_len) { @@ -208,7 +210,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB ptr = (char *)(params + 1); strings = (char *)params + size;
- params->dispatch.callback = callback_funcs.call_vulkan_debug_utils_callback; + params->dispatch.callback = call_vulkan_debug_utils_callback; params->user_callback = object->user_callback; params->user_data = object->user_data; params->severity = severity; @@ -296,7 +298,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk if (!(params = malloc(sizeof(*params) + strings_len))) return VK_FALSE; strings = (char *)(params + 1);
- params->dispatch.callback = callback_funcs.call_vulkan_debug_report_callback; + params->dispatch.callback = call_vulkan_debug_report_callback; params->user_callback = object->user_callback; params->user_data = object->user_data; params->flags = flags; @@ -668,7 +670,11 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device
NTSTATUS init_vulkan(void *arg) { - const struct vk_callback_funcs *funcs = arg; + struct vulkan_instance_extensions extensions = {0}; + VkExtensionProperties *properties = NULL; + const struct init_params *params = arg; + uint32_t count = 0; + VkResult res;
vk_funcs = __wine_get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); if (!vk_funcs) @@ -677,7 +683,9 @@ NTSTATUS init_vulkan(void *arg) return STATUS_UNSUCCESSFUL; }
- callback_funcs = *funcs; + call_vulkan_debug_report_callback = params->call_vulkan_debug_report_callback; + call_vulkan_debug_utils_callback = params->call_vulkan_debug_utils_callback; + p_vkCreateInstance = (PFN_vkCreateInstance)vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkCreateInstance"); p_vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); p_vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); @@ -690,7 +698,43 @@ NTSTATUS init_vulkan(void *arg) zero_bits = (ULONG_PTR)info.HighestUserAddress | 0x7fffffff; }
- return STATUS_SUCCESS; + do + { + free(properties); + properties = NULL; + if ((res = p_vkEnumerateInstanceExtensionProperties(NULL, &count, NULL))) goto failed; + if (!count || !(properties = malloc(count * sizeof(*properties)))) return STATUS_UNSUCCESSFUL; + } while ((res = p_vkEnumerateInstanceExtensionProperties(NULL, &count, properties) == VK_INCOMPLETE)); + if (res) goto failed; + + TRACE("Host instance extensions:\n"); + for (uint32_t i = 0; i < count; i++) + { + const char *extension = properties[i].extensionName; +#define USE_VK_EXT(x) \ + if (!strcmp(extension, #x)) \ + { \ + extensions.has_ ## x = 1; \ + TRACE(" - %s\n", extension); \ + } else + ALL_VK_INSTANCE_EXTS +#undef USE_VK_EXT + WARN("Extension %s is not supported.\n", debugstr_a(extension)); + } + instance_extensions = extensions; + + /* map host instance extensions for VK_KHR_win32_surface */ + vk_funcs->p_map_instance_extensions(&extensions); + + /* filter out unsupported client instance extensions */ +#define USE_VK_EXT(x) params->extensions->has_ ## x = extensions.has_ ## x; + ALL_VK_CLIENT_INSTANCE_EXTS +#undef USE_VK_EXT + +failed: + free(properties); + if (res) ERR("Failed to initialize Vulkan, res %d\n", res); + return res ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS; }
/* Helper function for converting between win32 and host compatible VkInstanceCreateInfo. @@ -1138,65 +1182,7 @@ VkResult wine_vkEnumerateDeviceExtensionProperties(VkPhysicalDevice client_physi VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t *count, VkExtensionProperties *properties) { - uint32_t num_properties = 0, num_host_properties; - VkExtensionProperties *host_properties; - unsigned int i, j, surface; - VkResult res; - - 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 = p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, host_properties); - if (res != VK_SUCCESS) - { - ERR("Failed to retrieve host properties, res=%d.\n", res); - free(host_properties); - return res; - } - - /* The Wine graphics driver provides us with all extensions supported by the host side - * 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, surface = 0; i < num_host_properties; i++) - { - 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); - } - - if (!properties) - { - TRACE("Returning %u extensions.\n", num_properties); - *count = num_properties; - free(host_properties); - return VK_SUCCESS; - } - - 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); - - free(host_properties); - return *count < num_properties ? VK_INCOMPLETE : VK_SUCCESS; + return p_vkEnumerateInstanceExtensionProperties(name, count, properties); }
VkResult wine_vkEnumerateDeviceLayerProperties(VkPhysicalDevice client_physical_device, uint32_t *count, @@ -1842,6 +1828,21 @@ NTSTATUS vk_is_available_device_function(void *arg)
#endif /* _WIN64 */
+NTSTATUS wow64_init_vulkan(void *arg) +{ + struct + { + UINT64 call_vulkan_debug_report_callback; + UINT64 call_vulkan_debug_utils_callback; + ULONG extensions; + } *params32 = arg; + struct init_params params; + params.call_vulkan_debug_report_callback = params32->call_vulkan_debug_report_callback; + params.call_vulkan_debug_utils_callback = params32->call_vulkan_debug_utils_callback; + params.extensions = UlongToPtr(params32->extensions); + return init_vulkan(¶ms); +} + NTSTATUS vk_is_available_instance_function32(void *arg) { struct diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 1d91bdf0216..e9a4195eee2 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -90,10 +90,11 @@ void *wine_vk_get_device_proc_addr(const char *name); void *wine_vk_get_phys_dev_proc_addr(const char *name); void *wine_vk_get_instance_proc_addr(const char *name);
-struct vk_callback_funcs +struct init_params { UINT64 call_vulkan_debug_report_callback; UINT64 call_vulkan_debug_utils_callback; + struct vulkan_instance_extensions *extensions; };
/* debug callbacks params */ diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 0231cd3291b..5572c11ed6c 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -112,11 +112,11 @@ 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_host_surface_extension(const char *name);
BOOL wine_vk_is_type_wrapped(VkObjectType type);
NTSTATUS init_vulkan(void *args); +NTSTATUS wow64_init_vulkan(void *args);
NTSTATUS vk_is_available_instance_function(void *arg); NTSTATUS vk_is_available_device_function(void *arg); diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 7f902f8ad47..dd0ce0acc52 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -61391,24 +61391,6 @@ 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", - "VK_OHOS_surface", -}; - BOOL wine_vk_device_extension_supported(const char *name) { unsigned int i; @@ -61431,17 +61413,6 @@ 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 || @@ -62145,7 +62116,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = const unixlib_entry_t __wine_unix_call_funcs[] = #endif { - init_vulkan, + wow64_init_vulkan, vk_is_available_instance_function32, vk_is_available_device_function32, thunk32_vkAcquireNextImage2KHR, diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 9a70c90447d..74a4337de6e 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -90,11 +90,18 @@ static const char *wayland_get_host_extension(const char *name) return name; }
+static void wayland_map_instance_extensions(struct vulkan_instance_extensions *extensions) +{ + if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_KHR_wayland_surface = 1; + if (extensions->has_VK_KHR_wayland_surface) extensions->has_VK_KHR_win32_surface = 1; +} + static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs = { .p_vulkan_surface_create = wayland_vulkan_surface_create, .p_get_physical_device_presentation_support = wayland_get_physical_device_presentation_support, .p_get_host_extension = wayland_get_host_extension, + .p_map_instance_extensions = wayland_map_instance_extensions, };
/********************************************************************** diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 72f367898de..82335e5c5a7 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -87,11 +87,18 @@ static const char *X11DRV_get_host_extension( const char *name ) return name; }
+static void X11DRV_map_instance_extensions( struct vulkan_instance_extensions *extensions ) +{ + if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_KHR_xlib_surface = 1; + if (extensions->has_VK_KHR_xlib_surface) extensions->has_VK_KHR_win32_surface = 1; +} + static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs = { .p_vulkan_surface_create = X11DRV_vulkan_surface_create, .p_get_physical_device_presentation_support = X11DRV_get_physical_device_presentation_support, .p_get_host_extension = X11DRV_get_host_extension, + .p_map_instance_extensions = X11DRV_map_instance_extensions, };
UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs ) diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index a6138d23213..cd395ac015b 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -21005,4 +21005,30 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr USE_VK_FUNC(vkGetPhysicalDeviceWin32PresentationSupportKHR) \ USE_VK_FUNC(vkGetPhysicalDeviceXlibPresentationSupportKHR)
+#define ALL_VK_CLIENT_INSTANCE_EXTS \ + USE_VK_EXT(VK_EXT_debug_report) \ + USE_VK_EXT(VK_EXT_debug_utils) \ + USE_VK_EXT(VK_EXT_layer_settings) \ + USE_VK_EXT(VK_EXT_surface_maintenance1) \ + USE_VK_EXT(VK_EXT_swapchain_colorspace) \ + USE_VK_EXT(VK_EXT_validation_features) \ + USE_VK_EXT(VK_EXT_validation_flags) \ + USE_VK_EXT(VK_KHR_device_group_creation) \ + USE_VK_EXT(VK_KHR_external_fence_capabilities) \ + USE_VK_EXT(VK_KHR_external_memory_capabilities) \ + USE_VK_EXT(VK_KHR_external_semaphore_capabilities) \ + USE_VK_EXT(VK_KHR_get_physical_device_properties2) \ + USE_VK_EXT(VK_KHR_get_surface_capabilities2) \ + USE_VK_EXT(VK_KHR_portability_enumeration) \ + USE_VK_EXT(VK_KHR_surface) \ + USE_VK_EXT(VK_KHR_surface_maintenance1) \ + USE_VK_EXT(VK_KHR_win32_surface) + +#define ALL_VK_INSTANCE_EXTS ALL_VK_CLIENT_INSTANCE_EXTS \ + USE_VK_EXT(VK_EXT_headless_surface) \ + USE_VK_EXT(VK_EXT_metal_surface) \ + USE_VK_EXT(VK_KHR_wayland_surface) \ + USE_VK_EXT(VK_KHR_xlib_surface) \ + USE_VK_EXT(VK_MVK_macos_surface) + #endif /* __WINE_VULKAN_H */ diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index fbc639f69fa..ba8599751c1 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -27,6 +27,8 @@ #include <windef.h> #include <winbase.h>
+#include "wine/vulkan.h" + /* Base 'class' for our Vulkan dispatchable objects such as VkDevice and VkInstance. * This structure MUST be the first element of a dispatchable object as the ICD * loader depends on it. For now only contains loader_magic, but over time more common @@ -41,9 +43,15 @@ struct vulkan_client_object UINT64 unix_handle; };
+struct vulkan_instance_extensions +{ +#define USE_VK_EXT(x) unsigned has_ ## x : 1; + ALL_VK_INSTANCE_EXTS +#undef USE_VK_EXT +}; + #ifdef WINE_UNIX_LIB
-#include "wine/vulkan.h" #include "wine/rbtree.h"
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ @@ -261,6 +269,7 @@ struct vulkan_funcs
/* winevulkan specific functions */ const char *(*p_get_host_extension)( const char *name ); + void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); };
/* interface between win32u and the user drivers */ @@ -270,6 +279,7 @@ struct vulkan_driver_funcs VkResult (*p_vulkan_surface_create)(HWND, const struct vulkan_instance *, VkSurfaceKHR *, struct client_surface **); VkBool32 (*p_get_physical_device_presentation_support)(struct vulkan_physical_device *, uint32_t); const char *(*p_get_host_extension)( const char *name ); + void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); };
#endif /* WINE_UNIX_LIB */
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
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 2 +- dlls/winevulkan/vulkan.c | 12 +++--------- include/wine/vulkan_driver.h | 1 - 3 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 77999d0a0b9..3b80debfe83 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1256,7 +1256,7 @@ static VkResult win32u_vkCreateSwapchainKHR( VkDevice client_device, const VkSwa */ if (NtUserGetClientRect( surface->hwnd, &client_rect, NtUserGetWinMonitorDpi( surface->hwnd, MDT_RAW_DPI ) ) && !extents_equals( &create_info_host.imageExtent, &client_rect ) && - physical_device->has_surface_maintenance1 && physical_device->has_swapchain_maintenance1) + instance->extensions.has_VK_EXT_surface_maintenance1 && physical_device->has_swapchain_maintenance1) { scaling.scalingBehavior = VK_PRESENT_SCALING_STRETCH_BIT_EXT; create_info_host.pNext = &scaling; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 9398b3056bd..de51382e411 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -386,8 +386,6 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi have_external_semaphore = TRUE; else if (!strcmp(host_properties[i].extensionName, "VK_EXT_map_memory_placed")) have_memory_placed = TRUE; - else if (!strcmp(host_properties[i].extensionName, "VK_EXT_surface_maintenance1")) - physical_device->has_surface_maintenance1 = true; else if (!strcmp(host_properties[i].extensionName, "VK_EXT_swapchain_maintenance1")) physical_device->has_swapchain_maintenance1 = true; else if (!strcmp(host_properties[i].extensionName, "VK_KHR_map_memory2")) @@ -571,7 +569,6 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device { bool has_swapchain_maintenance1 = false; bool has_external_memory_host = false; - bool has_surface_maintenance1 = false; bool has_map_memory_placed = false; bool has_external_memory = false; bool has_map_memory2 = false; @@ -602,7 +599,6 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device if (!strcmp(*extension, "VK_KHR_external_memory")) has_external_memory = true; if (!strcmp(*extension, "VK_EXT_external_memory_host")) has_external_memory_host = true; if (!strcmp(*extension, "VK_EXT_swapchain_maintenance1")) has_swapchain_maintenance1 = true; - if (!strcmp(*extension, "VK_EXT_surface_maintenance1")) has_surface_maintenance1 = true; if (!strcmp(*extension, "VK_KHR_swapchain")) has_swapchain = true; if (!strcmp(*extension, "VK_KHR_win32_keyed_mutex")) { @@ -653,12 +649,8 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device }
/* win32u uses VkSwapchainPresentScalingCreateInfoEXT if available. */ - if (physical_device->has_surface_maintenance1 && physical_device->has_swapchain_maintenance1 && - has_swapchain && !has_swapchain_maintenance1) - { - if (!has_surface_maintenance1) extensions[count++] = "VK_EXT_surface_maintenance1"; + if (physical_device->has_swapchain_maintenance1 && has_swapchain && !has_swapchain_maintenance1) extensions[count++] = "VK_EXT_swapchain_maintenance1"; - }
TRACE("Enabling %u device extensions\n", count); for (const char **extension = extensions, **end = extension + count; extension < end; extension++) @@ -797,6 +789,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * pthread_rwlock_init(&instance->objects_lock, NULL); }
+ if (instance->obj.extensions.has_VK_KHR_win32_surface && instance_extensions.has_VK_EXT_surface_maintenance1) + instance->obj.extensions.has_VK_EXT_surface_maintenance1 = 1; if (use_external_memory()) { instance->obj.extensions.has_VK_KHR_get_physical_device_properties2 = 1; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 4cc8f304cab..11568c72560 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -116,7 +116,6 @@ struct vulkan_physical_device { VULKAN_OBJECT_HEADER( VkPhysicalDevice, physical_device ); struct vulkan_instance *instance; - bool has_surface_maintenance1; bool has_swapchain_maintenance1;
VkExtensionProperties *extensions;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 27 ++- dlls/winemac.drv/vulkan.c | 5 + dlls/winevulkan/loader.c | 83 ++++++++ dlls/winevulkan/loader_thunks.c | 13 -- dlls/winevulkan/make_vulkan | 30 ++- dlls/winevulkan/vulkan.c | 170 +++------------ dlls/winevulkan/vulkan_thunks.c | 4 +- dlls/winevulkan/vulkan_thunks.h | 1 - dlls/winewayland.drv/vulkan.c | 11 + dlls/winex11.drv/vulkan.c | 11 + include/wine/vulkan.h | 354 ++++++++++++++++++++++++++++++++ include/wine/vulkan_driver.h | 15 +- 12 files changed, 556 insertions(+), 168 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 3b80debfe83..5989a1e103a 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1256,7 +1256,8 @@ static VkResult win32u_vkCreateSwapchainKHR( VkDevice client_device, const VkSwa */ if (NtUserGetClientRect( surface->hwnd, &client_rect, NtUserGetWinMonitorDpi( surface->hwnd, MDT_RAW_DPI ) ) && !extents_equals( &create_info_host.imageExtent, &client_rect ) && - instance->extensions.has_VK_EXT_surface_maintenance1 && physical_device->has_swapchain_maintenance1) + instance->extensions.has_VK_EXT_surface_maintenance1 && + physical_device->extensions.has_VK_KHR_swapchain_maintenance1) { scaling.scalingBehavior = VK_PRESENT_SCALING_STRETCH_BIT_EXT; create_info_host.pNext = &scaling; @@ -2271,6 +2272,11 @@ static void win32u_map_instance_extensions( struct vulkan_instance_extensions *e return driver_funcs->p_map_instance_extensions( extensions ); }
+static void win32u_map_device_extensions( struct vulkan_device_extensions *extensions ) +{ + return driver_funcs->p_map_device_extensions( extensions ); +} + static struct vulkan_funcs vulkan_funcs = { .p_vkAcquireNextImage2KHR = win32u_vkAcquireNextImage2KHR, @@ -2322,6 +2328,7 @@ static struct vulkan_funcs vulkan_funcs = .p_vkUnmapMemory2KHR = win32u_vkUnmapMemory2KHR, .p_get_host_extension = win32u_get_host_extension, .p_map_instance_extensions = win32u_map_instance_extensions, + .p_map_device_extensions = win32u_map_device_extensions, };
static VkResult nulldrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, @@ -2359,12 +2366,23 @@ static void nulldrv_map_instance_extensions( struct vulkan_instance_extensions * if (extensions->has_VK_EXT_headless_surface) extensions->has_VK_KHR_win32_surface = 1; }
+static void nulldrv_map_device_extensions( struct vulkan_device_extensions *extensions ) +{ + if (extensions->has_VK_KHR_external_memory_win32) extensions->has_VK_KHR_external_memory_fd = 1; + if (extensions->has_VK_KHR_external_memory_fd) extensions->has_VK_KHR_external_memory_win32 = 1; + if (extensions->has_VK_KHR_external_semaphore_win32) extensions->has_VK_KHR_external_semaphore_fd = 1; + if (extensions->has_VK_KHR_external_semaphore_fd) extensions->has_VK_KHR_external_semaphore_win32 = 1; + if (extensions->has_VK_KHR_external_fence_win32) extensions->has_VK_KHR_external_fence_fd = 1; + if (extensions->has_VK_KHR_external_fence_fd) extensions->has_VK_KHR_external_fence_win32 = 1; +} + static const struct vulkan_driver_funcs nulldrv_funcs = { .p_vulkan_surface_create = nulldrv_vulkan_surface_create, .p_get_physical_device_presentation_support = nulldrv_get_physical_device_presentation_support, .p_get_host_extension = nulldrv_get_host_extension, .p_map_instance_extensions = nulldrv_map_instance_extensions, + .p_map_device_extensions = nulldrv_map_device_extensions, };
static void vulkan_driver_init(void) @@ -2412,12 +2430,19 @@ static void lazydrv_map_instance_extensions( struct vulkan_instance_extensions * return driver_funcs->p_map_instance_extensions( extensions ); }
+static void lazydrv_map_device_extensions( struct vulkan_device_extensions *extensions ) +{ + vulkan_driver_load(); + return driver_funcs->p_map_device_extensions( extensions ); +} + static const struct vulkan_driver_funcs lazydrv_funcs = { .p_vulkan_surface_create = lazydrv_vulkan_surface_create, .p_get_physical_device_presentation_support = lazydrv_get_physical_device_presentation_support, .p_get_host_extension = lazydrv_get_host_extension, .p_map_instance_extensions = lazydrv_map_instance_extensions, + .p_map_device_extensions = lazydrv_map_device_extensions, };
static void vulkan_init_once(void) diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index bd8aa50f486..382bae8e0a4 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -119,12 +119,17 @@ static void macdrv_map_instance_extensions(struct vulkan_instance_extensions *ex } }
+static void macdrv_map_device_extensions(struct vulkan_device_extensions *extensions) +{ +} + static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs = { .p_vulkan_surface_create = macdrv_vulkan_surface_create, .p_get_physical_device_presentation_support = macdrv_get_physical_device_presentation_support, .p_get_host_extension = macdrv_get_host_extension, .p_map_instance_extensions = macdrv_map_instance_extensions, + .p_map_device_extensions = macdrv_map_device_extensions, };
UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs) diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 7b20a97feb3..5beb9bd1cd0 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -340,6 +340,15 @@ static BOOL is_instance_extension_supported(const char *extension, struct vulkan return FALSE; }
+static BOOL is_device_extension_supported(VkPhysicalDevice physical_device, const char *extension, struct vulkan_device_extensions *extensions) +{ +#define USE_VK_EXT(x) if (!strcmp(extension, #x)) return (extensions->has_ ## x = physical_device->extensions.has_ ## x); + ALL_VK_CLIENT_DEVICE_EXTS +#undef USE_VK_EXT + WARN("Extension %s is not supported.\n", debugstr_a(extension)); + return FALSE; +} + VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *ret) { @@ -467,6 +476,80 @@ VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, return params.result; }
+VkResult WINAPI vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physical_device, const char *layer_name, + uint32_t *count, VkExtensionProperties *properties) +{ + struct vkEnumerateDeviceExtensionProperties_params params; + struct vulkan_device_extensions extensions = {0}; + uint32_t i, j, capacity = *count; + NTSTATUS status; + + TRACE("%p, %p, %p, %p\n", physical_device, layer_name, count, properties); + + if (layer_name) + { + WARN("Layer enumeration not supported from ICD.\n"); + return VK_ERROR_LAYER_NOT_PRESENT; + } + + params.physicalDevice = physical_device; + params.pLayerName = layer_name; + params.pPropertyCount = count; + params.pProperties = properties; + status = UNIX_CALL(vkEnumerateDeviceExtensionProperties, ¶ms); + assert(!status && "vkEnumerateDeviceExtensionProperties"); + if (params.result) return params.result; + + if (!properties) + { + if (physical_device->extensions.has_VK_KHR_external_memory_win32) *count += 1; + if (physical_device->extensions.has_VK_KHR_external_fence_win32) *count += 1; + if (physical_device->extensions.has_VK_KHR_external_semaphore_win32) *count += 1; + if (physical_device->extensions.has_VK_KHR_win32_keyed_mutex) *count += 1; + return params.result; + } + + TRACE("Client physical device extensions:\n"); + for (i = 0, j = 0; i < *count; i++) + { + const char *extension = properties[i].extensionName; + if (!is_device_extension_supported(physical_device, extension, &extensions)) continue; + TRACE(" - %s\n", extension); + properties[j++] = properties[i]; + } + if (physical_device->extensions.has_VK_KHR_external_memory_win32) + { + static const VkExtensionProperties VK_KHR_external_memory_win32 = {VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION}; + if (j == capacity) return VK_INCOMPLETE; + TRACE(" - VK_KHR_external_memory_win32\n"); + properties[j++] = VK_KHR_external_memory_win32; + } + if (physical_device->extensions.has_VK_KHR_external_fence_win32) + { + static const VkExtensionProperties VK_KHR_external_fence_win32 = {VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME, VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION}; + if (j == capacity) return VK_INCOMPLETE; + TRACE(" - VK_KHR_external_fence_win32\n"); + properties[j++] = VK_KHR_external_fence_win32; + } + if (physical_device->extensions.has_VK_KHR_external_semaphore_win32) + { + static const VkExtensionProperties VK_KHR_external_semaphore_win32 = {VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION}; + if (j == capacity) return VK_INCOMPLETE; + TRACE(" - VK_KHR_external_semaphore_win32\n"); + properties[j++] = VK_KHR_external_semaphore_win32; + } + if (physical_device->extensions.has_VK_KHR_win32_keyed_mutex) + { + static const VkExtensionProperties VK_KHR_win32_keyed_mutex = {VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME, VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION}; + if (j == capacity) return VK_INCOMPLETE; + TRACE(" - VK_KHR_win32_keyed_mutex\n"); + properties[j++] = VK_KHR_win32_keyed_mutex; + } + *count = j; + + return params.result; +} + VkResult WINAPI vkEnumerateInstanceVersion(uint32_t *version) { struct vkEnumerateInstanceVersion_params params; diff --git a/dlls/winevulkan/loader_thunks.c b/dlls/winevulkan/loader_thunks.c index 1a210a19b37..e0f15235801 100644 --- a/dlls/winevulkan/loader_thunks.c +++ b/dlls/winevulkan/loader_thunks.c @@ -4256,19 +4256,6 @@ VkResult WINAPI vkEndCommandBuffer(VkCommandBuffer commandBuffer) return params.result; }
-VkResult WINAPI vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) -{ - struct vkEnumerateDeviceExtensionProperties_params params; - NTSTATUS status; - params.physicalDevice = physicalDevice; - params.pLayerName = pLayerName; - params.pPropertyCount = pPropertyCount; - params.pProperties = pProperties; - status = UNIX_CALL(vkEnumerateDeviceExtensionProperties, ¶ms); - assert(!status && "vkEnumerateDeviceExtensionProperties"); - return params.result; -} - VkResult WINAPI vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkLayerProperties *pProperties) { struct vkEnumerateDeviceLayerProperties_params params; diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index a515f3e39f0..647b5364564 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -255,7 +255,6 @@ MANUAL_UNIX_THUNKS = { "vkDestroyDeferredOperationKHR", "vkDestroyDevice", "vkDestroyInstance", - "vkEnumerateDeviceExtensionProperties", "vkEnumerateDeviceLayerProperties", "vkEnumerateInstanceExtensionProperties", "vkEnumerateInstanceLayerProperties", @@ -292,6 +291,7 @@ MANUAL_LOADER_THUNKS = { "vkDestroyCommandPool", "vkDestroyDevice", "vkDestroyInstance", + "vkEnumerateDeviceExtensionProperties", "vkEnumerateInstanceExtensionProperties", "vkEnumerateInstanceVersion", "vkFreeCommandBuffers", @@ -2966,21 +2966,31 @@ class VkGenerator(object): f.write("{0};\n".format(func.prototype(call_conv="VKAPI_CALL"))) f.write("#endif /* VK_NO_PROTOTYPES */\n\n")
- f.write("#define ALL_VK_DEVICE_FUNCS \\n") - first = True + f.write("#define ALL_VK_DEVICE_FUNCS") for vk_func in self.registry.device_funcs: if not vk_func.is_required(): continue - if not vk_func.needs_dispatch(): - LOGGER.debug("skipping {0} in ALL_VK_DEVICE_FUNCS".format(vk_func.name)) continue + f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) + f.write("\n\n")
- if first: - f.write(" USE_VK_FUNC({0})".format(vk_func.name)) - first = False - else: - f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) + f.write("#define ALL_VK_CLIENT_DEVICE_EXTS") + for ext in self.registry.extensions: + if ext["type"] != "device": + continue + if ext["name"] in UNEXPOSED_EXTENSIONS: + continue + f.write(f" \\n USE_VK_EXT({ext["name"]})") + f.write("\n\n") + + f.write("#define ALL_VK_DEVICE_EXTS ALL_VK_CLIENT_DEVICE_EXTS") + for ext in self.registry.extensions: + if ext["type"] != "device": + continue + if ext["name"] not in UNEXPOSED_EXTENSIONS: + continue + f.write(f" \\n USE_VK_EXT({ext["name"]})") f.write("\n\n")
f.write("#define ALL_VK_INSTANCE_FUNCS") diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index de51382e411..2ae96e60a8c 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -319,90 +319,41 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk return VK_FALSE; }
-static void vulkan_physical_device_cleanup(struct vulkan_physical_device *physical_device) -{ - free(physical_device->extensions); -} - static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physical_device, VkPhysicalDevice host_physical_device, VkPhysicalDevice client_physical_device, struct vulkan_instance *instance) { - BOOL have_memory_placed = FALSE, have_map_memory2 = FALSE; - uint32_t num_host_properties, num_properties = 0; - VkExtensionProperties *host_properties = NULL; - BOOL have_external_memory_host = FALSE, have_external_semaphore = FALSE; + struct vulkan_device_extensions extensions = {0}; + VkExtensionProperties *properties; + uint32_t count; VkResult res; - unsigned int i, j;
vulkan_object_init_ptr(&physical_device->obj, (UINT_PTR)host_physical_device, &client_physical_device->obj); physical_device->instance = instance;
instance->p_vkGetPhysicalDeviceMemoryProperties(host_physical_device, &physical_device->memory_properties);
- res = instance->p_vkEnumerateDeviceExtensionProperties(host_physical_device, - NULL, &num_host_properties, NULL); - if (res != VK_SUCCESS) - { - ERR("Failed to enumerate device extensions, res=%d\n", res); - goto err; - } - - host_properties = calloc(num_host_properties, sizeof(*host_properties)); - if (!host_properties) - { - ERR("Failed to allocate memory for device properties!\n"); - goto err; - } - - res = instance->p_vkEnumerateDeviceExtensionProperties(host_physical_device, - NULL, &num_host_properties, host_properties); - if (res != VK_SUCCESS) - { - ERR("Failed to enumerate device extensions, res=%d\n", res); - goto err; - } - - /* Count list of extensions for which we have an implementation. - * TODO: perform translation for platform specific extensions. - */ - for (i = 0; i < num_host_properties; i++) - { - if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32")) - || !strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32")) - || !strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_fence_win32")) - || wine_vk_device_extension_supported(host_properties[i].extensionName)) - { - TRACE("Enabling extension '%s' for physical device %p\n", host_properties[i].extensionName, physical_device); - num_properties++; - } - else - { - TRACE("Skipping extension '%s', no implementation found in winevulkan.\n", host_properties[i].extensionName); - } - if (!strcmp(host_properties[i].extensionName, "VK_EXT_external_memory_host")) - have_external_memory_host = TRUE; - else if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32"))) - have_external_semaphore = TRUE; - else if (!strcmp(host_properties[i].extensionName, "VK_EXT_map_memory_placed")) - have_memory_placed = TRUE; - else if (!strcmp(host_properties[i].extensionName, "VK_EXT_swapchain_maintenance1")) - physical_device->has_swapchain_maintenance1 = true; - else if (!strcmp(host_properties[i].extensionName, "VK_KHR_map_memory2")) - have_map_memory2 = TRUE; - else if (!strcmp(host_properties[i].extensionName, "VK_KHR_timeline_semaphore")) - num_properties++; - } - - TRACE("Host supported extensions %u, Wine supported extensions %u\n", num_host_properties, num_properties); + if ((res = instance->p_vkEnumerateDeviceExtensionProperties(host_physical_device, NULL, &count, NULL))) return res; + if (!(properties = calloc(count, sizeof(*properties)))) return res; + if ((res = instance->p_vkEnumerateDeviceExtensionProperties(host_physical_device, NULL, &count, properties))) goto done;
- if (!(physical_device->extensions = calloc(num_properties, sizeof(*physical_device->extensions)))) + TRACE("Host physical device extensions:\n"); + for (uint32_t i = 0; i < count; i++) { - ERR("Failed to allocate memory for device extensions!\n"); - goto err; + const char *extension = properties[i].extensionName; +#define USE_VK_EXT(x) \ + if (!strcmp(extension, #x)) \ + { \ + extensions.has_ ## x = 1; \ + TRACE(" - %s\n", extension); \ + } else + ALL_VK_DEVICE_EXTS +#undef USE_VK_EXT + WARN("Extension %s is not supported.\n", debugstr_a(extension)); } + physical_device->extensions = extensions;
- if (zero_bits && have_memory_placed && have_map_memory2) + if (zero_bits && physical_device->extensions.has_VK_EXT_map_memory_placed && physical_device->extensions.has_VK_KHR_map_memory2) { VkPhysicalDeviceMapMemoryPlacedFeaturesEXT map_placed_feature = { @@ -433,7 +384,7 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi } }
- if (zero_bits && have_external_memory_host && !physical_device->map_placed_align) + if (zero_bits && physical_device->extensions.has_VK_EXT_external_memory_host && !physical_device->map_placed_align) { VkPhysicalDeviceExternalMemoryHostPropertiesEXT host_mem_props = { @@ -451,47 +402,21 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi physical_device->external_memory_align); }
- for (i = 0, j = 0; i < num_host_properties; i++) + vk_funcs->p_map_device_extensions(&extensions); + if (extensions.has_VK_KHR_external_memory_win32 && zero_bits && !physical_device->map_placed_align) { - if (have_external_semaphore && !strcmp(host_properties[i].extensionName, "VK_KHR_timeline_semaphore")) - { - strcpy(physical_device->extensions[j].extensionName, "VK_KHR_win32_keyed_mutex"); - physical_device->extensions[j++].specVersion = VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION; - } - if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"))) - { - if (zero_bits && !physical_device->map_placed_align) - { - WARN("Cannot export WOW64 memory without VK_EXT_map_memory_placed\n"); - continue; - } - strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_memory_win32"); - physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION; - } - else if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32"))) - { - strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_semaphore_win32"); - physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION; - } - else if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_fence_win32"))) - { - strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_fence_win32"); - physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION; - } - else if (wine_vk_device_extension_supported(host_properties[i].extensionName)) - { - physical_device->extensions[j] = host_properties[i]; - j++; - } + WARN("Cannot export WOW64 memory without VK_EXT_map_memory_placed\n"); + extensions.has_VK_KHR_external_memory_win32 = 0; } - physical_device->extension_count = j; + extensions.has_VK_KHR_win32_keyed_mutex = extensions.has_VK_KHR_timeline_semaphore;
- free(host_properties); - return VK_SUCCESS; + /* filter out unsupported client device extensions */ +#define USE_VK_EXT(x) client_physical_device->extensions.has_ ## x = extensions.has_ ## x; + ALL_VK_CLIENT_DEVICE_EXTS +#undef USE_VK_EXT
-err: - vulkan_physical_device_cleanup(physical_device); - free(host_properties); +done: + free(properties); return res; }
@@ -649,7 +574,7 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device }
/* win32u uses VkSwapchainPresentScalingCreateInfoEXT if available. */ - if (physical_device->has_swapchain_maintenance1 && has_swapchain && !has_swapchain_maintenance1) + if (physical_device->extensions.has_VK_EXT_swapchain_maintenance1 && has_swapchain && !has_swapchain_maintenance1) extensions[count++] = "VK_EXT_swapchain_maintenance1";
TRACE("Enabling %u device extensions\n", count); @@ -865,7 +790,6 @@ static VkResult wine_vk_instance_init_physical_devices(struct vulkan_instance *i return VK_SUCCESS;
err: - while (i) vulkan_physical_device_cleanup(&physical_devices[--i]); free(host_physical_devices); return res; } @@ -1122,10 +1046,7 @@ void wine_vkDestroyInstance(VkInstance client_instance, const VkAllocationCallba
instance->obj.p_vkDestroyInstance(instance->obj.host.instance, NULL /* allocator */); for (i = 0; i < instance->obj.physical_device_count; i++) - { vulkan_instance_remove_object(&instance->obj, &instance->obj.physical_devices[i].obj); - vulkan_physical_device_cleanup(&instance->obj.physical_devices[i]); - } vulkan_instance_remove_object(&instance->obj, &instance->obj.obj);
if (instance->objects.compare) pthread_rwlock_destroy(&instance->objects_lock); @@ -1133,31 +1054,6 @@ void wine_vkDestroyInstance(VkInstance client_instance, const VkAllocationCallba free(instance); }
-VkResult wine_vkEnumerateDeviceExtensionProperties(VkPhysicalDevice client_physical_device, const char *layer_name, - uint32_t *count, VkExtensionProperties *properties) -{ - struct vulkan_physical_device *physical_device = vulkan_physical_device_from_handle(client_physical_device); - - /* 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; - } - - if (!properties) - { - *count = physical_device->extension_count; - return VK_SUCCESS; - } - - *count = min(*count, physical_device->extension_count); - memcpy(properties, physical_device->extensions, *count * sizeof(*properties)); - - TRACE("Returning %u extensions.\n", *count); - return *count < physical_device->extension_count ? VK_INCOMPLETE : VK_SUCCESS; -} - VkResult wine_vkEnumerateInstanceExtensionProperties(const char *name, uint32_t *count, VkExtensionProperties *properties) { diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index a164c0ee833..a3cd56d759a 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -52882,7 +52882,7 @@ static NTSTATUS thunk64_vkEnumerateDeviceExtensionProperties(void *args)
TRACE("%p, %p, %p, %p\n", params->physicalDevice, params->pLayerName, params->pPropertyCount, params->pProperties);
- params->result = wine_vkEnumerateDeviceExtensionProperties(params->physicalDevice, params->pLayerName, params->pPropertyCount, params->pProperties); + params->result = vulkan_physical_device_from_handle(params->physicalDevice)->instance->p_vkEnumerateDeviceExtensionProperties(vulkan_physical_device_from_handle(params->physicalDevice)->host.physical_device, params->pLayerName, params->pPropertyCount, params->pProperties); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -52900,7 +52900,7 @@ static NTSTATUS thunk32_vkEnumerateDeviceExtensionProperties(void *args)
TRACE("%#x, %#x, %#x, %#x\n", params->physicalDevice, params->pLayerName, params->pPropertyCount, params->pProperties);
- params->result = wine_vkEnumerateDeviceExtensionProperties((VkPhysicalDevice)UlongToPtr(params->physicalDevice), (const char *)UlongToPtr(params->pLayerName), (uint32_t *)UlongToPtr(params->pPropertyCount), (VkExtensionProperties *)UlongToPtr(params->pProperties)); + params->result = vulkan_physical_device_from_handle((VkPhysicalDevice)UlongToPtr(params->physicalDevice))->instance->p_vkEnumerateDeviceExtensionProperties(vulkan_physical_device_from_handle((VkPhysicalDevice)UlongToPtr(params->physicalDevice))->host.physical_device, (const char *)UlongToPtr(params->pLayerName), (uint32_t *)UlongToPtr(params->pPropertyCount), (VkExtensionProperties *)UlongToPtr(params->pProperties)); return STATUS_SUCCESS; }
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 6c0c704355d..be4da99db06 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -34,7 +34,6 @@ void wine_vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMesse void wine_vkDestroyDeferredOperationKHR(VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks *pAllocator); void wine_vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator); void wine_vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator); -VkResult wine_vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties); VkResult wine_vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkLayerProperties *pProperties); VkResult wine_vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties); VkResult wine_vkEnumerateInstanceVersion(uint32_t *pApiVersion); diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 4da02ac74b0..3b07ccb24ec 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -95,12 +95,23 @@ static void wayland_map_instance_extensions(struct vulkan_instance_extensions *e if (extensions->has_VK_KHR_wayland_surface) extensions->has_VK_KHR_win32_surface = 1; }
+static void wayland_map_device_extensions(struct vulkan_device_extensions *extensions) +{ + if (extensions->has_VK_KHR_external_memory_win32) extensions->has_VK_KHR_external_memory_fd = 1; + if (extensions->has_VK_KHR_external_memory_fd) extensions->has_VK_KHR_external_memory_win32 = 1; + if (extensions->has_VK_KHR_external_semaphore_win32) extensions->has_VK_KHR_external_semaphore_fd = 1; + if (extensions->has_VK_KHR_external_semaphore_fd) extensions->has_VK_KHR_external_semaphore_win32 = 1; + if (extensions->has_VK_KHR_external_fence_win32) extensions->has_VK_KHR_external_fence_fd = 1; + if (extensions->has_VK_KHR_external_fence_fd) extensions->has_VK_KHR_external_fence_win32 = 1; +} + static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs = { .p_vulkan_surface_create = wayland_vulkan_surface_create, .p_get_physical_device_presentation_support = wayland_get_physical_device_presentation_support, .p_get_host_extension = wayland_get_host_extension, .p_map_instance_extensions = wayland_map_instance_extensions, + .p_map_device_extensions = wayland_map_device_extensions, };
/********************************************************************** diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 56763abf38f..5d6c07b3863 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -92,12 +92,23 @@ static void X11DRV_map_instance_extensions( struct vulkan_instance_extensions *e if (extensions->has_VK_KHR_xlib_surface) extensions->has_VK_KHR_win32_surface = 1; }
+static void X11DRV_map_device_extensions( struct vulkan_device_extensions *extensions ) +{ + if (extensions->has_VK_KHR_external_memory_win32) extensions->has_VK_KHR_external_memory_fd = 1; + if (extensions->has_VK_KHR_external_memory_fd) extensions->has_VK_KHR_external_memory_win32 = 1; + if (extensions->has_VK_KHR_external_semaphore_win32) extensions->has_VK_KHR_external_semaphore_fd = 1; + if (extensions->has_VK_KHR_external_semaphore_fd) extensions->has_VK_KHR_external_semaphore_win32 = 1; + if (extensions->has_VK_KHR_external_fence_win32) extensions->has_VK_KHR_external_fence_fd = 1; + if (extensions->has_VK_KHR_external_fence_fd) extensions->has_VK_KHR_external_fence_win32 = 1; +} + static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs = { .p_vulkan_surface_create = X11DRV_vulkan_surface_create, .p_get_physical_device_presentation_support = X11DRV_get_physical_device_presentation_support, .p_get_host_extension = X11DRV_get_host_extension, .p_map_instance_extensions = X11DRV_map_instance_extensions, + .p_map_device_extensions = X11DRV_map_device_extensions, };
UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs ) diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index cd395ac015b..4ebf1986533 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -20926,6 +20926,360 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr USE_VK_FUNC(vkWriteAccelerationStructuresPropertiesKHR) \ USE_VK_FUNC(vkWriteMicromapsPropertiesEXT)
+#define ALL_VK_CLIENT_DEVICE_EXTS \ + USE_VK_EXT(VK_AMD_anti_lag) \ + USE_VK_EXT(VK_AMD_buffer_marker) \ + USE_VK_EXT(VK_AMD_device_coherent_memory) \ + USE_VK_EXT(VK_AMD_draw_indirect_count) \ + USE_VK_EXT(VK_AMD_gcn_shader) \ + USE_VK_EXT(VK_AMD_gpu_shader_half_float) \ + USE_VK_EXT(VK_AMD_gpu_shader_int16) \ + USE_VK_EXT(VK_AMD_memory_overallocation_behavior) \ + USE_VK_EXT(VK_AMD_mixed_attachment_samples) \ + USE_VK_EXT(VK_AMD_negative_viewport_height) \ + USE_VK_EXT(VK_AMD_pipeline_compiler_control) \ + USE_VK_EXT(VK_AMD_rasterization_order) \ + USE_VK_EXT(VK_AMD_shader_ballot) \ + USE_VK_EXT(VK_AMD_shader_core_properties) \ + USE_VK_EXT(VK_AMD_shader_core_properties2) \ + USE_VK_EXT(VK_AMD_shader_early_and_late_fragment_tests) \ + USE_VK_EXT(VK_AMD_shader_explicit_vertex_parameter) \ + USE_VK_EXT(VK_AMD_shader_fragment_mask) \ + USE_VK_EXT(VK_AMD_shader_image_load_store_lod) \ + USE_VK_EXT(VK_AMD_shader_info) \ + USE_VK_EXT(VK_AMD_shader_trinary_minmax) \ + USE_VK_EXT(VK_AMD_texture_gather_bias_lod) \ + USE_VK_EXT(VK_ARM_data_graph) \ + USE_VK_EXT(VK_ARM_format_pack) \ + USE_VK_EXT(VK_ARM_pipeline_opacity_micromap) \ + USE_VK_EXT(VK_ARM_rasterization_order_attachment_access) \ + USE_VK_EXT(VK_ARM_render_pass_striped) \ + USE_VK_EXT(VK_ARM_scheduling_controls) \ + USE_VK_EXT(VK_ARM_shader_core_builtins) \ + USE_VK_EXT(VK_ARM_shader_core_properties) \ + USE_VK_EXT(VK_ARM_tensors) \ + USE_VK_EXT(VK_EXT_4444_formats) \ + USE_VK_EXT(VK_EXT_astc_decode_mode) \ + USE_VK_EXT(VK_EXT_attachment_feedback_loop_dynamic_state) \ + USE_VK_EXT(VK_EXT_attachment_feedback_loop_layout) \ + USE_VK_EXT(VK_EXT_blend_operation_advanced) \ + USE_VK_EXT(VK_EXT_border_color_swizzle) \ + USE_VK_EXT(VK_EXT_buffer_device_address) \ + USE_VK_EXT(VK_EXT_calibrated_timestamps) \ + USE_VK_EXT(VK_EXT_color_write_enable) \ + USE_VK_EXT(VK_EXT_conditional_rendering) \ + USE_VK_EXT(VK_EXT_conservative_rasterization) \ + USE_VK_EXT(VK_EXT_custom_border_color) \ + USE_VK_EXT(VK_EXT_debug_marker) \ + USE_VK_EXT(VK_EXT_depth_bias_control) \ + USE_VK_EXT(VK_EXT_depth_clamp_control) \ + USE_VK_EXT(VK_EXT_depth_clamp_zero_one) \ + USE_VK_EXT(VK_EXT_depth_clip_control) \ + USE_VK_EXT(VK_EXT_depth_clip_enable) \ + USE_VK_EXT(VK_EXT_depth_range_unrestricted) \ + USE_VK_EXT(VK_EXT_descriptor_buffer) \ + USE_VK_EXT(VK_EXT_descriptor_indexing) \ + USE_VK_EXT(VK_EXT_device_address_binding_report) \ + USE_VK_EXT(VK_EXT_device_fault) \ + USE_VK_EXT(VK_EXT_device_generated_commands) \ + USE_VK_EXT(VK_EXT_discard_rectangles) \ + USE_VK_EXT(VK_EXT_dynamic_rendering_unused_attachments) \ + USE_VK_EXT(VK_EXT_extended_dynamic_state) \ + USE_VK_EXT(VK_EXT_extended_dynamic_state2) \ + USE_VK_EXT(VK_EXT_extended_dynamic_state3) \ + USE_VK_EXT(VK_EXT_external_memory_acquire_unmodified) \ + USE_VK_EXT(VK_EXT_external_memory_host) \ + USE_VK_EXT(VK_EXT_filter_cubic) \ + USE_VK_EXT(VK_EXT_fragment_density_map) \ + USE_VK_EXT(VK_EXT_fragment_density_map2) \ + USE_VK_EXT(VK_EXT_fragment_density_map_offset) \ + USE_VK_EXT(VK_EXT_fragment_shader_interlock) \ + USE_VK_EXT(VK_EXT_frame_boundary) \ + USE_VK_EXT(VK_EXT_global_priority) \ + USE_VK_EXT(VK_EXT_global_priority_query) \ + USE_VK_EXT(VK_EXT_graphics_pipeline_library) \ + USE_VK_EXT(VK_EXT_hdr_metadata) \ + USE_VK_EXT(VK_EXT_host_image_copy) \ + USE_VK_EXT(VK_EXT_host_query_reset) \ + USE_VK_EXT(VK_EXT_image_2d_view_of_3d) \ + USE_VK_EXT(VK_EXT_image_compression_control) \ + USE_VK_EXT(VK_EXT_image_compression_control_swapchain) \ + USE_VK_EXT(VK_EXT_image_robustness) \ + USE_VK_EXT(VK_EXT_image_sliced_view_of_3d) \ + USE_VK_EXT(VK_EXT_image_view_min_lod) \ + USE_VK_EXT(VK_EXT_index_type_uint8) \ + USE_VK_EXT(VK_EXT_inline_uniform_block) \ + USE_VK_EXT(VK_EXT_legacy_dithering) \ + USE_VK_EXT(VK_EXT_legacy_vertex_attributes) \ + USE_VK_EXT(VK_EXT_line_rasterization) \ + USE_VK_EXT(VK_EXT_load_store_op_none) \ + USE_VK_EXT(VK_EXT_memory_budget) \ + USE_VK_EXT(VK_EXT_memory_priority) \ + USE_VK_EXT(VK_EXT_mesh_shader) \ + USE_VK_EXT(VK_EXT_multi_draw) \ + USE_VK_EXT(VK_EXT_multisampled_render_to_single_sampled) \ + USE_VK_EXT(VK_EXT_mutable_descriptor_type) \ + USE_VK_EXT(VK_EXT_nested_command_buffer) \ + USE_VK_EXT(VK_EXT_non_seamless_cube_map) \ + USE_VK_EXT(VK_EXT_opacity_micromap) \ + USE_VK_EXT(VK_EXT_pageable_device_local_memory) \ + USE_VK_EXT(VK_EXT_pci_bus_info) \ + USE_VK_EXT(VK_EXT_pipeline_creation_cache_control) \ + USE_VK_EXT(VK_EXT_pipeline_creation_feedback) \ + USE_VK_EXT(VK_EXT_pipeline_library_group_handles) \ + USE_VK_EXT(VK_EXT_pipeline_properties) \ + USE_VK_EXT(VK_EXT_pipeline_protected_access) \ + USE_VK_EXT(VK_EXT_pipeline_robustness) \ + USE_VK_EXT(VK_EXT_post_depth_coverage) \ + USE_VK_EXT(VK_EXT_present_mode_fifo_latest_ready) \ + USE_VK_EXT(VK_EXT_primitive_topology_list_restart) \ + USE_VK_EXT(VK_EXT_primitives_generated_query) \ + USE_VK_EXT(VK_EXT_private_data) \ + USE_VK_EXT(VK_EXT_provoking_vertex) \ + USE_VK_EXT(VK_EXT_queue_family_foreign) \ + USE_VK_EXT(VK_EXT_rasterization_order_attachment_access) \ + USE_VK_EXT(VK_EXT_rgba10x6_formats) \ + USE_VK_EXT(VK_EXT_robustness2) \ + USE_VK_EXT(VK_EXT_sample_locations) \ + USE_VK_EXT(VK_EXT_sampler_filter_minmax) \ + USE_VK_EXT(VK_EXT_scalar_block_layout) \ + USE_VK_EXT(VK_EXT_separate_stencil_usage) \ + USE_VK_EXT(VK_EXT_shader_atomic_float) \ + USE_VK_EXT(VK_EXT_shader_atomic_float2) \ + USE_VK_EXT(VK_EXT_shader_demote_to_helper_invocation) \ + USE_VK_EXT(VK_EXT_shader_float8) \ + USE_VK_EXT(VK_EXT_shader_image_atomic_int64) \ + USE_VK_EXT(VK_EXT_shader_module_identifier) \ + USE_VK_EXT(VK_EXT_shader_object) \ + USE_VK_EXT(VK_EXT_shader_replicated_composites) \ + USE_VK_EXT(VK_EXT_shader_stencil_export) \ + USE_VK_EXT(VK_EXT_shader_subgroup_ballot) \ + USE_VK_EXT(VK_EXT_shader_subgroup_vote) \ + USE_VK_EXT(VK_EXT_shader_tile_image) \ + USE_VK_EXT(VK_EXT_shader_viewport_index_layer) \ + USE_VK_EXT(VK_EXT_subgroup_size_control) \ + USE_VK_EXT(VK_EXT_subpass_merge_feedback) \ + USE_VK_EXT(VK_EXT_swapchain_maintenance1) \ + USE_VK_EXT(VK_EXT_texel_buffer_alignment) \ + USE_VK_EXT(VK_EXT_texture_compression_astc_hdr) \ + USE_VK_EXT(VK_EXT_tooling_info) \ + USE_VK_EXT(VK_EXT_transform_feedback) \ + USE_VK_EXT(VK_EXT_validation_cache) \ + USE_VK_EXT(VK_EXT_vertex_attribute_divisor) \ + USE_VK_EXT(VK_EXT_vertex_attribute_robustness) \ + USE_VK_EXT(VK_EXT_vertex_input_dynamic_state) \ + USE_VK_EXT(VK_EXT_ycbcr_2plane_444_formats) \ + USE_VK_EXT(VK_EXT_ycbcr_image_arrays) \ + USE_VK_EXT(VK_EXT_zero_initialize_device_memory) \ + USE_VK_EXT(VK_GOOGLE_decorate_string) \ + USE_VK_EXT(VK_GOOGLE_hlsl_functionality1) \ + USE_VK_EXT(VK_GOOGLE_user_type) \ + USE_VK_EXT(VK_HUAWEI_cluster_culling_shader) \ + USE_VK_EXT(VK_HUAWEI_hdr_vivid) \ + USE_VK_EXT(VK_HUAWEI_invocation_mask) \ + USE_VK_EXT(VK_HUAWEI_subpass_shading) \ + USE_VK_EXT(VK_IMG_filter_cubic) \ + USE_VK_EXT(VK_IMG_format_pvrtc) \ + USE_VK_EXT(VK_IMG_relaxed_line_rasterization) \ + USE_VK_EXT(VK_INTEL_performance_query) \ + USE_VK_EXT(VK_INTEL_shader_integer_functions2) \ + USE_VK_EXT(VK_KHR_16bit_storage) \ + USE_VK_EXT(VK_KHR_8bit_storage) \ + USE_VK_EXT(VK_KHR_acceleration_structure) \ + USE_VK_EXT(VK_KHR_bind_memory2) \ + USE_VK_EXT(VK_KHR_buffer_device_address) \ + USE_VK_EXT(VK_KHR_calibrated_timestamps) \ + USE_VK_EXT(VK_KHR_compute_shader_derivatives) \ + USE_VK_EXT(VK_KHR_cooperative_matrix) \ + USE_VK_EXT(VK_KHR_copy_commands2) \ + USE_VK_EXT(VK_KHR_copy_memory_indirect) \ + USE_VK_EXT(VK_KHR_create_renderpass2) \ + USE_VK_EXT(VK_KHR_dedicated_allocation) \ + USE_VK_EXT(VK_KHR_deferred_host_operations) \ + USE_VK_EXT(VK_KHR_depth_clamp_zero_one) \ + USE_VK_EXT(VK_KHR_depth_stencil_resolve) \ + USE_VK_EXT(VK_KHR_descriptor_update_template) \ + USE_VK_EXT(VK_KHR_device_group) \ + USE_VK_EXT(VK_KHR_draw_indirect_count) \ + USE_VK_EXT(VK_KHR_driver_properties) \ + USE_VK_EXT(VK_KHR_dynamic_rendering) \ + USE_VK_EXT(VK_KHR_dynamic_rendering_local_read) \ + USE_VK_EXT(VK_KHR_external_fence) \ + USE_VK_EXT(VK_KHR_external_fence_win32) \ + USE_VK_EXT(VK_KHR_external_memory) \ + USE_VK_EXT(VK_KHR_external_memory_win32) \ + USE_VK_EXT(VK_KHR_external_semaphore) \ + USE_VK_EXT(VK_KHR_external_semaphore_win32) \ + USE_VK_EXT(VK_KHR_format_feature_flags2) \ + USE_VK_EXT(VK_KHR_fragment_shader_barycentric) \ + USE_VK_EXT(VK_KHR_fragment_shading_rate) \ + USE_VK_EXT(VK_KHR_get_memory_requirements2) \ + USE_VK_EXT(VK_KHR_global_priority) \ + USE_VK_EXT(VK_KHR_image_format_list) \ + USE_VK_EXT(VK_KHR_imageless_framebuffer) \ + USE_VK_EXT(VK_KHR_incremental_present) \ + USE_VK_EXT(VK_KHR_index_type_uint8) \ + USE_VK_EXT(VK_KHR_line_rasterization) \ + USE_VK_EXT(VK_KHR_load_store_op_none) \ + USE_VK_EXT(VK_KHR_maintenance1) \ + USE_VK_EXT(VK_KHR_maintenance2) \ + USE_VK_EXT(VK_KHR_maintenance3) \ + USE_VK_EXT(VK_KHR_maintenance4) \ + USE_VK_EXT(VK_KHR_maintenance5) \ + USE_VK_EXT(VK_KHR_maintenance6) \ + USE_VK_EXT(VK_KHR_maintenance8) \ + USE_VK_EXT(VK_KHR_maintenance9) \ + USE_VK_EXT(VK_KHR_map_memory2) \ + USE_VK_EXT(VK_KHR_multiview) \ + USE_VK_EXT(VK_KHR_performance_query) \ + USE_VK_EXT(VK_KHR_pipeline_binary) \ + USE_VK_EXT(VK_KHR_pipeline_executable_properties) \ + USE_VK_EXT(VK_KHR_pipeline_library) \ + USE_VK_EXT(VK_KHR_present_id) \ + USE_VK_EXT(VK_KHR_present_id2) \ + USE_VK_EXT(VK_KHR_present_mode_fifo_latest_ready) \ + USE_VK_EXT(VK_KHR_present_wait) \ + USE_VK_EXT(VK_KHR_present_wait2) \ + USE_VK_EXT(VK_KHR_push_descriptor) \ + USE_VK_EXT(VK_KHR_ray_query) \ + USE_VK_EXT(VK_KHR_ray_tracing_maintenance1) \ + USE_VK_EXT(VK_KHR_ray_tracing_pipeline) \ + USE_VK_EXT(VK_KHR_ray_tracing_position_fetch) \ + USE_VK_EXT(VK_KHR_relaxed_block_layout) \ + USE_VK_EXT(VK_KHR_robustness2) \ + USE_VK_EXT(VK_KHR_sampler_mirror_clamp_to_edge) \ + USE_VK_EXT(VK_KHR_sampler_ycbcr_conversion) \ + USE_VK_EXT(VK_KHR_separate_depth_stencil_layouts) \ + USE_VK_EXT(VK_KHR_shader_atomic_int64) \ + USE_VK_EXT(VK_KHR_shader_bfloat16) \ + USE_VK_EXT(VK_KHR_shader_clock) \ + USE_VK_EXT(VK_KHR_shader_draw_parameters) \ + USE_VK_EXT(VK_KHR_shader_expect_assume) \ + USE_VK_EXT(VK_KHR_shader_float16_int8) \ + USE_VK_EXT(VK_KHR_shader_float_controls) \ + USE_VK_EXT(VK_KHR_shader_float_controls2) \ + USE_VK_EXT(VK_KHR_shader_fma) \ + USE_VK_EXT(VK_KHR_shader_integer_dot_product) \ + USE_VK_EXT(VK_KHR_shader_maximal_reconvergence) \ + USE_VK_EXT(VK_KHR_shader_non_semantic_info) \ + USE_VK_EXT(VK_KHR_shader_quad_control) \ + USE_VK_EXT(VK_KHR_shader_relaxed_extended_instruction) \ + USE_VK_EXT(VK_KHR_shader_subgroup_extended_types) \ + USE_VK_EXT(VK_KHR_shader_subgroup_rotate) \ + USE_VK_EXT(VK_KHR_shader_subgroup_uniform_control_flow) \ + USE_VK_EXT(VK_KHR_shader_terminate_invocation) \ + USE_VK_EXT(VK_KHR_shader_untyped_pointers) \ + USE_VK_EXT(VK_KHR_spirv_1_4) \ + USE_VK_EXT(VK_KHR_storage_buffer_storage_class) \ + USE_VK_EXT(VK_KHR_swapchain) \ + USE_VK_EXT(VK_KHR_swapchain_maintenance1) \ + USE_VK_EXT(VK_KHR_swapchain_mutable_format) \ + USE_VK_EXT(VK_KHR_synchronization2) \ + USE_VK_EXT(VK_KHR_timeline_semaphore) \ + USE_VK_EXT(VK_KHR_unified_image_layouts) \ + USE_VK_EXT(VK_KHR_uniform_buffer_standard_layout) \ + USE_VK_EXT(VK_KHR_variable_pointers) \ + USE_VK_EXT(VK_KHR_vertex_attribute_divisor) \ + USE_VK_EXT(VK_KHR_video_decode_av1) \ + USE_VK_EXT(VK_KHR_video_decode_h264) \ + USE_VK_EXT(VK_KHR_video_decode_queue) \ + USE_VK_EXT(VK_KHR_video_decode_vp9) \ + USE_VK_EXT(VK_KHR_video_encode_av1) \ + USE_VK_EXT(VK_KHR_video_encode_h264) \ + USE_VK_EXT(VK_KHR_video_encode_intra_refresh) \ + USE_VK_EXT(VK_KHR_video_encode_quantization_map) \ + USE_VK_EXT(VK_KHR_video_encode_queue) \ + USE_VK_EXT(VK_KHR_video_maintenance1) \ + USE_VK_EXT(VK_KHR_video_queue) \ + USE_VK_EXT(VK_KHR_vulkan_memory_model) \ + USE_VK_EXT(VK_KHR_win32_keyed_mutex) \ + USE_VK_EXT(VK_KHR_workgroup_memory_explicit_layout) \ + USE_VK_EXT(VK_KHR_zero_initialize_workgroup_memory) \ + USE_VK_EXT(VK_MESA_image_alignment_control) \ + USE_VK_EXT(VK_MSFT_layered_driver) \ + USE_VK_EXT(VK_NVX_binary_import) \ + USE_VK_EXT(VK_NVX_image_view_handle) \ + USE_VK_EXT(VK_NV_clip_space_w_scaling) \ + USE_VK_EXT(VK_NV_cluster_acceleration_structure) \ + USE_VK_EXT(VK_NV_command_buffer_inheritance) \ + USE_VK_EXT(VK_NV_compute_shader_derivatives) \ + USE_VK_EXT(VK_NV_cooperative_matrix) \ + USE_VK_EXT(VK_NV_cooperative_matrix2) \ + USE_VK_EXT(VK_NV_cooperative_vector) \ + USE_VK_EXT(VK_NV_copy_memory_indirect) \ + USE_VK_EXT(VK_NV_corner_sampled_image) \ + USE_VK_EXT(VK_NV_coverage_reduction_mode) \ + USE_VK_EXT(VK_NV_dedicated_allocation) \ + USE_VK_EXT(VK_NV_dedicated_allocation_image_aliasing) \ + USE_VK_EXT(VK_NV_descriptor_pool_overallocation) \ + USE_VK_EXT(VK_NV_device_diagnostic_checkpoints) \ + USE_VK_EXT(VK_NV_device_diagnostics_config) \ + USE_VK_EXT(VK_NV_device_generated_commands) \ + USE_VK_EXT(VK_NV_device_generated_commands_compute) \ + USE_VK_EXT(VK_NV_extended_sparse_address_space) \ + USE_VK_EXT(VK_NV_fill_rectangle) \ + USE_VK_EXT(VK_NV_fragment_coverage_to_color) \ + USE_VK_EXT(VK_NV_fragment_shader_barycentric) \ + USE_VK_EXT(VK_NV_fragment_shading_rate_enums) \ + USE_VK_EXT(VK_NV_framebuffer_mixed_samples) \ + USE_VK_EXT(VK_NV_geometry_shader_passthrough) \ + USE_VK_EXT(VK_NV_glsl_shader) \ + USE_VK_EXT(VK_NV_inherited_viewport_scissor) \ + USE_VK_EXT(VK_NV_linear_color_attachment) \ + USE_VK_EXT(VK_NV_low_latency) \ + USE_VK_EXT(VK_NV_low_latency2) \ + USE_VK_EXT(VK_NV_memory_decompression) \ + USE_VK_EXT(VK_NV_mesh_shader) \ + USE_VK_EXT(VK_NV_optical_flow) \ + USE_VK_EXT(VK_NV_partitioned_acceleration_structure) \ + USE_VK_EXT(VK_NV_per_stage_descriptor_set) \ + USE_VK_EXT(VK_NV_present_barrier) \ + USE_VK_EXT(VK_NV_raw_access_chains) \ + USE_VK_EXT(VK_NV_ray_tracing) \ + USE_VK_EXT(VK_NV_ray_tracing_invocation_reorder) \ + USE_VK_EXT(VK_NV_ray_tracing_linear_swept_spheres) \ + USE_VK_EXT(VK_NV_ray_tracing_motion_blur) \ + USE_VK_EXT(VK_NV_ray_tracing_validation) \ + USE_VK_EXT(VK_NV_representative_fragment_test) \ + USE_VK_EXT(VK_NV_sample_mask_override_coverage) \ + USE_VK_EXT(VK_NV_scissor_exclusive) \ + USE_VK_EXT(VK_NV_shader_atomic_float16_vector) \ + USE_VK_EXT(VK_NV_shader_image_footprint) \ + USE_VK_EXT(VK_NV_shader_sm_builtins) \ + USE_VK_EXT(VK_NV_shader_subgroup_partitioned) \ + USE_VK_EXT(VK_NV_shading_rate_image) \ + USE_VK_EXT(VK_NV_viewport_array2) \ + USE_VK_EXT(VK_NV_viewport_swizzle) \ + USE_VK_EXT(VK_QCOM_filter_cubic_clamp) \ + USE_VK_EXT(VK_QCOM_filter_cubic_weights) \ + USE_VK_EXT(VK_QCOM_fragment_density_map_offset) \ + USE_VK_EXT(VK_QCOM_image_processing) \ + USE_VK_EXT(VK_QCOM_image_processing2) \ + USE_VK_EXT(VK_QCOM_multiview_per_view_render_areas) \ + USE_VK_EXT(VK_QCOM_multiview_per_view_viewports) \ + USE_VK_EXT(VK_QCOM_render_pass_shader_resolve) \ + USE_VK_EXT(VK_QCOM_render_pass_store_ops) \ + USE_VK_EXT(VK_QCOM_render_pass_transform) \ + USE_VK_EXT(VK_QCOM_rotated_copy_commands) \ + USE_VK_EXT(VK_QCOM_tile_memory_heap) \ + USE_VK_EXT(VK_QCOM_tile_properties) \ + USE_VK_EXT(VK_QCOM_tile_shading) \ + USE_VK_EXT(VK_QCOM_ycbcr_degamma) \ + USE_VK_EXT(VK_SEC_pipeline_cache_incremental_mode) \ + USE_VK_EXT(VK_VALVE_descriptor_set_host_mapping) \ + USE_VK_EXT(VK_VALVE_fragment_density_map_layered) \ + USE_VK_EXT(VK_VALVE_mutable_descriptor_type) \ + USE_VK_EXT(VK_VALVE_video_encode_rgb_conversion) + +#define ALL_VK_DEVICE_EXTS ALL_VK_CLIENT_DEVICE_EXTS \ + USE_VK_EXT(VK_EXT_external_memory_dma_buf) \ + USE_VK_EXT(VK_EXT_external_memory_metal) \ + USE_VK_EXT(VK_EXT_image_drm_format_modifier) \ + USE_VK_EXT(VK_EXT_map_memory_placed) \ + USE_VK_EXT(VK_KHR_external_fence_fd) \ + USE_VK_EXT(VK_KHR_external_memory_fd) \ + USE_VK_EXT(VK_KHR_external_semaphore_fd) + #define ALL_VK_INSTANCE_FUNCS \ USE_VK_FUNC(vkCreateDebugReportCallbackEXT) \ USE_VK_FUNC(vkCreateDebugUtilsMessengerEXT) \ diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 11568c72560..8c475ef77a9 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -50,9 +50,17 @@ struct vulkan_instance_extensions #undef USE_VK_EXT };
+struct vulkan_device_extensions +{ +#define USE_VK_EXT(x) unsigned has_ ## x : 1; + ALL_VK_DEVICE_EXTS +#undef USE_VK_EXT +}; + struct VkPhysicalDevice_T { struct vulkan_client_object obj; + struct vulkan_device_extensions extensions; };
struct VkInstance_T @@ -116,10 +124,7 @@ struct vulkan_physical_device { VULKAN_OBJECT_HEADER( VkPhysicalDevice, physical_device ); struct vulkan_instance *instance; - bool has_swapchain_maintenance1; - - VkExtensionProperties *extensions; - uint32_t extension_count; + struct vulkan_device_extensions extensions;
/* for WOW64 memory mapping with VK_EXT_external_memory_host */ VkPhysicalDeviceMemoryProperties memory_properties; @@ -283,6 +288,7 @@ struct vulkan_funcs /* winevulkan specific functions */ const char *(*p_get_host_extension)( const char *name ); void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); + void (*p_map_device_extensions)( struct vulkan_device_extensions *extensions ); };
/* interface between win32u and the user drivers */ @@ -293,6 +299,7 @@ struct vulkan_driver_funcs VkBool32 (*p_get_physical_device_presentation_support)(struct vulkan_physical_device *, uint32_t); const char *(*p_get_host_extension)( const char *name ); void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); + void (*p_map_device_extensions)( struct vulkan_device_extensions *extensions ); };
#endif /* WINE_UNIX_LIB */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 43 +--- dlls/winemac.drv/vulkan.c | 6 - dlls/winevulkan/loader.c | 39 +++- dlls/winevulkan/make_vulkan | 22 -- dlls/winevulkan/vulkan.c | 107 +++------ dlls/winevulkan/vulkan_loader.h | 11 - dlls/winevulkan/vulkan_private.h | 5 - dlls/winevulkan/vulkan_thunks.c | 358 ------------------------------- dlls/winewayland.drv/vulkan.c | 9 - dlls/winex11.drv/vulkan.c | 9 - include/wine/vulkan_driver.h | 16 +- 11 files changed, 91 insertions(+), 534 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 5989a1e103a..f4310089f70 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -234,25 +234,26 @@ static VkResult allocate_external_host_memory( struct vulkan_device *device, VkM
static VkExternalMemoryHandleTypeFlagBits get_host_external_memory_type(void) { - const char *host_extension = driver_funcs->p_get_host_extension( "VK_KHR_external_memory_win32" ); - if (!strcmp( host_extension, "VK_KHR_external_memory_fd" )) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; - if (!strcmp( host_extension, "VK_EXT_external_memory_dma_buf" )) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; + struct vulkan_device_extensions extensions = {.has_VK_KHR_external_memory_win32 = 1}; + driver_funcs->p_map_device_extensions( &extensions ); + if (extensions.has_VK_KHR_external_memory_fd) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; + if (extensions.has_VK_EXT_external_memory_dma_buf) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; return 0; }
static VkExternalSemaphoreHandleTypeFlagBits get_host_external_semaphore_type(void) { - const char *host_extension = driver_funcs->p_get_host_extension( "VK_KHR_external_semaphore_win32" ); - if (!strcmp( host_extension, "VK_KHR_external_semaphore_fd" )) return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; - if (!strcmp( host_extension, "VK_KHR_external_semaphore_capabilities" )) return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT; + struct vulkan_device_extensions extensions = {.has_VK_KHR_external_semaphore_win32 = 1}; + driver_funcs->p_map_device_extensions( &extensions ); + if (extensions.has_VK_KHR_external_semaphore_fd) return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; return 0; }
static VkExternalFenceHandleTypeFlagBits get_host_external_fence_type(void) { - const char *host_extension = driver_funcs->p_get_host_extension( "VK_KHR_external_fence_win32" ); - if (!strcmp( host_extension, "VK_KHR_external_fence_fd" )) return VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT; - if (!strcmp( host_extension, "VK_KHR_external_fence_capabilities" )) return VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT; + struct vulkan_device_extensions extensions = {.has_VK_KHR_external_fence_win32 = 1}; + driver_funcs->p_map_device_extensions( &extensions ); + if (extensions.has_VK_KHR_external_fence_fd) return VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT; return 0; }
@@ -395,7 +396,7 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA break; }
- if (device->has_win32_keyed_mutex && memory->sync) + if (device->client.device->extensions.has_VK_KHR_win32_keyed_mutex && memory->sync) { VkSemaphoreTypeCreateInfo semaphore_type = {.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO}; VkSemaphoreCreateInfo semaphore_create = {.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, .pNext = &semaphore_type}; @@ -2262,11 +2263,6 @@ static void win32u_vkGetPhysicalDeviceExternalFencePropertiesKHR( VkPhysicalDevi get_physical_device_external_fence_properties( physical_device, fence_info, fence_properties, instance->p_vkGetPhysicalDeviceExternalFencePropertiesKHR ); }
-static const char *win32u_get_host_extension( const char *name ) -{ - return driver_funcs->p_get_host_extension( name ); -} - static void win32u_map_instance_extensions( struct vulkan_instance_extensions *extensions ) { return driver_funcs->p_map_instance_extensions( extensions ); @@ -2326,7 +2322,6 @@ static struct vulkan_funcs vulkan_funcs = .p_vkQueueSubmit2KHR = win32u_vkQueueSubmit2KHR, .p_vkUnmapMemory = win32u_vkUnmapMemory, .p_vkUnmapMemory2KHR = win32u_vkUnmapMemory2KHR, - .p_get_host_extension = win32u_get_host_extension, .p_map_instance_extensions = win32u_map_instance_extensions, .p_map_device_extensions = win32u_map_device_extensions, }; @@ -2352,14 +2347,6 @@ static VkBool32 nulldrv_get_physical_device_presentation_support( struct vulkan_ return VK_TRUE; }
-static const char *nulldrv_get_host_extension( const char *name ) -{ - 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"; - return name; -} - static void nulldrv_map_instance_extensions( struct vulkan_instance_extensions *extensions ) { if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_EXT_headless_surface = 1; @@ -2380,7 +2367,6 @@ static const struct vulkan_driver_funcs nulldrv_funcs = { .p_vulkan_surface_create = nulldrv_vulkan_surface_create, .p_get_physical_device_presentation_support = nulldrv_get_physical_device_presentation_support, - .p_get_host_extension = nulldrv_get_host_extension, .p_map_instance_extensions = nulldrv_map_instance_extensions, .p_map_device_extensions = nulldrv_map_device_extensions, }; @@ -2418,12 +2404,6 @@ static VkBool32 lazydrv_get_physical_device_presentation_support( struct vulkan_ return driver_funcs->p_get_physical_device_presentation_support( physical_device, queue ); }
-static const char *lazydrv_get_host_extension( const char *name ) -{ - vulkan_driver_load(); - return driver_funcs->p_get_host_extension( name ); -} - static void lazydrv_map_instance_extensions( struct vulkan_instance_extensions *extensions ) { vulkan_driver_load(); @@ -2440,7 +2420,6 @@ static const struct vulkan_driver_funcs lazydrv_funcs = { .p_vulkan_surface_create = lazydrv_vulkan_surface_create, .p_get_physical_device_presentation_support = lazydrv_get_physical_device_presentation_support, - .p_get_host_extension = lazydrv_get_host_extension, .p_map_instance_extensions = lazydrv_map_instance_extensions, .p_map_device_extensions = lazydrv_map_device_extensions, }; diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 382bae8e0a4..d146a45e351 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -100,11 +100,6 @@ static VkBool32 macdrv_get_physical_device_presentation_support(struct vulkan_ph
static BOOL use_VK_EXT_metal_surface;
-static const char *macdrv_get_host_extension(const char *name) -{ - return name; -} - static void macdrv_map_instance_extensions(struct vulkan_instance_extensions *extensions) { if (use_VK_EXT_metal_surface) @@ -127,7 +122,6 @@ static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs = { .p_vulkan_surface_create = macdrv_vulkan_surface_create, .p_get_physical_device_presentation_support = macdrv_get_physical_device_presentation_support, - .p_get_host_extension = macdrv_get_host_extension, .p_map_instance_extensions = macdrv_map_instance_extensions, .p_map_device_extensions = macdrv_map_device_extensions, }; diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 5beb9bd1cd0..730a2f09647 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -141,6 +141,30 @@ PFN_vkVoidFunction WINAPI vkGetDeviceProcAddr(VkDevice device, const char *name) if (!device || !name) return NULL;
+ if (device->extensions.has_VK_KHR_external_memory_win32) + { + if (!strcmp(name, "vkGetMemoryWin32HandleKHR")) + return (PFN_vkVoidFunction)vkGetMemoryWin32HandleKHR; + if (!strcmp(name, "vkGetMemoryWin32HandlePropertiesKHR")) + return (PFN_vkVoidFunction)vkGetMemoryWin32HandlePropertiesKHR; + } + + if (device->extensions.has_VK_KHR_external_semaphore_win32) + { + if (!strcmp(name, "vkGetSemaphoreWin32HandleKHR")) + return (PFN_vkVoidFunction)vkGetSemaphoreWin32HandleKHR; + if (!strcmp(name, "vkImportSemaphoreWin32HandleKHR")) + return (PFN_vkVoidFunction)vkImportSemaphoreWin32HandleKHR; + } + + if (device->extensions.has_VK_KHR_external_fence_win32) + { + if (!strcmp(name, "vkGetFenceWin32HandleKHR")) + return (PFN_vkVoidFunction)vkGetFenceWin32HandleKHR; + if (!strcmp(name, "vkImportFenceWin32HandleKHR")) + return (PFN_vkVoidFunction)vkImportFenceWin32HandleKHR; + } + /* Per the spec, we are only supposed to return device functions as in functions * for which the first parameter is vkDevice or a child of vkDevice like a * vkCommandBuffer or vkQueue. @@ -569,22 +593,33 @@ VkResult WINAPI vkEnumerateInstanceVersion(uint32_t *version) return params.result; }
-VkResult WINAPI vkCreateDevice(VkPhysicalDevice phys_dev, const VkDeviceCreateInfo *create_info, +VkResult WINAPI vkCreateDevice(VkPhysicalDevice physical_device, const VkDeviceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkDevice *ret) { + struct vulkan_device_extensions extensions = {0}; struct vkCreateDevice_params params; uint32_t queue_count = 0, i; VkDevice device; NTSTATUS status;
+ TRACE("Enabling %u client device extensions\n", create_info->enabledExtensionCount); + for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) + { + const char *extension = create_info->ppEnabledExtensionNames[i]; + if (!is_device_extension_supported(physical_device, extension, &extensions)) + return VK_ERROR_EXTENSION_NOT_PRESENT; + TRACE(" - %s\n", extension); + } + for (i = 0; i < create_info->queueCreateInfoCount; i++) queue_count += create_info->pQueueCreateInfos[i].queueCount; if (!(device = vulkan_client_object_create(FIELD_OFFSET(struct VkDevice_T, queues[queue_count])))) return VK_ERROR_OUT_OF_HOST_MEMORY; for (i = 0; i < queue_count; i++) device->queues[i].obj.loader_magic = VULKAN_ICD_MAGIC_VALUE; + device->extensions = extensions;
- params.physicalDevice = phys_dev; + params.physicalDevice = physical_device; params.pCreateInfo = create_info; params.pAllocator = allocator; params.pDevice = ret; diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 647b5364564..c13c0534665 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2642,28 +2642,6 @@ class VkGenerator(object): f.write(conv_helpers) f.write(thunks)
- # Create array of device extensions. - f.write("static const char * const vk_device_extensions[] =\n{\n") - for ext in self.registry.extensions: - if ext["type"] != "device": - 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") - f.write(" for (i = 0; i < ARRAY_SIZE(vk_device_extensions); i++)\n") - f.write(" {\n") - f.write(" if (strcmp(vk_device_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 2ae96e60a8c..dd13d38de06 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -492,14 +492,9 @@ static void wine_vk_device_init_queues(struct wine_device *object, const VkDevic static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device *physical_device, struct conversion_context *ctx, const VkDeviceCreateInfo *src, VkDeviceCreateInfo *dst, struct wine_device *device) { - bool has_swapchain_maintenance1 = false; - bool has_external_memory_host = false; - bool has_map_memory_placed = false; - bool has_external_memory = false; - bool has_map_memory2 = false; - bool has_swapchain = false; + struct vulkan_instance *instance = physical_device->instance; const char **extensions; - uint32_t count; + uint32_t count = 0;
*dst = *src;
@@ -507,51 +502,17 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device dst->enabledLayerCount = 0; dst->ppEnabledLayerNames = NULL;
- count = src->enabledExtensionCount; - extensions = conversion_context_alloc(ctx, (count + 16) * sizeof(*extensions)); - memcpy(extensions, dst->ppEnabledExtensionNames, count * sizeof(*extensions)); - dst->ppEnabledExtensionNames = extensions; + if (device->obj.extensions.has_VK_KHR_win32_keyed_mutex) + device->obj.extensions.has_VK_KHR_timeline_semaphore = 1;
- for (const char **extension = extensions, **end = extension + count; extension < end; extension++) - { - if (!wine_vk_device_extension_supported(*extension)) - { - WARN("Extension %s is not supported.\n", debugstr_a(*extension)); - return VK_ERROR_EXTENSION_NOT_PRESENT; - } - if (!strcmp(*extension, "VK_EXT_map_memory_placed")) has_map_memory_placed = true; - if (!strcmp(*extension, "VK_KHR_map_memory2")) has_map_memory2 = true; - if (!strcmp(*extension, "VK_KHR_external_memory")) has_external_memory = true; - if (!strcmp(*extension, "VK_EXT_external_memory_host")) has_external_memory_host = true; - if (!strcmp(*extension, "VK_EXT_swapchain_maintenance1")) has_swapchain_maintenance1 = true; - if (!strcmp(*extension, "VK_KHR_swapchain")) has_swapchain = true; - if (!strcmp(*extension, "VK_KHR_win32_keyed_mutex")) - { - device->obj.has_win32_keyed_mutex = true; - *extension = "VK_KHR_timeline_semaphore"; - } - if (!strcmp(*extension, "VK_KHR_external_memory_win32")) - { - if (zero_bits && !physical_device->map_placed_align) - { - FIXME("Cannot export WOW64 memory without VK_EXT_map_memory_placed\n"); - return VK_ERROR_EXTENSION_NOT_PRESENT; - } - device->has_external_memory_win32 = true; - *extension = vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"); - if (!strcmp(*extension, "VK_EXT_external_memory_dma_buf")) extensions[count++] = "VK_KHR_external_memory_fd"; - } - if (!strcmp(*extension, "VK_KHR_external_semaphore_win32")) - { - device->has_external_semaphore_win32 = true; - *extension = vk_funcs->p_get_host_extension("VK_KHR_external_semaphore_win32"); - } - if (!strcmp(*extension, "VK_KHR_external_fence_win32")) - { - device->has_external_fence_win32 = true; - *extension = vk_funcs->p_get_host_extension("VK_KHR_external_fence_win32"); - } - } + vk_funcs->p_map_device_extensions(&device->obj.extensions); + device->obj.extensions.has_VK_KHR_win32_keyed_mutex = 0; + device->obj.extensions.has_VK_KHR_external_memory_win32 = 0; + device->obj.extensions.has_VK_KHR_external_fence_win32 = 0; + device->obj.extensions.has_VK_KHR_external_semaphore_win32 = 0; + + if (device->obj.extensions.has_VK_EXT_external_memory_dma_buf) + device->obj.extensions.has_VK_KHR_external_memory_fd = 1;
if (physical_device->map_placed_align) { @@ -564,23 +525,30 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device map_placed_features->memoryUnmapReserve = VK_TRUE; dst->pNext = map_placed_features;
- if (!has_map_memory_placed) extensions[count++] = "VK_EXT_map_memory_placed"; - if (!has_map_memory2) extensions[count++] = "VK_KHR_map_memory2"; + device->obj.extensions.has_VK_EXT_map_memory_placed = 1; + device->obj.extensions.has_VK_KHR_map_memory2 = 1; } else if (physical_device->external_memory_align) { - if (!has_external_memory) extensions[count++] = "VK_KHR_external_memory"; - if (!has_external_memory_host) extensions[count++] = "VK_EXT_external_memory_host"; + device->obj.extensions.has_VK_KHR_external_memory = 1; + device->obj.extensions.has_VK_EXT_external_memory_host = 1; }
/* win32u uses VkSwapchainPresentScalingCreateInfoEXT if available. */ - if (physical_device->extensions.has_VK_EXT_swapchain_maintenance1 && has_swapchain && !has_swapchain_maintenance1) - extensions[count++] = "VK_EXT_swapchain_maintenance1"; + if (device->obj.extensions.has_VK_KHR_swapchain && instance->extensions.has_VK_EXT_surface_maintenance1 && + physical_device->extensions.has_VK_EXT_swapchain_maintenance1) + device->obj.extensions.has_VK_EXT_swapchain_maintenance1 = 1; + + extensions = conversion_context_alloc(ctx, sizeof(device->obj.extensions) * 8 * sizeof(*extensions)); +#define USE_VK_EXT(x) if (device->obj.extensions.has_ ## x) extensions[count++] = #x; + ALL_VK_DEVICE_EXTS +#undef USE_VK_EXT
- TRACE("Enabling %u device extensions\n", count); + TRACE("Enabling %u host device 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; } @@ -708,6 +676,9 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * return VK_ERROR_LAYER_NOT_PRESENT; }
+ vk_funcs->p_map_instance_extensions(&instance->obj.extensions); + instance->obj.extensions.has_VK_KHR_win32_surface = 0; + if (instance->obj.extensions.has_VK_EXT_debug_utils || instance->obj.extensions.has_VK_EXT_debug_report) { rb_init(&instance->objects, vulkan_object_compare); @@ -722,9 +693,6 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * instance->obj.extensions.has_VK_KHR_external_memory_capabilities = 1; }
- 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 @@ -896,6 +864,7 @@ VkResult wine_vkCreateDevice(VkPhysicalDevice client_physical_device, const VkDe
if (!(device = calloc(1, offsetof(struct wine_device, queues[queue_count])))) return VK_ERROR_OUT_OF_HOST_MEMORY; + device->obj.extensions = client_device->extensions;
init_conversion_context(&ctx); res = wine_vk_device_convert_create_info(physical_device, &ctx, create_info, &create_info_host, device); @@ -1662,22 +1631,6 @@ static NTSTATUS is_available_instance_function(VkInstance handle, const char *na static NTSTATUS is_available_device_function(VkDevice handle, const char *name) { struct wine_device *device = wine_device_from_handle(handle); - - if (!strcmp(name, "vkGetMemoryWin32HandleKHR")) - return device->has_external_memory_win32; - if (!strcmp(name, "vkGetMemoryWin32HandlePropertiesKHR")) - return device->has_external_memory_win32; - - if (!strcmp(name, "vkGetSemaphoreWin32HandleKHR")) - return device->has_external_semaphore_win32; - if (!strcmp(name, "vkImportSemaphoreWin32HandleKHR")) - return device->has_external_semaphore_win32; - - if (!strcmp(name, "vkGetFenceWin32HandleKHR")) - return device->has_external_fence_win32; - if (!strcmp(name, "vkImportFenceWin32HandleKHR")) - return device->has_external_fence_win32; - return !!vk_funcs->p_vkGetDeviceProcAddr(device->obj.host.device, name); }
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 9bfc0d87a42..e60467d0658 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -40,17 +40,6 @@ /* Magic value defined by Vulkan ICD / Loader spec */ #define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
-struct VkQueue_T -{ - struct vulkan_client_object obj; -}; - -struct VkDevice_T -{ - struct vulkan_client_object obj; - struct VkQueue_T queues[1]; -}; - struct vk_command_pool { struct vulkan_client_object obj; diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index a9ddb6dd67d..ad42681af97 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -41,9 +41,6 @@ struct wine_queue struct wine_device { struct vulkan_device obj; - bool has_external_memory_win32; - bool has_external_semaphore_win32; - bool has_external_fence_win32; uint64_t queue_count; struct wine_queue queues[]; }; @@ -108,8 +105,6 @@ static inline struct wine_debug_report_callback *wine_debug_report_callback_from return (struct wine_debug_report_callback *)(uintptr_t)handle; }
-BOOL wine_vk_device_extension_supported(const char *name); - BOOL wine_vk_is_type_wrapped(VkObjectType type);
NTSTATUS init_vulkan(void *args); diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index a3cd56d759a..99827f2e7ac 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -61023,364 +61023,6 @@ static NTSTATUS thunk32_vkWriteMicromapsPropertiesEXT(void *args) return STATUS_SUCCESS; }
-static const char * const vk_device_extensions[] = -{ - "VK_AMD_anti_lag", - "VK_AMD_buffer_marker", - "VK_AMD_device_coherent_memory", - "VK_AMD_draw_indirect_count", - "VK_AMD_gcn_shader", - "VK_AMD_gpu_shader_half_float", - "VK_AMD_gpu_shader_int16", - "VK_AMD_memory_overallocation_behavior", - "VK_AMD_mixed_attachment_samples", - "VK_AMD_negative_viewport_height", - "VK_AMD_pipeline_compiler_control", - "VK_AMD_rasterization_order", - "VK_AMD_shader_ballot", - "VK_AMD_shader_core_properties", - "VK_AMD_shader_core_properties2", - "VK_AMD_shader_early_and_late_fragment_tests", - "VK_AMD_shader_explicit_vertex_parameter", - "VK_AMD_shader_fragment_mask", - "VK_AMD_shader_image_load_store_lod", - "VK_AMD_shader_info", - "VK_AMD_shader_trinary_minmax", - "VK_AMD_texture_gather_bias_lod", - "VK_ARM_data_graph", - "VK_ARM_format_pack", - "VK_ARM_pipeline_opacity_micromap", - "VK_ARM_rasterization_order_attachment_access", - "VK_ARM_render_pass_striped", - "VK_ARM_scheduling_controls", - "VK_ARM_shader_core_builtins", - "VK_ARM_shader_core_properties", - "VK_ARM_tensors", - "VK_EXT_4444_formats", - "VK_EXT_astc_decode_mode", - "VK_EXT_attachment_feedback_loop_dynamic_state", - "VK_EXT_attachment_feedback_loop_layout", - "VK_EXT_blend_operation_advanced", - "VK_EXT_border_color_swizzle", - "VK_EXT_buffer_device_address", - "VK_EXT_calibrated_timestamps", - "VK_EXT_color_write_enable", - "VK_EXT_conditional_rendering", - "VK_EXT_conservative_rasterization", - "VK_EXT_custom_border_color", - "VK_EXT_debug_marker", - "VK_EXT_depth_bias_control", - "VK_EXT_depth_clamp_control", - "VK_EXT_depth_clamp_zero_one", - "VK_EXT_depth_clip_control", - "VK_EXT_depth_clip_enable", - "VK_EXT_depth_range_unrestricted", - "VK_EXT_descriptor_buffer", - "VK_EXT_descriptor_indexing", - "VK_EXT_device_address_binding_report", - "VK_EXT_device_fault", - "VK_EXT_device_generated_commands", - "VK_EXT_discard_rectangles", - "VK_EXT_dynamic_rendering_unused_attachments", - "VK_EXT_extended_dynamic_state", - "VK_EXT_extended_dynamic_state2", - "VK_EXT_extended_dynamic_state3", - "VK_EXT_external_memory_acquire_unmodified", - "VK_EXT_external_memory_host", - "VK_EXT_filter_cubic", - "VK_EXT_fragment_density_map", - "VK_EXT_fragment_density_map2", - "VK_EXT_fragment_density_map_offset", - "VK_EXT_fragment_shader_interlock", - "VK_EXT_frame_boundary", - "VK_EXT_global_priority", - "VK_EXT_global_priority_query", - "VK_EXT_graphics_pipeline_library", - "VK_EXT_hdr_metadata", - "VK_EXT_host_image_copy", - "VK_EXT_host_query_reset", - "VK_EXT_image_2d_view_of_3d", - "VK_EXT_image_compression_control", - "VK_EXT_image_compression_control_swapchain", - "VK_EXT_image_robustness", - "VK_EXT_image_sliced_view_of_3d", - "VK_EXT_image_view_min_lod", - "VK_EXT_index_type_uint8", - "VK_EXT_inline_uniform_block", - "VK_EXT_legacy_dithering", - "VK_EXT_legacy_vertex_attributes", - "VK_EXT_line_rasterization", - "VK_EXT_load_store_op_none", - "VK_EXT_memory_budget", - "VK_EXT_memory_priority", - "VK_EXT_mesh_shader", - "VK_EXT_multi_draw", - "VK_EXT_multisampled_render_to_single_sampled", - "VK_EXT_mutable_descriptor_type", - "VK_EXT_nested_command_buffer", - "VK_EXT_non_seamless_cube_map", - "VK_EXT_opacity_micromap", - "VK_EXT_pageable_device_local_memory", - "VK_EXT_pci_bus_info", - "VK_EXT_pipeline_creation_cache_control", - "VK_EXT_pipeline_creation_feedback", - "VK_EXT_pipeline_library_group_handles", - "VK_EXT_pipeline_properties", - "VK_EXT_pipeline_protected_access", - "VK_EXT_pipeline_robustness", - "VK_EXT_post_depth_coverage", - "VK_EXT_present_mode_fifo_latest_ready", - "VK_EXT_primitive_topology_list_restart", - "VK_EXT_primitives_generated_query", - "VK_EXT_private_data", - "VK_EXT_provoking_vertex", - "VK_EXT_queue_family_foreign", - "VK_EXT_rasterization_order_attachment_access", - "VK_EXT_rgba10x6_formats", - "VK_EXT_robustness2", - "VK_EXT_sample_locations", - "VK_EXT_sampler_filter_minmax", - "VK_EXT_scalar_block_layout", - "VK_EXT_separate_stencil_usage", - "VK_EXT_shader_atomic_float", - "VK_EXT_shader_atomic_float2", - "VK_EXT_shader_demote_to_helper_invocation", - "VK_EXT_shader_float8", - "VK_EXT_shader_image_atomic_int64", - "VK_EXT_shader_module_identifier", - "VK_EXT_shader_object", - "VK_EXT_shader_replicated_composites", - "VK_EXT_shader_stencil_export", - "VK_EXT_shader_subgroup_ballot", - "VK_EXT_shader_subgroup_vote", - "VK_EXT_shader_tile_image", - "VK_EXT_shader_viewport_index_layer", - "VK_EXT_subgroup_size_control", - "VK_EXT_subpass_merge_feedback", - "VK_EXT_swapchain_maintenance1", - "VK_EXT_texel_buffer_alignment", - "VK_EXT_texture_compression_astc_hdr", - "VK_EXT_tooling_info", - "VK_EXT_transform_feedback", - "VK_EXT_validation_cache", - "VK_EXT_vertex_attribute_divisor", - "VK_EXT_vertex_attribute_robustness", - "VK_EXT_vertex_input_dynamic_state", - "VK_EXT_ycbcr_2plane_444_formats", - "VK_EXT_ycbcr_image_arrays", - "VK_EXT_zero_initialize_device_memory", - "VK_GOOGLE_decorate_string", - "VK_GOOGLE_hlsl_functionality1", - "VK_GOOGLE_user_type", - "VK_HUAWEI_cluster_culling_shader", - "VK_HUAWEI_hdr_vivid", - "VK_HUAWEI_invocation_mask", - "VK_HUAWEI_subpass_shading", - "VK_IMG_filter_cubic", - "VK_IMG_format_pvrtc", - "VK_IMG_relaxed_line_rasterization", - "VK_INTEL_performance_query", - "VK_INTEL_shader_integer_functions2", - "VK_KHR_16bit_storage", - "VK_KHR_8bit_storage", - "VK_KHR_acceleration_structure", - "VK_KHR_bind_memory2", - "VK_KHR_buffer_device_address", - "VK_KHR_calibrated_timestamps", - "VK_KHR_compute_shader_derivatives", - "VK_KHR_cooperative_matrix", - "VK_KHR_copy_commands2", - "VK_KHR_copy_memory_indirect", - "VK_KHR_create_renderpass2", - "VK_KHR_dedicated_allocation", - "VK_KHR_deferred_host_operations", - "VK_KHR_depth_clamp_zero_one", - "VK_KHR_depth_stencil_resolve", - "VK_KHR_descriptor_update_template", - "VK_KHR_device_group", - "VK_KHR_draw_indirect_count", - "VK_KHR_driver_properties", - "VK_KHR_dynamic_rendering", - "VK_KHR_dynamic_rendering_local_read", - "VK_KHR_external_fence", - "VK_KHR_external_fence_win32", - "VK_KHR_external_memory", - "VK_KHR_external_memory_win32", - "VK_KHR_external_semaphore", - "VK_KHR_external_semaphore_win32", - "VK_KHR_format_feature_flags2", - "VK_KHR_fragment_shader_barycentric", - "VK_KHR_fragment_shading_rate", - "VK_KHR_get_memory_requirements2", - "VK_KHR_global_priority", - "VK_KHR_image_format_list", - "VK_KHR_imageless_framebuffer", - "VK_KHR_incremental_present", - "VK_KHR_index_type_uint8", - "VK_KHR_line_rasterization", - "VK_KHR_load_store_op_none", - "VK_KHR_maintenance1", - "VK_KHR_maintenance2", - "VK_KHR_maintenance3", - "VK_KHR_maintenance4", - "VK_KHR_maintenance5", - "VK_KHR_maintenance6", - "VK_KHR_maintenance8", - "VK_KHR_maintenance9", - "VK_KHR_map_memory2", - "VK_KHR_multiview", - "VK_KHR_performance_query", - "VK_KHR_pipeline_binary", - "VK_KHR_pipeline_executable_properties", - "VK_KHR_pipeline_library", - "VK_KHR_present_id", - "VK_KHR_present_id2", - "VK_KHR_present_mode_fifo_latest_ready", - "VK_KHR_present_wait", - "VK_KHR_present_wait2", - "VK_KHR_push_descriptor", - "VK_KHR_ray_query", - "VK_KHR_ray_tracing_maintenance1", - "VK_KHR_ray_tracing_pipeline", - "VK_KHR_ray_tracing_position_fetch", - "VK_KHR_relaxed_block_layout", - "VK_KHR_robustness2", - "VK_KHR_sampler_mirror_clamp_to_edge", - "VK_KHR_sampler_ycbcr_conversion", - "VK_KHR_separate_depth_stencil_layouts", - "VK_KHR_shader_atomic_int64", - "VK_KHR_shader_bfloat16", - "VK_KHR_shader_clock", - "VK_KHR_shader_draw_parameters", - "VK_KHR_shader_expect_assume", - "VK_KHR_shader_float16_int8", - "VK_KHR_shader_float_controls", - "VK_KHR_shader_float_controls2", - "VK_KHR_shader_fma", - "VK_KHR_shader_integer_dot_product", - "VK_KHR_shader_maximal_reconvergence", - "VK_KHR_shader_non_semantic_info", - "VK_KHR_shader_quad_control", - "VK_KHR_shader_relaxed_extended_instruction", - "VK_KHR_shader_subgroup_extended_types", - "VK_KHR_shader_subgroup_rotate", - "VK_KHR_shader_subgroup_uniform_control_flow", - "VK_KHR_shader_terminate_invocation", - "VK_KHR_shader_untyped_pointers", - "VK_KHR_spirv_1_4", - "VK_KHR_storage_buffer_storage_class", - "VK_KHR_swapchain", - "VK_KHR_swapchain_maintenance1", - "VK_KHR_swapchain_mutable_format", - "VK_KHR_synchronization2", - "VK_KHR_timeline_semaphore", - "VK_KHR_unified_image_layouts", - "VK_KHR_uniform_buffer_standard_layout", - "VK_KHR_variable_pointers", - "VK_KHR_vertex_attribute_divisor", - "VK_KHR_video_decode_av1", - "VK_KHR_video_decode_h264", - "VK_KHR_video_decode_queue", - "VK_KHR_video_decode_vp9", - "VK_KHR_video_encode_av1", - "VK_KHR_video_encode_h264", - "VK_KHR_video_encode_intra_refresh", - "VK_KHR_video_encode_quantization_map", - "VK_KHR_video_encode_queue", - "VK_KHR_video_maintenance1", - "VK_KHR_video_queue", - "VK_KHR_vulkan_memory_model", - "VK_KHR_win32_keyed_mutex", - "VK_KHR_workgroup_memory_explicit_layout", - "VK_KHR_zero_initialize_workgroup_memory", - "VK_MESA_image_alignment_control", - "VK_MSFT_layered_driver", - "VK_NVX_binary_import", - "VK_NVX_image_view_handle", - "VK_NV_clip_space_w_scaling", - "VK_NV_cluster_acceleration_structure", - "VK_NV_command_buffer_inheritance", - "VK_NV_compute_shader_derivatives", - "VK_NV_cooperative_matrix", - "VK_NV_cooperative_matrix2", - "VK_NV_cooperative_vector", - "VK_NV_copy_memory_indirect", - "VK_NV_corner_sampled_image", - "VK_NV_coverage_reduction_mode", - "VK_NV_dedicated_allocation", - "VK_NV_dedicated_allocation_image_aliasing", - "VK_NV_descriptor_pool_overallocation", - "VK_NV_device_diagnostic_checkpoints", - "VK_NV_device_diagnostics_config", - "VK_NV_device_generated_commands", - "VK_NV_device_generated_commands_compute", - "VK_NV_extended_sparse_address_space", - "VK_NV_fill_rectangle", - "VK_NV_fragment_coverage_to_color", - "VK_NV_fragment_shader_barycentric", - "VK_NV_fragment_shading_rate_enums", - "VK_NV_framebuffer_mixed_samples", - "VK_NV_geometry_shader_passthrough", - "VK_NV_glsl_shader", - "VK_NV_inherited_viewport_scissor", - "VK_NV_linear_color_attachment", - "VK_NV_low_latency", - "VK_NV_low_latency2", - "VK_NV_memory_decompression", - "VK_NV_mesh_shader", - "VK_NV_optical_flow", - "VK_NV_partitioned_acceleration_structure", - "VK_NV_per_stage_descriptor_set", - "VK_NV_present_barrier", - "VK_NV_raw_access_chains", - "VK_NV_ray_tracing", - "VK_NV_ray_tracing_invocation_reorder", - "VK_NV_ray_tracing_linear_swept_spheres", - "VK_NV_ray_tracing_motion_blur", - "VK_NV_ray_tracing_validation", - "VK_NV_representative_fragment_test", - "VK_NV_sample_mask_override_coverage", - "VK_NV_scissor_exclusive", - "VK_NV_shader_atomic_float16_vector", - "VK_NV_shader_image_footprint", - "VK_NV_shader_sm_builtins", - "VK_NV_shader_subgroup_partitioned", - "VK_NV_shading_rate_image", - "VK_NV_viewport_array2", - "VK_NV_viewport_swizzle", - "VK_QCOM_filter_cubic_clamp", - "VK_QCOM_filter_cubic_weights", - "VK_QCOM_fragment_density_map_offset", - "VK_QCOM_image_processing", - "VK_QCOM_image_processing2", - "VK_QCOM_multiview_per_view_render_areas", - "VK_QCOM_multiview_per_view_viewports", - "VK_QCOM_render_pass_shader_resolve", - "VK_QCOM_render_pass_store_ops", - "VK_QCOM_render_pass_transform", - "VK_QCOM_rotated_copy_commands", - "VK_QCOM_tile_memory_heap", - "VK_QCOM_tile_properties", - "VK_QCOM_tile_shading", - "VK_QCOM_ycbcr_degamma", - "VK_SEC_pipeline_cache_incremental_mode", - "VK_VALVE_descriptor_set_host_mapping", - "VK_VALVE_fragment_density_map_layered", - "VK_VALVE_mutable_descriptor_type", - "VK_VALVE_video_encode_rgb_conversion", -}; - -BOOL wine_vk_device_extension_supported(const char *name) -{ - unsigned int i; - for (i = 0; i < ARRAY_SIZE(vk_device_extensions); i++) - { - if (strcmp(vk_device_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 3b07ccb24ec..f8fd372757d 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -81,14 +81,6 @@ static VkBool32 wayland_get_physical_device_presentation_support(struct vulkan_p process_wayland.wl_display); }
-static const char *wayland_get_host_extension(const char *name) -{ - 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"; - return name; -} - static void wayland_map_instance_extensions(struct vulkan_instance_extensions *extensions) { if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_KHR_wayland_surface = 1; @@ -109,7 +101,6 @@ static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs = { .p_vulkan_surface_create = wayland_vulkan_surface_create, .p_get_physical_device_presentation_support = wayland_get_physical_device_presentation_support, - .p_get_host_extension = wayland_get_host_extension, .p_map_instance_extensions = wayland_map_instance_extensions, .p_map_device_extensions = wayland_map_device_extensions, }; diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 5d6c07b3863..421971178a7 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -78,14 +78,6 @@ static VkBool32 X11DRV_get_physical_device_presentation_support( struct vulkan_p default_visual.visual->visualid ); }
-static const char *X11DRV_get_host_extension( const char *name ) -{ - 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"; - return name; -} - static void X11DRV_map_instance_extensions( struct vulkan_instance_extensions *extensions ) { if (extensions->has_VK_KHR_win32_surface) extensions->has_VK_KHR_xlib_surface = 1; @@ -106,7 +98,6 @@ static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs = { .p_vulkan_surface_create = X11DRV_vulkan_surface_create, .p_get_physical_device_presentation_support = X11DRV_get_physical_device_presentation_support, - .p_get_host_extension = X11DRV_get_host_extension, .p_map_instance_extensions = X11DRV_map_instance_extensions, .p_map_device_extensions = X11DRV_map_device_extensions, }; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 8c475ef77a9..fd1d0ec64c4 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -71,6 +71,18 @@ struct VkInstance_T struct VkPhysicalDevice_T phys_devs[1]; };
+struct VkQueue_T +{ + struct vulkan_client_object obj; +}; + +struct VkDevice_T +{ + struct vulkan_client_object obj; + struct vulkan_device_extensions extensions; + struct VkQueue_T queues[1]; +}; + #ifdef WINE_UNIX_LIB
#include "wine/rbtree.h" @@ -142,7 +154,7 @@ struct vulkan_device { VULKAN_OBJECT_HEADER( VkDevice, device ); struct vulkan_physical_device *physical_device; - bool has_win32_keyed_mutex; + struct vulkan_device_extensions extensions; #define USE_VK_FUNC(x) PFN_ ## x p_ ## x; ALL_VK_DEVICE_FUNCS #undef USE_VK_FUNC @@ -286,7 +298,6 @@ struct vulkan_funcs PFN_vkUnmapMemory2KHR p_vkUnmapMemory2KHR;
/* winevulkan specific functions */ - const char *(*p_get_host_extension)( const char *name ); void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); void (*p_map_device_extensions)( struct vulkan_device_extensions *extensions ); }; @@ -297,7 +308,6 @@ struct vulkan_driver_funcs { VkResult (*p_vulkan_surface_create)(HWND, const struct vulkan_instance *, VkSurfaceKHR *, struct client_surface **); VkBool32 (*p_get_physical_device_presentation_support)(struct vulkan_physical_device *, uint32_t); - const char *(*p_get_host_extension)( const char *name ); void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); void (*p_map_device_extensions)( struct vulkan_device_extensions *extensions ); };