From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winevulkan/loader.c | 18 ++++++++++++------ dlls/winevulkan/loader_thunks.h | 1 + dlls/winevulkan/make_vulkan | 3 +++ dlls/winevulkan/vulkan.c | 26 ++++++++++++++++++++++---- dlls/winevulkan/vulkan_loader.h | 7 +++++++ dlls/winevulkan/vulkan_private.h | 2 ++ dlls/winevulkan/vulkan_thunks.c | 2 ++ dlls/wow64win/user.c | 15 --------------- include/ntuser.h | 3 --- 9 files changed, 49 insertions(+), 28 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index d6fe9fe078f..6ae82f23ffc 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -89,6 +89,11 @@ static void *wine_vk_get_global_proc_addr(const char *name) return NULL; }
+static void set_callback_functions(const struct vk_callback_funcs *funcs) +{ + vk_unix_call(unix_set_callback_functions, &funcs); +} + static BOOL is_available_instance_function(VkInstance instance, const char *name) { struct is_available_instance_function_params params = { .instance = instance, .name = name }; @@ -597,10 +602,14 @@ static BOOL WINAPI call_vulkan_debug_utils_callback( struct wine_vk_debug_utils_ return params->user_callback(params->severity, params->message_types, ¶ms->data, params->user_data); }
-BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +static const struct vk_callback_funcs callback_funcs = { - void **kernel_callback_table; + (user32_callback_func)call_vulkan_debug_report_callback, + (user32_callback_func)call_vulkan_debug_utils_callback, +};
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +{ TRACE("%p, %lu, %p\n", hinst, reason, reserved);
switch (reason) @@ -608,10 +617,7 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) case DLL_PROCESS_ATTACH: hinstance = hinst; DisableThreadLibraryCalls(hinst); - - kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - kernel_callback_table[NtUserCallVulkanDebugReportCallback] = call_vulkan_debug_report_callback; - kernel_callback_table[NtUserCallVulkanDebugUtilsCallback] = call_vulkan_debug_utils_callback; + set_callback_functions(&callback_funcs); break; } return TRUE; diff --git a/dlls/winevulkan/loader_thunks.h b/dlls/winevulkan/loader_thunks.h index b262c9d29fb..ff7a1408bf7 100644 --- a/dlls/winevulkan/loader_thunks.h +++ b/dlls/winevulkan/loader_thunks.h @@ -15,6 +15,7 @@ enum unix_call { unix_init, + unix_set_callback_functions, unix_is_available_instance_function, unix_is_available_device_function, unix_vkAcquireNextImage2KHR, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 2dbb2d18bd0..b6bdfd1b0d7 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2479,6 +2479,7 @@ class VkGenerator(object): f.write("const unixlib_entry_t __wine_unix_call_funcs[] =\n") f.write("{\n") f.write(" init_vulkan,\n") + f.write(" vk_set_callback_functions,\n") f.write(" vk_is_available_instance_function,\n") f.write(" vk_is_available_device_function,\n") for vk_func in self.registry.funcs.values(): @@ -2496,6 +2497,7 @@ class VkGenerator(object): f.write("const unixlib_entry_t __wine_unix_call_funcs[] =\n") f.write("{\n") f.write(" init_vulkan,\n") + f.write(" vk_set_callback_functions,\n") f.write(" vk_is_available_instance_function,\n") f.write(" vk_is_available_device_function,\n") for vk_func in self.registry.funcs.values(): @@ -2697,6 +2699,7 @@ class VkGenerator(object): f.write("enum unix_call\n") f.write("{\n") f.write(" unix_init,\n") + f.write(" unix_set_callback_functions,\n") f.write(" unix_is_available_instance_function,\n") f.write(" unix_is_available_device_function,\n") for vk_func in self.registry.funcs.values(): diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 0edc1ae492d..b80f175e24e 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -114,6 +114,12 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB void *user_data) { struct wine_vk_debug_utils_params params; + struct user32_callback_params cbparams = + { + callback_funcs.call_vulkan_debug_utils_callback, + ¶ms, + sizeof(params) + }; VkDebugUtilsObjectNameInfoEXT *object_name_infos; struct wine_debug_utils_messenger *object; void *ret_ptr; @@ -166,8 +172,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB params.data.pObjects = object_name_infos;
/* applications should always return VK_FALSE */ - result = KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, ¶ms, sizeof(params), - &ret_ptr, &ret_len ); + result = KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len );
free(object_name_infos);
@@ -178,6 +183,12 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk uint64_t object_handle, size_t location, int32_t code, const char *layer_prefix, const char *message, void *user_data) { struct wine_vk_debug_report_params params; + struct user32_callback_params cbparams = + { + callback_funcs.call_vulkan_debug_report_callback, + ¶ms, + sizeof(params) + }; struct wine_debug_report_callback *object; void *ret_ptr; ULONG ret_len; @@ -207,8 +218,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk if (!params.object_handle) params.object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
- return KeUserModeCallback( NtUserCallVulkanDebugReportCallback, ¶ms, sizeof(params), - &ret_ptr, &ret_len ); + return KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); }
static void wine_vk_physical_device_free(struct wine_phys_dev *phys_dev) @@ -1723,6 +1733,14 @@ VkResult wine_vkCreateRayTracingPipelinesNV(VkDevice handle, VkPipelineCache pip return res; }
+struct vk_callback_funcs callback_funcs; + +NTSTATUS vk_set_callback_functions(void *arg) +{ + callback_funcs = *(struct vk_callback_funcs*)arg; + return STATUS_SUCCESS; +} + NTSTATUS vk_is_available_instance_function(void *arg) { struct is_available_instance_function_params *params = arg; diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 64a136b0804..784adfe91a9 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -27,6 +27,7 @@ #include "windef.h" #include "winbase.h" #include "winternl.h" +#include "ntuser.h" #include "wine/debug.h" #include "wine/vulkan.h" #include "wine/unixlib.h" @@ -108,6 +109,12 @@ void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
/* debug callbacks params */
+struct vk_callback_funcs +{ + user32_callback_func call_vulkan_debug_report_callback; + user32_callback_func call_vulkan_debug_utils_callback; +}; + struct wine_vk_debug_utils_params { PFN_vkDebugUtilsMessengerCallbackEXT user_callback; diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 4221e97b73a..4b72f65e8c1 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -236,6 +236,8 @@ NTSTATUS init_vulkan(void *args) DECLSPEC_HIDDEN;
NTSTATUS WINAPI vk_direct_unix_call(unixlib_handle_t handle, unsigned int code, void *arg) DECLSPEC_HIDDEN;
+extern struct vk_callback_funcs callback_funcs; +NTSTATUS vk_set_callback_functions(void *arg) DECLSPEC_HIDDEN; NTSTATUS vk_is_available_instance_function(void *arg) DECLSPEC_HIDDEN; NTSTATUS vk_is_available_device_function(void *arg) DECLSPEC_HIDDEN;
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 98cabee0aae..3224195480c 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -18382,6 +18382,7 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) const unixlib_entry_t __wine_unix_call_funcs[] = { init_vulkan, + vk_set_callback_functions, vk_is_available_instance_function, vk_is_available_device_function, thunk64_vkAcquireNextImage2KHR, @@ -18903,6 +18904,7 @@ C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == unix_count); const unixlib_entry_t __wine_unix_call_funcs[] = { init_vulkan, + vk_set_callback_functions, vk_is_available_instance_function, vk_is_available_device_function, thunk32_vkAcquireNextImage2KHR, diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index bc75c09135d..a350579ad77 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1019,18 +1019,6 @@ static NTSTATUS WINAPI wow64_NtUserThunkLock( void *arg, ULONG size ) return dispatch_callback( NtUserThunkLock, arg, size ); }
-static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) -{ - FIXME( "\n" ); - return 0; -} - -static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size ) -{ - FIXME( "\n" ); - return 0; -} - static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) { return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size ); @@ -1106,9 +1094,6 @@ user_callback user_callbacks[] = /* win16 hooks */ wow64_NtUserCallFreeIcon, wow64_NtUserThunkLock, - /* Vulkan support */ - wow64_NtUserCallVulkanDebugReportCallback, - wow64_NtUserCallVulkanDebugUtilsCallback, /* Driver-specific callbacks */ wow64_NtUserDriverCallbackFirst0, wow64_NtUserDriverCallbackFirst1, diff --git a/include/ntuser.h b/include/ntuser.h index 015f4cb7e35..09f56ab252d 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -50,9 +50,6 @@ enum /* win16 hooks */ NtUserCallFreeIcon, NtUserThunkLock, - /* Vulkan support */ - NtUserCallVulkanDebugReportCallback, - NtUserCallVulkanDebugUtilsCallback, /* Driver-specific callbacks */ NtUserDriverCallbackFirst, NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9,