Jacek Caban : winevulkan: Move wine_vk_init to loader.c.

Alexandre Julliard julliard at winehq.org
Wed Apr 14 16:01:20 CDT 2021


Module: wine
Branch: master
Commit: cc3c23c312f55a01316575474515234bfb5f9a69
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cc3c23c312f55a01316575474515234bfb5f9a69

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 14 17:58:45 2021 +0200

winevulkan: Move wine_vk_init to loader.c.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winevulkan/loader.c         | 67 ++++++++++++++++++++++++++++++++++++++++
 dlls/winevulkan/vulkan.c         | 53 ++++---------------------------
 dlls/winevulkan/vulkan_private.h |  8 +++++
 3 files changed, 81 insertions(+), 47 deletions(-)

diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c
index 0966e2d9468..746a25041d0 100644
--- a/dlls/winevulkan/loader.c
+++ b/dlls/winevulkan/loader.c
@@ -206,6 +206,73 @@ VkResult WINAPI wine_vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *supporte
     return VK_SUCCESS;
 }
 
+static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context)
+{
+    const struct vulkan_funcs *driver;
+    HDC hdc;
+
+    hdc = GetDC(0);
+    driver = __wine_get_vulkan_driver(hdc, WINE_VULKAN_DRIVER_VERSION);
+    ReleaseDC(0, hdc);
+    if (!driver)
+        ERR("Failed to load Wine graphics driver supporting Vulkan.\n");
+    else
+        unix_vk_init(driver);
+
+    return driver != NULL;
+}
+
+static BOOL  wine_vk_init_once(void)
+{
+    static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
+
+    return InitOnceExecuteOnce(&init_once, wine_vk_init, NULL, NULL);
+}
+
+VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
+        const VkAllocationCallbacks *allocator, VkInstance *instance)
+{
+    TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
+
+    if(!wine_vk_init_once())
+        return VK_ERROR_INITIALIZATION_FAILED;
+
+    return unix_vkCreateInstance(create_info, allocator, instance);
+}
+
+VkResult WINAPI wine_vkEnumerateInstanceExtensionProperties(const char *layer_name,
+        uint32_t *count, VkExtensionProperties *properties)
+{
+    TRACE("%p, %p, %p\n", layer_name, count, properties);
+
+    if (layer_name)
+    {
+        WARN("Layer enumeration not supported from ICD.\n");
+        return VK_ERROR_LAYER_NOT_PRESENT;
+    }
+
+    if (!wine_vk_init_once())
+    {
+        *count = 0;
+        return VK_SUCCESS;
+    }
+
+    return unix_vkEnumerateInstanceExtensionProperties(layer_name, count, properties);
+}
+
+VkResult WINAPI wine_vkEnumerateInstanceVersion(uint32_t *version)
+{
+    TRACE("%p\n", version);
+
+    if (!wine_vk_init_once())
+    {
+        *version = VK_API_VERSION_1_0;
+        return VK_SUCCESS;
+    }
+
+    return unix_vkEnumerateInstanceVersion(version);
+}
+
 static HANDLE get_display_device_init_mutex(void)
 {
     static const WCHAR init_mutexW[] = {'d','i','s','p','l','a','y','_','d','e','v','i','c','e','_','i','n','i','t',0};
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index fbcbe4721a3..b186e425edb 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -450,26 +450,10 @@ static void wine_vk_device_free(struct VkDevice_T *device)
     free(device);
 }
 
