From a875c18552743243dadf6c60cf79d69ddef2974a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Wed, 27 Mar 2024 08:46:29 +0100 Subject: [PATCH] winevulkan: Remove now unnecessary vkCreateInstance driver entry. --- dlls/win32u/d3dkmt.c | 4 +- dlls/win32u/vulkan.c | 2 - dlls/winemac.drv/vulkan.c | 78 ----------------------------------- dlls/winevulkan/make_vulkan | 1 - dlls/winevulkan/vulkan.c | 4 +- dlls/winewayland.drv/vulkan.c | 74 --------------------------------- dlls/winex11.drv/vulkan.c | 78 ----------------------------------- dlls/winex11.drv/xrandr.c | 17 ++++---- include/wine/vulkan_driver.h | 3 +- 9 files changed, 17 insertions(+), 244 deletions(-) diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 3b6a3933bb2..795480c9968 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -78,6 +78,7 @@ static void d3dkmt_init_vulkan(void) .enabledExtensionCount = ARRAY_SIZE( extensions ), .ppEnabledExtensionNames = extensions, }; + PFN_vkCreateInstance p_vkCreateInstance; VkResult vr; if (!(vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) @@ -86,7 +87,8 @@ static void d3dkmt_init_vulkan(void) return; } - if ((vr = vulkan_funcs->p_vkCreateInstance( &create_info, NULL, &d3dkmt_vk_instance ))) + p_vkCreateInstance = vulkan_funcs->p_vkGetInstanceProcAddr( NULL, "vkCreateInstance" ); + if ((vr = p_vkCreateInstance( &create_info, NULL, &d3dkmt_vk_instance ))) { WARN( "Failed to create a Vulkan instance, vr %d.\n", vr ); vulkan_funcs = NULL; diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index f57b2999a9c..a1635e618c0 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -63,8 +63,6 @@ static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name { TRACE( "instance %p, name %s\n", instance, debugstr_a(name) ); - if (!strcmp( name, "vkCreateInstance" )) return vulkan_funcs.p_vkCreateInstance; - if (!instance) return p_vkGetInstanceProcAddr( instance, name ); if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return vulkan_funcs.p_vkCreateWin32SurfaceKHR; diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 63c4896e54d..154538e0a20 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -77,7 +77,6 @@ typedef struct VkMetalSurfaceCreateInfoEXT const void *pLayer; /* CAMetalLayer */ } VkMetalSurfaceCreateInfoEXT; -static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateMacOSSurfaceMVK)(VkInstance, const VkMacOSSurfaceCreateInfoMVK*, const VkAllocationCallbacks *, VkSurfaceKHR *); static VkResult (*pvkCreateMetalSurfaceEXT)(VkInstance, const VkMetalSurfaceCreateInfoEXT*, const VkAllocationCallbacks *, VkSurfaceKHR *); @@ -95,54 +94,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; } -/* Helper function for converting between win32 and MoltenVK compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. - */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with MoltenVK ones else copy. Long-term, when we - * support more extensions, we should store these in a list. - */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - { - enabled_extensions[i] = pvkCreateMetalSurfaceEXT ? "VK_EXT_metal_surface" : "VK_MVK_macos_surface"; - } - else - { - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static void wine_vk_surface_destroy(VkInstance instance, struct wine_vk_surface *surface) { pvkDestroySurfaceKHR(instance, surface->host_surface, NULL /* allocator */); @@ -156,33 +107,6 @@ static void wine_vk_surface_destroy(VkInstance instance, struct wine_vk_surface free(surface); } -static VkResult macdrv_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. - */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult macdrv_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain) @@ -377,7 +301,6 @@ static VkSurfaceKHR macdrv_wine_get_host_surface(VkSurfaceKHR surface) static const struct vulkan_funcs vulkan_funcs = { - macdrv_vkCreateInstance, macdrv_vkCreateSwapchainKHR, macdrv_vkCreateWin32SurfaceKHR, macdrv_vkDestroyInstance, @@ -402,7 +325,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d } #define LOAD_FUNCPTR(f) if ((p##f = dlsym(vulkan_handle, #f)) == NULL) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR(vkCreateInstance) LOAD_FUNCPTR(vkCreateSwapchainKHR) LOAD_FUNCPTR(vkCreateMacOSSurfaceMVK) LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index fd4362e1e4e..46d36c3222e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -196,7 +196,6 @@ FUNCTION_OVERRIDES = { # functions for which a user driver entry must be generated USER_DRIVER_FUNCS = { - "vkCreateInstance", "vkCreateSwapchainKHR", "vkCreateWin32SurfaceKHR", "vkDestroyInstance", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 8a022195ec2..6adae76321c 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); +static PFN_vkCreateInstance p_vkCreateInstance; static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; static PFN_vkEnumerateInstanceExtensionProperties p_vkEnumerateInstanceExtensionProperties; @@ -548,6 +549,7 @@ NTSTATUS init_vulkan(void *args) return STATUS_UNSUCCESSFUL; } + p_vkCreateInstance = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkCreateInstance"); p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); p_vkEnumerateInstanceExtensionProperties = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); @@ -880,7 +882,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, init_conversion_context(&ctx); res = wine_vk_instance_convert_create_info(&ctx, create_info, &create_info_host, object); if (res == VK_SUCCESS) - res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->host_instance); + res = p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->host_instance); free_conversion_context(&ctx); if (res != VK_SUCCESS) { diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 6bac804a118..834ba9a4dcf 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -53,7 +53,6 @@ typedef struct VkWaylandSurfaceCreateInfoKHR struct wl_surface *surface; } VkWaylandSurfaceCreateInfoKHR; -static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); @@ -144,49 +143,6 @@ static struct wine_vk_swapchain *wine_vk_swapchain_from_handle(VkSwapchainKHR ha return NULL; } -/* Helper function for converting between win32 and Wayland compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, - sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with Wayland ones else copy. Long-term, when we - * support more extensions, we should store these in a list. */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - enabled_extensions[i] = "VK_KHR_wayland_surface"; - else - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static void vk_result_update_out_of_date(VkResult *res) { /* If the current result is less severe than out_of_date, which for @@ -250,34 +206,6 @@ static VkResult check_queue_present(const VkPresentInfoKHR *present_info, return res; } -static VkResult wayland_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, - VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult wayland_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, @@ -481,7 +409,6 @@ static VkSurfaceKHR wayland_wine_get_host_surface(VkSurfaceKHR surface) static const struct vulkan_funcs vulkan_funcs = { - .p_vkCreateInstance = wayland_vkCreateInstance, .p_vkCreateSwapchainKHR = wayland_vkCreateSwapchainKHR, .p_vkCreateWin32SurfaceKHR = wayland_vkCreateWin32SurfaceKHR, .p_vkDestroyInstance = wayland_vkDestroyInstance, @@ -506,7 +433,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * } #define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR(vkCreateInstance); LOAD_FUNCPTR(vkCreateSwapchainKHR); LOAD_FUNCPTR(vkCreateWaylandSurfaceKHR); LOAD_FUNCPTR(vkDestroyInstance); diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 31bfdb98f86..49dc6dfb8fe 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -76,7 +76,6 @@ typedef struct VkXlibSurfaceCreateInfoKHR Window window; } VkXlibSurfaceCreateInfoKHR; -static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (*pvkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); @@ -93,54 +92,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; } -/* Helper function for converting between win32 and X11 compatible VkInstanceCreateInfo. - * Caller is responsible for allocation and cleanup of 'dst'. - */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, - VkInstanceCreateInfo *dst) -{ - unsigned int i; - const char **enabled_extensions = NULL; - - dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; - dst->pNext = src->pNext; - dst->enabledLayerCount = 0; - dst->ppEnabledLayerNames = NULL; - dst->enabledExtensionCount = 0; - dst->ppEnabledExtensionNames = NULL; - - if (src->enabledExtensionCount > 0) - { - enabled_extensions = calloc(src->enabledExtensionCount, sizeof(*src->ppEnabledExtensionNames)); - if (!enabled_extensions) - { - ERR("Failed to allocate memory for enabled extensions\n"); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - for (i = 0; i < src->enabledExtensionCount; i++) - { - /* Substitute extension with X11 ones else copy. Long-term, when we - * support more extensions, we should store these in a list. - */ - if (!strcmp(src->ppEnabledExtensionNames[i], "VK_KHR_win32_surface")) - { - enabled_extensions[i] = "VK_KHR_xlib_surface"; - } - else - { - enabled_extensions[i] = src->ppEnabledExtensionNames[i]; - } - } - dst->ppEnabledExtensionNames = enabled_extensions; - dst->enabledExtensionCount = src->enabledExtensionCount; - } - - return VK_SUCCESS; -} - static struct wine_vk_surface *wine_vk_surface_grab(struct wine_vk_surface *surface) { InterlockedIncrement(&surface->ref); @@ -198,33 +149,6 @@ void vulkan_thread_detach(void) pthread_mutex_unlock(&vulkan_mutex); } -static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *create_info, - const VkAllocationCallbacks *allocator, VkInstance *instance) -{ - VkInstanceCreateInfo create_info_host; - VkResult res; - TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - - if (allocator) - FIXME("Support for allocation callbacks not implemented yet\n"); - - /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan - * performed a first pass in which it handles everything except for WSI - * functionality such as VK_KHR_win32_surface. Handle this now. - */ - res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - return res; - } - - res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance); - - free((void *)create_info_host.ppEnabledExtensionNames); - return res; -} - static VkResult X11DRV_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain) @@ -412,7 +336,6 @@ static VkSurfaceKHR X11DRV_wine_get_host_surface( VkSurfaceKHR surface ) static const struct vulkan_funcs vulkan_funcs = { - X11DRV_vkCreateInstance, X11DRV_vkCreateSwapchainKHR, X11DRV_vkCreateWin32SurfaceKHR, X11DRV_vkDestroyInstance, @@ -439,7 +362,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * init_recursive_mutex( &vulkan_mutex ); #define LOAD_FUNCPTR( f ) if (!(p##f = dlsym( vulkan_handle, #f ))) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR( vkCreateInstance ); LOAD_FUNCPTR( vkCreateSwapchainKHR ); LOAD_FUNCPTR( vkCreateXlibSurfaceKHR ); LOAD_FUNCPTR( vkDestroyInstance ); diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 3915f3bccee..eba903f836a 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -648,6 +648,7 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid VkPhysicalDevice *vk_physical_devices = NULL; VkPhysicalDeviceProperties2 properties2; VkPhysicalDeviceMemoryProperties mem_properties; + PFN_vkCreateInstance pvkCreateInstance; VkInstanceCreateInfo create_info; VkPhysicalDeviceIDProperties id; VkInstance vk_instance = NULL; @@ -664,13 +665,6 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid create_info.enabledExtensionCount = ARRAY_SIZE(extensions); create_info.ppEnabledExtensionNames = extensions; - vr = vulkan_funcs->p_vkCreateInstance( &create_info, NULL, &vk_instance ); - if (vr != VK_SUCCESS) - { - WARN("Failed to create a Vulkan instance, vr %d.\n", vr); - goto done; - } - #define LOAD_VK_FUNC(f) \ if (!(p##f = (void *)vulkan_funcs->p_vkGetInstanceProcAddr( vk_instance, #f ))) \ { \ @@ -678,6 +672,15 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid goto done; \ } + LOAD_VK_FUNC( vkCreateInstance ) + + vr = pvkCreateInstance( &create_info, NULL, &vk_instance ); + if (vr != VK_SUCCESS) + { + WARN( "Failed to create a Vulkan instance, vr %d.\n", vr ); + goto done; + } + LOAD_VK_FUNC(vkEnumeratePhysicalDevices) LOAD_VK_FUNC(vkGetPhysicalDeviceProperties2KHR) LOAD_VK_FUNC(vkGetRandROutputDisplayEXT) diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index cd76dcbbcc2..1c7df64bb24 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H /* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 20 +#define WINE_VULKAN_DRIVER_VERSION 21 struct vulkan_funcs { @@ -29,7 +29,6 @@ struct vulkan_funcs * needs to provide. Other function calls will be provided indirectly by dispatch * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice. */ - VkResult (*p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); VkResult (*p_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *); VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); void (*p_vkDestroyInstance)(VkInstance, const VkAllocationCallbacks *);