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