-static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context)
+void unix_vk_init(const struct vulkan_funcs *driver)
 {
-    HDC hdc;
-
-    hdc = GetDC(0);
-    vk_funcs = __wine_get_vulkan_driver(hdc, WINE_VULKAN_DRIVER_VERSION);
-    ReleaseDC(0, hdc);
-    if (!vk_funcs)
-        ERR("Failed to load Wine graphics driver supporting Vulkan.\n");
-    else
-        p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
-
-    return TRUE;
-}
-
-static void wine_vk_init_once(void)
-{
-    static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
-
-    InitOnceExecuteOnce(&init_once, wine_vk_init, NULL, NULL);
+    vk_funcs = driver;
+    p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
 }
 
 /* Helper function for converting between win32 and host compatible VkInstanceCreateInfo.
@@ -845,7 +829,7 @@ fail:
     return res;
 }
 
-VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
+VkResult WINAPI unix_vkCreateInstance(const VkInstanceCreateInfo *create_info,
         const VkAllocationCallbacks *allocator, VkInstance *instance)
 {
     VkInstanceCreateInfo create_info_host;
@@ -853,12 +837,6 @@ VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
     struct VkInstance_T *object;
     VkResult res;
 
-    TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
-
-    wine_vk_init_once();
-    if (!vk_funcs)
-        return VK_ERROR_INITIALIZATION_FAILED;
-
     if (allocator)
         FIXME("Support for allocation callbacks not implemented yet\n");
 
@@ -975,7 +953,7 @@ VkResult WINAPI wine_vkEnumerateDeviceExtensionProperties(VkPhysicalDevice phys_
     return *count < phys_dev->extension_count ? VK_INCOMPLETE : VK_SUCCESS;
 }
 
-VkResult WINAPI wine_vkEnumerateInstanceExtensionProperties(const char *layer_name,
+VkResult WINAPI unix_vkEnumerateInstanceExtensionProperties(const char *layer_name,
         uint32_t *count, VkExtensionProperties *properties)
 {
     uint32_t num_properties = 0, num_host_properties;
@@ -983,21 +961,6 @@ VkResult WINAPI wine_vkEnumerateInstanceExtensionProperties(const char *layer_na
     unsigned int i, j;
     VkResult res;
 
-    TRACE("%p, %p, %p\n", layer_name, count, properties);
-
-    if (layer_name)
-    {
-        WARN("Layer enumeration not supported from ICD.\n");
-        return VK_ERROR_LAYER_NOT_PRESENT;
-    }
-
-    wine_vk_init_once();
-    if (!vk_funcs)
-    {
-        *count = 0;
-        return VK_SUCCESS;
-    }
-
     res = vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &num_host_properties, NULL);
     if (res != VK_SUCCESS)
         return res;
@@ -1055,14 +1018,10 @@ VkResult WINAPI wine_vkEnumerateDeviceLayerProperties(VkPhysicalDevice phys_dev,
     return VK_SUCCESS;
 }
 
-VkResult WINAPI wine_vkEnumerateInstanceVersion(uint32_t *version)
+VkResult WINAPI unix_vkEnumerateInstanceVersion(uint32_t *version)
 {
     VkResult res;
 
-    TRACE("%p\n", version);
-
-    wine_vk_init_once();
-
     if (p_vkEnumerateInstanceVersion)
     {
         res = p_vkEnumerateInstanceVersion(version);
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h
index 6574d282eea..1a44edb3c26 100644
--- a/dlls/winevulkan/vulkan_private.h
+++ b/dlls/winevulkan/vulkan_private.h
@@ -243,4 +243,12 @@ BOOL wine_vk_instance_extension_supported(const char *name) DECLSPEC_HIDDEN;
 BOOL wine_vk_is_type_wrapped(VkObjectType type) DECLSPEC_HIDDEN;
 uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDDEN;
 
+void unix_vk_init(const struct vulkan_funcs *driver) DECLSPEC_HIDDEN;
+
+VkResult WINAPI unix_vkCreateInstance(const VkInstanceCreateInfo *create_info,
+        const VkAllocationCallbacks *allocator, VkInstance *instance) DECLSPEC_HIDDEN;
+VkResult WINAPI unix_vkEnumerateInstanceExtensionProperties(const char *layer_name,
+        uint32_t *count, VkExtensionProperties *properties) DECLSPEC_HIDDEN;
+VkResult WINAPI unix_vkEnumerateInstanceVersion(uint32_t *version) DECLSPEC_HIDDEN;
+
 #endif /* __WINE_VULKAN_PRIVATE_H */




More information about the wine-cvs mailing list