From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winevulkan/loader.c | 27 ++++++++++++++++++--------- dlls/winevulkan/loader_thunks.h | 1 + dlls/winevulkan/make_vulkan | 3 +++ dlls/winevulkan/vulkan.c | 16 ++++++++++++---- dlls/winevulkan/vulkan_loader.h | 11 +++++++++++ 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(+), 31 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 20bd9d38c27..d140a35422f 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 BOOL set_callback_functions(const struct vk_callback_funcs *funcs) +{ + return !vk_unix_call(unix_set_callback_functions, (void*)funcs); +} + static BOOL is_available_instance_function(VkInstance instance, const char *name) { struct is_available_instance_function_params params = { .instance = instance, .name = name }; @@ -611,21 +616,29 @@ void WINAPI vkFreeCommandBuffers(VkDevice device, VkCommandPool cmd_pool, uint32 } }
-static BOOL WINAPI call_vulkan_debug_report_callback( struct wine_vk_debug_report_params *params, ULONG size ) +static NTSTATUS WINAPI call_vulkan_debug_report_callback( void *args, ULONG len ) { + struct wine_vk_debug_report_params *params = + CONTAINING_RECORD( args, struct wine_vk_debug_report_params, cbparams ); return params->user_callback(params->flags, params->object_type, params->object_handle, params->location, params->code, params->layer_prefix, params->message, params->user_data); }
-static BOOL WINAPI call_vulkan_debug_utils_callback( struct wine_vk_debug_utils_params *params, ULONG size ) +static NTSTATUS WINAPI call_vulkan_debug_utils_callback( void *args, ULONG len ) { + struct wine_vk_debug_utils_params *params = + CONTAINING_RECORD( args, struct wine_vk_debug_utils_params, cbparams ); 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; + call_vulkan_debug_report_callback, + call_vulkan_debug_utils_callback, +};
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +{ TRACE("%p, %lu, %p\n", hinst, reason, reserved);
switch (reason) @@ -633,11 +646,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; - break; + return set_callback_functions(&callback_funcs); } return TRUE; } diff --git a/dlls/winevulkan/loader_thunks.h b/dlls/winevulkan/loader_thunks.h index e79209cfb97..ae3db88febb 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 c7f422c3c64..cfde41db087 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2442,6 +2442,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(): @@ -2459,6 +2460,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(): @@ -2655,6 +2657,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 4868ac8858b..3c01f1cf8ac 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -119,6 +119,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB }
/* FIXME: we should pack all referenced structs instead of passing pointers */ + params.cbparams.func = callback_funcs.call_vulkan_debug_utils_callback; params.user_callback = object->user_callback; params.user_data = object->user_data; params.severity = severity; @@ -153,8 +154,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, ¶ms, sizeof(params), &ret_ptr, &ret_len );
free(object_name_infos);
@@ -181,6 +181,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk }
/* FIXME: we should pack all referenced structs instead of passing pointers */ + params.cbparams.func = callback_funcs.call_vulkan_debug_report_callback; params.user_callback = object->user_callback; params.user_data = object->user_data; params.flags = flags; @@ -194,8 +195,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, ¶ms, sizeof(params), &ret_ptr, &ret_len ); }
static void wine_vk_physical_device_free(struct wine_phys_dev *phys_dev) @@ -1702,6 +1702,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 8e22fc1ee45..41fd921faff 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -28,6 +28,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" @@ -109,8 +110,16 @@ 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 { + struct user32_callback_params cbparams; + PFN_vkDebugUtilsMessengerCallbackEXT user_callback; void *user_data;
@@ -121,6 +130,8 @@ struct wine_vk_debug_utils_params
struct wine_vk_debug_report_params { + struct user32_callback_params cbparams; + PFN_vkDebugReportCallbackEXT user_callback; void *user_data;
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index adc067462ce..b345842f702 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -235,6 +235,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 c01801f80e7..2d719be288d 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -21232,6 +21232,7 @@ BOOL wine_vk_is_type_wrapped(VkObjectType type) 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, @@ -21757,6 +21758,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 48f34f01a40..ddb3966a0b0 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1045,18 +1045,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_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size ) { FIXME( "\n" ); @@ -1139,9 +1127,6 @@ user_callback user_callbacks[] = /* win16 hooks */ wow64_NtUserCallFreeIcon, wow64_NtUserThunkLock, - /* Vulkan support */ - wow64_NtUserCallVulkanDebugReportCallback, - wow64_NtUserCallVulkanDebugUtilsCallback, /* OpenGL support */ wow64_NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ diff --git a/include/ntuser.h b/include/ntuser.h index 081056d6384..1065b5e3e92 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -51,9 +51,6 @@ enum /* win16 hooks */ NtUserCallFreeIcon, NtUserThunkLock, - /* Vulkan support */ - NtUserCallVulkanDebugReportCallback, - NtUserCallVulkanDebugUtilsCallback, /* OpenGL support */ NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */