Module: wine Branch: master Commit: a34e8c2bc36bf28b3c1b7ffeac21c95c39596418 URL: https://source.winehq.org/git/wine.git/?a=commit;h=a34e8c2bc36bf28b3c1b7ffea...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);