Jacek Caban : winevulkan: Use __wine_unix_call interface for Unix lib initialization.
Alexandre Julliard
julliard at winehq.org
Thu Dec 9 15:34:27 CST 2021
Module: wine
Branch: master
Commit: a34e8c2bc36bf28b3c1b7ffeac21c95c39596418
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a34e8c2bc36bf28b3c1b7ffeac21c95c39596418
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Dec 9 03:14:01 2021 +0100
winevulkan: Use __wine_unix_call interface for Unix lib initialization.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winevulkan/Makefile.in | 1 +
dlls/winevulkan/loader.c | 24 +++++++++++++++---------
dlls/winevulkan/loader_thunks.h | 6 ++++++
dlls/winevulkan/make_vulkan | 12 ++++++++++++
dlls/winevulkan/vulkan.c | 29 +++++++++++------------------
dlls/winevulkan/vulkan_loader.h | 13 +++++++++++++
dlls/winevulkan/vulkan_private.h | 2 ++
dlls/winevulkan/vulkan_thunks.c | 6 ++++++
8 files changed, 66 insertions(+), 27 deletions(-)
diff --git a/dlls/winevulkan/Makefile.in b/dlls/winevulkan/Makefile.in
index 52b397e4242..38809211308 100644
--- a/dlls/winevulkan/Makefile.in
+++ b/dlls/winevulkan/Makefile.in
@@ -1,4 +1,5 @@
MODULE = winevulkan.dll
+UNIXLIB = winevulkan.so
IMPORTLIB = winevulkan
IMPORTS = user32 gdi32 advapi32 setupapi win32u
EXTRALIBS = $(PTHREAD_LIBS)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c
index 6c89b9ccfbe..bea60b07245 100644
--- a/dlls/winevulkan/loader.c
+++ b/dlls/winevulkan/loader.c
@@ -17,19 +17,13 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winternl.h"
+#include "vulkan_loader.h"
#include "winreg.h"
#include "winuser.h"
#include "initguid.h"
#include "devguid.h"
#include "setupapi.h"
-#include "vulkan_loader.h"
-
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
/* For now default to 4 as it felt like a reasonable version feature wise to support.
@@ -41,6 +35,7 @@ DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_GPU_VULKAN_UUID, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5c, 2);
const struct unix_funcs *unix_funcs;
+unixlib_handle_t unix_handle;
static HINSTANCE hinstance;
@@ -220,13 +215,24 @@ VkResult WINAPI vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *supported_ver
static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context)
{
- const struct vulkan_funcs *driver;
+ const void *driver;
driver = __wine_get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION);
if (!driver)
+ {
ERR("Failed to load Wine graphics driver supporting Vulkan.\n");
+ return FALSE;
+ }
+
+ if (NtQueryVirtualMemory(GetCurrentProcess(), hinstance, MemoryWineUnixFuncs,
+ &unix_handle, sizeof(unix_handle), NULL))
+ return FALSE;
- return driver && !__wine_init_unix_lib(hinstance, DLL_PROCESS_ATTACH, driver, &unix_funcs);
+ if (vk_unix_call(unix_init, &driver) || !driver)
+ return FALSE;
+
+ unix_funcs = driver;
+ return TRUE;
}
static BOOL wine_vk_init_once(void)
diff --git a/dlls/winevulkan/loader_thunks.h b/dlls/winevulkan/loader_thunks.h
index f46cd9d4850..fd8877cecbe 100644
--- a/dlls/winevulkan/loader_thunks.h
+++ b/dlls/winevulkan/loader_thunks.h
@@ -431,4 +431,10 @@ struct unix_funcs
BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *);
};
+enum unix_call
+{
+ unix_init,
+ unix_count,
+};
+
#endif /* __WINE_VULKAN_LOADER_THUNKS_H */
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index de391c81065..53d69964aaa 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -2792,7 +2792,13 @@ class VkGenerator(object):
f.write(" &{1}{0},\n".format(vk_func.name, prefix))
f.write(" &wine_vk_is_available_instance_function,\n")
f.write(" &wine_vk_is_available_device_function,\n")
+ f.write("};\n\n")
+
+ f.write("const unixlib_entry_t __wine_unix_call_funcs[] =\n")
+ f.write("{\n")
+ f.write(" init_vulkan,\n")
f.write("};\n")
+ f.write("C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == unix_count);\n")
def generate_thunks_h(self, f, prefix):
self._generate_copyright(f)
@@ -2998,6 +3004,12 @@ class VkGenerator(object):
f.write(" BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *);\n")
f.write("};\n\n")
+ f.write("enum unix_call\n")
+ f.write("{\n")
+ f.write(" unix_init,\n")
+ f.write(" unix_count,\n")
+ f.write("};\n\n")
+
f.write("#endif /* __WINE_VULKAN_LOADER_THUNKS_H */\n")
def generate_vulkan_h(self, f):
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index 6f90db9736e..e57f8efef99 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -23,19 +23,13 @@
#include "config.h"
#include <time.h>
-#include <stdarg.h>
#include <stdlib.h>
-#include "ntstatus.h"
-#define WIN32_NO_STATUS
-#include "windef.h"
-#include "winbase.h"
+#include "vulkan_private.h"
#include "winreg.h"
#include "winuser.h"
#include "winternl.h"
-#include "vulkan_private.h"
-
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
#define wine_vk_find_struct(s, t) wine_vk_find_struct_((void *)s, VK_STRUCTURE_TYPE_##t)
@@ -68,7 +62,6 @@ static uint32_t wine_vk_count_struct_(void *s, VkStructureType t)
}
static const struct vulkan_funcs *vk_funcs;
-static VkResult (*p_vkEnumerateInstanceVersion)(uint32_t *version);
#define WINE_VK_ADD_DISPATCHABLE_MAPPING(instance, object, native_handle) \
wine_vk_add_handle_mapping((instance), (uint64_t) (uintptr_t) (object), (uint64_t) (uintptr_t) (native_handle), &(object)->mapping)
@@ -140,8 +133,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
wine_callback_data = *((VkDebugUtilsMessengerCallbackDataEXT *) callback_data);
- object_name_infos = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY,
- wine_callback_data.objectCount * sizeof(*object_name_infos));
+ object_name_infos = calloc(wine_callback_data.objectCount, sizeof(*object_name_infos));
for (i = 0; i < wine_callback_data.objectCount; i++)
{
@@ -156,7 +148,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
if (!object_name_infos[i].objectHandle)
{
WARN("handle conversion failed 0x%s\n", wine_dbgstr_longlong(callback_data->pObjects[i].objectHandle));
- RtlFreeHeap(GetProcessHeap(), 0, object_name_infos);
+ free(object_name_infos);
return VK_FALSE;
}
}
@@ -171,7 +163,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
/* applications should always return VK_FALSE */
result = object->user_callback(severity, message_types, &wine_callback_data, object->user_data);
- RtlFreeHeap(GetProcessHeap(), 0, object_name_infos);
+ free(object_name_infos);
return result;
}
@@ -422,13 +414,10 @@ static void wine_vk_device_free(struct VkDevice_T *device)
free(device);
}
-NTSTATUS CDECL __wine_init_unix_lib(HMODULE module, DWORD reason, const void *driver, void *ptr_out)
+NTSTATUS init_vulkan(void *args)
{
- if (reason != DLL_PROCESS_ATTACH) return STATUS_SUCCESS;
-
- vk_funcs = driver;
- p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
- *(const struct unix_funcs **)ptr_out = &loader_funcs;
+ vk_funcs = *(const struct vulkan_funcs **)args;
+ *(const struct unix_funcs **)args = &loader_funcs;
return STATUS_SUCCESS;
}
@@ -962,6 +951,10 @@ VkResult WINAPI wine_vkEnumerateInstanceVersion(uint32_t *version)
{
VkResult res;
+ static VkResult (*p_vkEnumerateInstanceVersion)(uint32_t *version);
+ if (!p_vkEnumerateInstanceVersion)
+ p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
+
if (p_vkEnumerateInstanceVersion)
{
res = p_vkEnumerateInstanceVersion(version);
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h
index e20583cecab..e636de934fd 100644
--- a/dlls/winevulkan/vulkan_loader.h
+++ b/dlls/winevulkan/vulkan_loader.h
@@ -20,9 +20,16 @@
#ifndef __WINE_VULKAN_LOADER_H
#define __WINE_VULKAN_LOADER_H
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
#include "wine/debug.h"
#include "wine/vulkan.h"
#include "wine/vulkan_driver.h"
+#include "wine/unixlib.h"
#include "loader_thunks.h"
@@ -63,5 +70,11 @@ void *wine_vk_get_phys_dev_proc_addr(const char *name) DECLSPEC_HIDDEN;
void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
extern const struct unix_funcs *unix_funcs;
+extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
+
+static inline NTSTATUS vk_unix_call(enum unix_call code, void *params)
+{
+ return __wine_unix_call(unix_handle, code, params);
+}
#endif /* __WINE_VULKAN_LOADER_H */
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h
index 6aa60f8c9ae..83a26988e8b 100644
--- a/dlls/winevulkan/vulkan_private.h
+++ b/dlls/winevulkan/vulkan_private.h
@@ -210,6 +210,8 @@ 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;
+NTSTATUS init_vulkan(void *args) DECLSPEC_HIDDEN;
+
extern const struct unix_funcs loader_funcs;
BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) DECLSPEC_HIDDEN;
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
index e0c8ea28b28..0e8d000b6da 100644
--- a/dlls/winevulkan/vulkan_thunks.c
+++ b/dlls/winevulkan/vulkan_thunks.c
@@ -9088,3 +9088,9 @@ const struct unix_funcs loader_funcs =
&wine_vk_is_available_instance_function,
&wine_vk_is_available_device_function,
};
+
+const unixlib_entry_t __wine_unix_call_funcs[] =
+{
+ init_vulkan,
+};
+C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == unix_count);
More information about the wine-cvs
mailing list