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