From: Rémi Bernon rbernon@codeweavers.com
Based on a patch from Torge Matthies. --- dlls/winevulkan/loader.c | 14 +++++++------- dlls/winevulkan/vulkan.c | 13 ++++++++++--- dlls/winevulkan/vulkan_loader.h | 9 +++++++++ dlls/wow64win/user.c | 13 ------------- include/ntuser.h | 3 --- 5 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 82e0f9d9eb6..24605d82e12 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -327,7 +327,13 @@ static NTSTATUS WINAPI call_vulkan_debug_utils_callback(void *args, ULONG size)
static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) { - return !__wine_init_unix_call() && !UNIX_CALL(init, NULL); + struct vk_callback_funcs callback_funcs = + { + .call_vulkan_debug_report_callback = (ULONG_PTR)call_vulkan_debug_report_callback, + .call_vulkan_debug_utils_callback = (ULONG_PTR)call_vulkan_debug_utils_callback, + }; + + return !__wine_init_unix_call() && !UNIX_CALL(init, &callback_funcs); }
static BOOL wine_vk_init_once(void) @@ -699,8 +705,6 @@ void WINAPI vkFreeCommandBuffers(VkDevice device, VkCommandPool cmd_pool, uint32
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { - KERNEL_CALLBACK_PROC *kernel_callback_table; - TRACE("%p, %lu, %p\n", hinst, reason, reserved);
switch (reason) @@ -708,10 +712,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 8e7c094637d..53b567e97d8 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -169,6 +169,8 @@ static uint64_t client_handle_from_host(struct wine_instance *instance, uint64_t return result; }
+struct vk_callback_funcs callback_funcs; + static UINT append_string(const char *name, char *strings, UINT *strings_len) { UINT len = name ? strlen(name) + 1 : 0; @@ -244,6 +246,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB ptr = (char *)(params + 1); strings = (char *)params + size;
+ params->dispatch.callback = callback_funcs.call_vulkan_debug_utils_callback; params->user_callback = object->user_callback; params->user_data = object->user_data; params->severity = severity; @@ -296,7 +299,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB }
/* applications should always return VK_FALSE */ - KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, params, size + strings_len, &ret_ptr, &ret_len ); + KeUserDispatchCallback(¶ms->dispatch, size + strings_len, &ret_ptr, &ret_len); free(params);
if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; @@ -331,6 +334,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk if (!(params = malloc(sizeof(*params) + strings_len))) return VK_FALSE; strings = (char *)(params + 1);
+ params->dispatch.callback = callback_funcs.call_vulkan_debug_report_callback; params->user_callback = object->user_callback; params->user_data = object->user_data; params->flags = flags; @@ -344,7 +348,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk params->layer_len = append_string(layer_prefix, strings, &strings_len); params->message_len = append_string(message, strings, &strings_len);
- KeUserModeCallback(NtUserCallVulkanDebugReportCallback, params, sizeof(*params) + strings_len, &ret_ptr, &ret_len); + KeUserDispatchCallback(¶ms->dispatch, sizeof(*params) + strings_len, &ret_ptr, &ret_len); free(params);
if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; @@ -631,8 +635,10 @@ static VkResult wine_vk_device_convert_create_info(struct wine_phys_dev *phys_de return VK_SUCCESS; }
-NTSTATUS init_vulkan(void *args) +NTSTATUS init_vulkan(void *arg) { + const struct vk_callback_funcs *funcs = arg; + vk_funcs = __wine_get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); if (!vk_funcs) { @@ -640,6 +646,7 @@ NTSTATUS init_vulkan(void *args) return STATUS_UNSUCCESSFUL; }
+ callback_funcs = *funcs; p_vkCreateInstance = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkCreateInstance"); p_vkEnumerateInstanceVersion = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); p_vkEnumerateInstanceExtensionProperties = vk_funcs->p_vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 2b5e734a68b..6d3d30ce615 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" @@ -105,6 +106,12 @@ void *wine_vk_get_device_proc_addr(const char *name); void *wine_vk_get_phys_dev_proc_addr(const char *name); void *wine_vk_get_instance_proc_addr(const char *name);
+struct vk_callback_funcs +{ + UINT64 call_vulkan_debug_report_callback; + UINT64 call_vulkan_debug_utils_callback; +}; + /* debug callbacks params */
struct debug_utils_label @@ -130,6 +137,7 @@ struct debug_device_address_binding
struct wine_vk_debug_utils_params { + struct dispatch_callback_params dispatch; UINT64 user_callback; /* client pointer */ UINT64 user_data; /* client pointer */
@@ -150,6 +158,7 @@ struct wine_vk_debug_utils_params
struct wine_vk_debug_report_params { + struct dispatch_callback_params dispatch; UINT64 user_callback; /* client pointer */ UINT64 user_data; /* client pointer */
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index f4b8ca13036..b473d21617a 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1450,16 +1450,6 @@ static NTSTATUS WINAPI wow64_NtUserCallDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserCallDispatchCallback, arg, size ); }
-static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserCallVulkanDebugReportCallback, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserCallVulkanDebugUtilsCallback, arg, size ); -} - static NTSTATUS WINAPI wow64_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size ) { return dispatch_callback( NtUserCallOpenGLDebugMessageCallback, arg, size ); @@ -1538,9 +1528,6 @@ ntuser_callback user_callbacks[] = wow64_NtUserPostDDEMessage, wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, - /* Vulkan support */ - wow64_NtUserCallVulkanDebugReportCallback, - wow64_NtUserCallVulkanDebugUtilsCallback, /* OpenGL support */ wow64_NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */ diff --git a/include/ntuser.h b/include/ntuser.h index f46435eb57b..9ce3afdfa63 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -61,9 +61,6 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, - /* Vulkan support */ - NtUserCallVulkanDebugReportCallback, - NtUserCallVulkanDebugUtilsCallback, /* OpenGL support */ NtUserCallOpenGLDebugMessageCallback, /* Driver-specific callbacks */