From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winevulkan/loader.c | 44 +++++++++++++++++++------------- dlls/winevulkan/vulkan.c | 25 +++++++++++++----- dlls/winevulkan/vulkan_loader.h | 17 ++++++++++++ dlls/winevulkan/vulkan_private.h | 1 + dlls/wow64win/user.c | 15 ----------- include/ntuser.h | 3 --- 6 files changed, 62 insertions(+), 43 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index a86a35b0d40..ca91212b348 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -233,13 +233,38 @@ VkResult WINAPI vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *supported_ver return VK_SUCCESS; }
+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 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); +} + static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) { + struct vk_callback_funcs callback_funcs = + { + (ULONG_PTR)call_vulkan_debug_report_callback, + (ULONG_PTR)call_vulkan_debug_utils_callback, + }; + struct init_vulkan_params params; + if (NtQueryVirtualMemory(GetCurrentProcess(), hinstance, MemoryWineUnixFuncs, &unix_handle, sizeof(unix_handle), NULL)) return FALSE;
- return !vk_unix_call(unix_init, &p_vk_direct_unix_call); + params.callback_funcs = &callback_funcs; + if (vk_unix_call(unix_init, ¶ms)) return FALSE; + p_vk_direct_unix_call = params.vk_direct_unix_call; + return TRUE; }
static BOOL wine_vk_init_once(void) @@ -609,21 +634,8 @@ 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 ) -{ - 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 ) -{ - return params->user_callback(params->severity, params->message_types, ¶ms->data, params->user_data); -} - BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { - void **kernel_callback_table; - TRACE("%p, %lu, %p\n", hinst, reason, reserved);
switch (reason) @@ -631,10 +643,6 @@ 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 TRUE; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index bd02edde4b6..0c87659a5c6 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.cbparams, 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.cbparams, sizeof(params), &ret_ptr, &ret_len ); }
static void wine_vk_physical_device_free(struct wine_phys_dev *phys_dev) @@ -410,10 +410,14 @@ static void wine_vk_device_free(struct wine_device *device) free(device); }
+struct vk_callback_funcs callback_funcs; + #ifdef _WIN64
NTSTATUS init_vulkan(void *args) { + struct init_vulkan_params *params = args; + vk_funcs = __wine_get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); if (!vk_funcs) { @@ -421,8 +425,8 @@ NTSTATUS init_vulkan(void *args) return STATUS_UNSUCCESSFUL; }
- - *(void **)args = vk_direct_unix_call; + callback_funcs = *params->callback_funcs; + params->vk_direct_unix_call = vk_direct_unix_call; return STATUS_SUCCESS; }
@@ -430,6 +434,12 @@ NTSTATUS init_vulkan(void *args)
NTSTATUS init_vulkan32(void *args) { + struct + { + UINT32 callback_funcs; + UINT32 vk_direct_unix_call; + } *params = args; + vk_funcs = __wine_get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); if (!vk_funcs) { @@ -437,8 +447,9 @@ NTSTATUS init_vulkan32(void *args) return STATUS_UNSUCCESSFUL; }
+ callback_funcs = *(struct vk_callback_funcs*)(ULONG_PTR)params->callback_funcs; #ifndef _WIN64 - *(void **)args = vk_direct_unix_call; + params->vk_direct_unix_call = (UINT32)(ULONG_PTR)vk_direct_unix_call; #endif return STATUS_SUCCESS; } diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 8e22fc1ee45..21a871dd9d3 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" @@ -107,10 +108,24 @@ void *wine_vk_get_device_proc_addr(const char *name) DECLSPEC_HIDDEN; 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;
+struct vk_callback_funcs +{ + UINT64 call_vulkan_debug_report_callback; + UINT64 call_vulkan_debug_utils_callback; +}; + +struct init_vulkan_params +{ + const struct vk_callback_funcs *callback_funcs; + NTSTATUS (WINAPI *vk_direct_unix_call)(unixlib_handle_t handle, unsigned int code, void *args); +}; + /* debug callbacks params */
struct wine_vk_debug_utils_params { + struct user32_callback_params cbparams; + PFN_vkDebugUtilsMessengerCallbackEXT user_callback; void *user_data;
@@ -121,6 +136,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 a895b848156..94ca3ab6943 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -228,6 +228,7 @@ BOOL wine_vk_instance_extension_supported(const char *name) DECLSPEC_HIDDEN;
BOOL wine_vk_is_type_wrapped(VkObjectType type) DECLSPEC_HIDDEN;
+extern struct vk_callback_funcs callback_funcs; NTSTATUS init_vulkan(void *args) DECLSPEC_HIDDEN; NTSTATUS init_vulkan32(void *args) DECLSPEC_HIDDEN;
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index aad4d1c0d3f..357ddbc6a55 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1023,18 +1023,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" ); @@ -1117,9 +1105,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 53a48ecfe67..b960eb0dd19 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 */