-- v2: winevulkan: Serialize debug callbacks parameter structures. winevulkan: Use integer types in debug callbacks parameter structs. winevulkan: Fix incorrect 32->64 conversion of debug callbacks.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 2 +- dlls/winevulkan/vulkan_thunks.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index dbdbc48a058..6d68d794835 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1293,7 +1293,7 @@ class VkVariable(object): return self.pointer and self.pointer.count('*') > 1
def is_pointer_size(self): - if self.type in ["size_t", "HWND", "HINSTANCE"]: + if self.type in ["size_t", "HWND", "HINSTANCE"] or self.type.startswith("PFN"): return True if self.is_handle() and self.handle.is_dispatchable(): return True diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index c3063df1101..90a8474370a 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -1638,7 +1638,7 @@ typedef struct VkDebugReportCallbackCreateInfoEXT32 VkStructureType sType; PTR32 pNext; VkDebugReportFlagsEXT flags; - PFN_vkDebugReportCallbackEXT pfnCallback; + PTR32 pfnCallback; PTR32 pUserData; } VkDebugReportCallbackCreateInfoEXT32;
@@ -1649,7 +1649,7 @@ typedef struct VkDebugUtilsMessengerCreateInfoEXT32 VkDebugUtilsMessengerCreateFlagsEXT flags; VkDebugUtilsMessageSeverityFlagsEXT messageSeverity; VkDebugUtilsMessageTypeFlagsEXT messageType; - PFN_vkDebugUtilsMessengerCallbackEXT pfnUserCallback; + PTR32 pfnUserCallback; PTR32 pUserData; } VkDebugUtilsMessengerCreateInfoEXT32;
@@ -11159,7 +11159,7 @@ static inline void convert_VkDebugReportCallbackCreateInfoEXT_win32_to_host(cons out->sType = in->sType; out->pNext = NULL; out->flags = in->flags; - out->pfnCallback = in->pfnCallback; + out->pfnCallback = (PFN_vkDebugReportCallbackEXT)UlongToPtr(in->pfnCallback); out->pUserData = UlongToPtr(in->pUserData); if (in->pNext) FIXME("Unexpected pNext\n"); @@ -11174,7 +11174,7 @@ static inline void convert_VkDebugUtilsMessengerCreateInfoEXT_win32_to_host(cons out->flags = in->flags; out->messageSeverity = in->messageSeverity; out->messageType = in->messageType; - out->pfnUserCallback = in->pfnUserCallback; + out->pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)UlongToPtr(in->pfnUserCallback); out->pUserData = UlongToPtr(in->pUserData); if (in->pNext) FIXME("Unexpected pNext\n"); @@ -18141,7 +18141,7 @@ static inline void convert_VkInstanceCreateInfo_win32_to_host(struct conversion_ out_ext->sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; out_ext->pNext = NULL; out_ext->flags = in_ext->flags; - out_ext->pfnCallback = in_ext->pfnCallback; + out_ext->pfnCallback = (PFN_vkDebugReportCallbackEXT)UlongToPtr(in_ext->pfnCallback); out_ext->pUserData = UlongToPtr(in_ext->pUserData); out_header->pNext = (void *)out_ext; out_header = (void *)out_ext; @@ -18194,7 +18194,7 @@ static inline void convert_VkInstanceCreateInfo_win32_to_host(struct conversion_ out_ext->flags = in_ext->flags; out_ext->messageSeverity = in_ext->messageSeverity; out_ext->messageType = in_ext->messageType; - out_ext->pfnUserCallback = in_ext->pfnUserCallback; + out_ext->pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)UlongToPtr(in_ext->pfnUserCallback); out_ext->pUserData = UlongToPtr(in_ext->pUserData); out_header->pNext = (void *)out_ext; out_header = (void *)out_ext;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/loader.c | 10 +++++++--- dlls/winevulkan/vulkan.c | 16 ++++++++-------- dlls/winevulkan/vulkan_loader.h | 24 ++++++++++++------------ dlls/winevulkan/vulkan_private.h | 10 ++++------ 4 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index bd49b08057d..6e372d6319e 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -605,15 +605,19 @@ void WINAPI vkFreeCommandBuffers(VkDevice device, VkCommandPool cmd_pool, uint32 static NTSTATUS WINAPI call_vulkan_debug_report_callback( void *args, ULONG size ) { struct wine_vk_debug_report_params *params = args; - VkBool32 ret = params->user_callback(params->flags, params->object_type, params->object_handle, params->location, - params->code, params->layer_prefix, params->message, params->user_data); + PFN_vkDebugReportCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; + void *user_data = (void *)(UINT_PTR)params->user_data; + VkBool32 ret = callback(params->flags, params->object_type, params->object_handle, params->location, + params->code, params->layer_prefix, params->message, user_data); return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); }
static NTSTATUS WINAPI call_vulkan_debug_utils_callback( void *args, ULONG size ) { struct wine_vk_debug_utils_params *params = args; - VkBool32 ret = params->user_callback(params->severity, params->message_types, ¶ms->data, params->user_data); + PFN_vkDebugUtilsMessengerCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; + void *user_data = (void *)(UINT_PTR)params->user_data; + VkBool32 ret = callback(params->severity, params->message_types, ¶ms->data, user_data); return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); }
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index f6e06bcc085..835f8edddfe 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -600,8 +600,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context *
object->utils_messengers[i].instance = object; object->utils_messengers[i].host_debug_messenger = VK_NULL_HANDLE; - object->utils_messengers[i].user_callback = debug_utils_messenger->pfnUserCallback; - object->utils_messengers[i].user_data = debug_utils_messenger->pUserData; + object->utils_messengers[i].user_callback = (UINT_PTR)debug_utils_messenger->pfnUserCallback; + object->utils_messengers[i].user_data = (UINT_PTR)debug_utils_messenger->pUserData;
/* convert_VkInstanceCreateInfo_* already copied the chain, so we can modify it in-place. */ debug_utils_messenger->pfnUserCallback = (void *) &debug_utils_callback_conversion; @@ -612,8 +612,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * { object->default_callback.instance = object; object->default_callback.host_debug_callback = VK_NULL_HANDLE; - object->default_callback.user_callback = debug_report_callback->pfnCallback; - object->default_callback.user_data = debug_report_callback->pUserData; + object->default_callback.user_callback = (UINT_PTR)debug_report_callback->pfnCallback; + object->default_callback.user_data = (UINT_PTR)debug_report_callback->pUserData;
debug_report_callback->pfnCallback = (void *) &debug_report_callback_conversion; debug_report_callback->pUserData = &object->default_callback; @@ -2283,8 +2283,8 @@ VkResult wine_vkCreateDebugUtilsMessengerEXT(VkInstance handle, return VK_ERROR_OUT_OF_HOST_MEMORY;
object->instance = instance; - object->user_callback = create_info->pfnUserCallback; - object->user_data = create_info->pUserData; + object->user_callback = (UINT_PTR)create_info->pfnUserCallback; + object->user_data = (UINT_PTR)create_info->pUserData;
wine_create_info = *create_info;
@@ -2338,8 +2338,8 @@ VkResult wine_vkCreateDebugReportCallbackEXT(VkInstance handle, return VK_ERROR_OUT_OF_HOST_MEMORY;
object->instance = instance; - object->user_callback = create_info->pfnCallback; - object->user_data = create_info->pUserData; + object->user_callback = (UINT_PTR)create_info->pfnCallback; + object->user_data = (UINT_PTR)create_info->pUserData;
wine_create_info = *create_info;
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 710c07772fc..275aff425a7 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -109,24 +109,24 @@ void *wine_vk_get_instance_proc_addr(const char *name);
struct wine_vk_debug_utils_params { - PFN_vkDebugUtilsMessengerCallbackEXT user_callback; - void *user_data; + UINT64 user_callback; /* client pointer */ + UINT64 user_data; /* client pointer */
- VkDebugUtilsMessageSeverityFlagBitsEXT severity; - VkDebugUtilsMessageTypeFlagsEXT message_types; + UINT32 severity; + UINT32 message_types; VkDebugUtilsMessengerCallbackDataEXT data; };
struct wine_vk_debug_report_params { - PFN_vkDebugReportCallbackEXT user_callback; - void *user_data; - - VkDebugReportFlagsEXT flags; - VkDebugReportObjectTypeEXT object_type; - uint64_t object_handle; - size_t location; - int32_t code; + UINT64 user_callback; /* client pointer */ + UINT64 user_data; /* client pointer */ + + UINT32 flags; + UINT32 object_type; + UINT64 object_handle; + UINT64 location; + UINT32 code; const char *layer_prefix; const char *message; }; diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 5e66a6c9670..b4cbf12c949 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -103,9 +103,8 @@ struct wine_debug_report_callback struct wine_instance *instance; /* parent */ VkDebugReportCallbackEXT host_debug_callback;
- /* application callback + data */ - PFN_vkDebugReportCallbackEXT user_callback; - void *user_data; + UINT64 user_callback; /* client pointer */ + UINT64 user_data; /* client pointer */
struct wrapper_entry wrapper_entry; }; @@ -200,9 +199,8 @@ struct wine_debug_utils_messenger struct wine_instance *instance; /* parent */ VkDebugUtilsMessengerEXT host_debug_messenger;
- /* application callback + data */ - PFN_vkDebugUtilsMessengerCallbackEXT user_callback; - void *user_data; + UINT64 user_callback; /* client pointer */ + UINT64 user_data; /* client pointer */
struct wrapper_entry wrapper_entry; };
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/loader.c | 114 ++++++++++++++++++---- dlls/winevulkan/vulkan.c | 162 ++++++++++++++++++++++++-------- dlls/winevulkan/vulkan_loader.h | 37 +++++++- dlls/wow64win/user.c | 6 +- 4 files changed, 252 insertions(+), 67 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 6e372d6319e..5e32490e610 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -230,6 +230,101 @@ VkResult WINAPI vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *supported_ver return VK_SUCCESS; }
+static NTSTATUS WINAPI call_vulkan_debug_report_callback(void *args, ULONG size) +{ + struct wine_vk_debug_report_params *params = args; + PFN_vkDebugReportCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; + const char *strings = (char *)(params + 1), *layer = NULL, *message = NULL; + void *user_data = (void *)(UINT_PTR)params->user_data; + VkBool32 ret; + + if (params->layer_len) layer = strings; + strings += params->layer_len; + if (params->message_len) message = strings; + + ret = callback(params->flags, params->object_type, params->object_handle, params->location, + params->code, layer, message, user_data); + return NtCallbackReturn(&ret, sizeof(ret), STATUS_SUCCESS); +} + +static NTSTATUS WINAPI call_vulkan_debug_utils_callback(void *args, ULONG size) +{ + struct wine_vk_debug_utils_params *params = args; + PFN_vkDebugUtilsMessengerCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; + void *user_data = (void *)(UINT_PTR)params->user_data; + VkDeviceAddressBindingCallbackDataEXT address_binding = + { + .sType = VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT, + .flags = params->address_binding.flags, + .baseAddress = params->address_binding.base_address, + .size = params->address_binding.size, + .bindingType = params->address_binding.binding_type, + }; + VkDebugUtilsMessengerCallbackDataEXT data = + { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, + .flags = params->flags, + .messageIdNumber = params->message_id_number, + .queueLabelCount = params->queue_label_count, + .cmdBufLabelCount = params->cmd_buf_label_count, + .objectCount = params->object_count, + }; + VkDebugUtilsObjectNameInfoEXT *objects; + VkDebugUtilsLabelEXT *labels; + const char *ptr, *strings; + VkBool32 ret = VK_FALSE; + UINT i; + + size = sizeof(*params); + size += sizeof(struct debug_utils_label) * (data.queueLabelCount + data.cmdBufLabelCount); + size += sizeof(struct debug_utils_object) * data.objectCount; + + ptr = (char *)(params + 1); + strings = (char *)(params + size); + + if (params->has_address_binding) data.pNext = &address_binding; + if (params->message_id_name_len) data.pMessageIdName = strings; + strings += params->message_id_name_len; + if (params->message_len) data.pMessage = strings; + strings += params->message_len; + + if ((labels = calloc(data.queueLabelCount + data.cmdBufLabelCount + 1, sizeof(*data.pQueueLabels))) && + (objects = calloc(data.objectCount + 1, sizeof(*data.pObjects)))) + { + for (i = 0; i < data.queueLabelCount + data.cmdBufLabelCount; i++) + { + struct debug_utils_label *label = (struct debug_utils_label *)ptr; + labels[i].sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT; + memcpy(labels[i].color, label->color, sizeof(label->color)); + if (label->label_name_len) labels[i].pLabelName = strings; + strings += label->label_name_len; + ptr += sizeof(*label); + } + if (data.queueLabelCount) data.pQueueLabels = labels; + labels += data.queueLabelCount; + if (data.cmdBufLabelCount) data.pCmdBufLabels = labels; + + for (i = 0; i < data.objectCount; i++) + { + struct debug_utils_object *object = (struct debug_utils_object *)ptr; + objects[i].sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + objects[i].objectType = object->object_type; + objects[i].objectHandle = object->object_handle; + if (object->object_name_len) objects[i].pObjectName = strings; + strings += object->object_name_len; + ptr += sizeof(*object); + } + data.pObjects = objects; + + ret = callback(params->severity, params->message_types, &data, user_data); + + free(objects); + } + free(labels); + + return NtCallbackReturn(&ret, sizeof(ret), STATUS_SUCCESS); +} + static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) { return !__wine_init_unix_call() && !UNIX_CALL(init, NULL); @@ -602,25 +697,6 @@ void WINAPI vkFreeCommandBuffers(VkDevice device, VkCommandPool cmd_pool, uint32 } }
-static NTSTATUS WINAPI call_vulkan_debug_report_callback( void *args, ULONG size ) -{ - struct wine_vk_debug_report_params *params = args; - PFN_vkDebugReportCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; - void *user_data = (void *)(UINT_PTR)params->user_data; - VkBool32 ret = callback(params->flags, params->object_type, params->object_handle, params->location, - params->code, params->layer_prefix, params->message, user_data); - return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); -} - -static NTSTATUS WINAPI call_vulkan_debug_utils_callback( void *args, ULONG size ) -{ - struct wine_vk_debug_utils_params *params = args; - PFN_vkDebugUtilsMessengerCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; - void *user_data = (void *)(UINT_PTR)params->user_data; - VkBool32 ret = callback(params->severity, params->message_types, ¶ms->data, user_data); - return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); -} - BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { KERNEL_CALLBACK_PROC *kernel_callback_table; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 835f8edddfe..041fb4c4c4b 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -169,16 +169,45 @@ static uint64_t client_handle_from_host(struct wine_instance *instance, uint64_t return result; }
+static UINT append_string(const char *name, char *strings, UINT *strings_len) +{ + UINT len = name ? strlen(name) + 1 : 0; + if (strings && len) memcpy(strings + *strings_len, name, len); + *strings_len += len; + return len; +} + +static void append_debug_utils_label(const VkDebugUtilsLabelEXT *label, struct debug_utils_label *dst, + char *strings, UINT *strings_len) +{ + if (label->pNext) FIXME("Unsupported VkDebugUtilsLabelEXT pNext chain\n"); + memcpy(dst->color, label->color, sizeof(dst->color)); + dst->label_name_len = append_string(label->pLabelName, strings, strings_len); +} + +static void append_debug_utils_object(const VkDebugUtilsObjectNameInfoEXT *object, struct debug_utils_object *dst, + char *strings, UINT *strings_len) +{ + if (object->pNext) FIXME("Unsupported VkDebugUtilsObjectNameInfoEXT pNext chain\n"); + dst->object_type = object->objectType; + dst->object_handle = object->objectHandle; + dst->object_name_len = append_string(object->pObjectName, strings, strings_len); +} + static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT message_types, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data) { - struct wine_vk_debug_utils_params params; - VkDebugUtilsObjectNameInfoEXT *object_name_infos; + const VkDeviceAddressBindingCallbackDataEXT *address = NULL; + struct wine_vk_debug_utils_params *params; struct wine_debug_utils_messenger *object; - void *ret_ptr; + struct debug_utils_object dummy_object, *objects; + struct debug_utils_label dummy_label, *labels; + UINT size, strings_len; + char *ptr, *strings; ULONG ret_len; + void *ret_ptr; unsigned int i;
TRACE("%i, %u, %p, %p\n", severity, message_types, callback_data, user_data); @@ -191,44 +220,85 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB return VK_FALSE; }
- /* FIXME: we should pack all referenced structs instead of passing pointers */ - params.user_callback = object->user_callback; - params.user_data = object->user_data; - params.severity = severity; - params.message_types = message_types; - params.data = *((VkDebugUtilsMessengerCallbackDataEXT *) callback_data); + if ((address = callback_data->pNext)) + { + if (address->sType != VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT) address = NULL; + if (!address || address->pNext) FIXME("Unsupported VkDebugUtilsMessengerCallbackDataEXT pNext chain\n"); + } + + strings_len = 0; + append_string(callback_data->pMessageIdName, NULL, &strings_len); + append_string(callback_data->pMessage, NULL, &strings_len); + for (i = 0; i < callback_data->queueLabelCount; i++) + append_debug_utils_label(callback_data->pQueueLabels + i, &dummy_label, NULL, &strings_len); + for (i = 0; i < callback_data->cmdBufLabelCount; i++) + append_debug_utils_label(callback_data->pCmdBufLabels + i, &dummy_label, NULL, &strings_len); + for (i = 0; i < callback_data->objectCount; i++) + append_debug_utils_object(callback_data->pObjects + i, &dummy_object, NULL, &strings_len); + + size = sizeof(*params); + size += sizeof(*labels) * (callback_data->queueLabelCount + callback_data->cmdBufLabelCount); + size += sizeof(*object) * callback_data->objectCount;
- object_name_infos = calloc(params.data.objectCount, sizeof(*object_name_infos)); + if (!(params = malloc(size + strings_len))) return VK_FALSE; + ptr = (char *)(params + 1); + strings = (char *)(params + size);
- for (i = 0; i < params.data.objectCount; i++) + params->user_callback = object->user_callback; + params->user_data = object->user_data; + params->severity = severity; + params->message_types = message_types; + params->flags = callback_data->flags; + params->message_id_number = callback_data->messageIdNumber; + + strings_len = 0; + params->message_id_name_len = append_string(callback_data->pMessageIdName, strings, &strings_len); + params->message_len = append_string(callback_data->pMessage, strings, &strings_len); + + labels = (void *)ptr; + for (i = 0; i < callback_data->queueLabelCount; i++) + append_debug_utils_label(callback_data->pQueueLabels + i, labels + i, strings, &strings_len); + params->queue_label_count = callback_data->queueLabelCount; + ptr += callback_data->queueLabelCount * sizeof(*labels); + + labels = (void *)ptr; + for (i = 0; i < callback_data->cmdBufLabelCount; i++) + append_debug_utils_label(callback_data->pCmdBufLabels + i, labels + i, strings, &strings_len); + params->cmd_buf_label_count = callback_data->cmdBufLabelCount; + ptr += callback_data->cmdBufLabelCount * sizeof(*labels); + + objects = (void *)ptr; + for (i = 0; i < callback_data->objectCount; i++) { - object_name_infos[i].sType = callback_data->pObjects[i].sType; - object_name_infos[i].pNext = callback_data->pObjects[i].pNext; - object_name_infos[i].objectType = callback_data->pObjects[i].objectType; - object_name_infos[i].pObjectName = callback_data->pObjects[i].pObjectName; + append_debug_utils_object(callback_data->pObjects + i, objects + i, strings, &strings_len);
- if (wine_vk_is_type_wrapped(callback_data->pObjects[i].objectType)) + if (wine_vk_is_type_wrapped(objects[i].object_type)) { - object_name_infos[i].objectHandle = client_handle_from_host(object->instance, callback_data->pObjects[i].objectHandle); - if (!object_name_infos[i].objectHandle) + objects[i].object_handle = client_handle_from_host(object->instance, objects[i].object_handle); + if (!objects[i].object_handle) { WARN("handle conversion failed 0x%s\n", wine_dbgstr_longlong(callback_data->pObjects[i].objectHandle)); - free(object_name_infos); + free(params); return VK_FALSE; } } - else - { - object_name_infos[i].objectHandle = callback_data->pObjects[i].objectHandle; - } } + params->object_count = callback_data->objectCount; + ptr += callback_data->objectCount * sizeof(*objects);
- params.data.pObjects = object_name_infos; + if (address) + { + params->has_address_binding = TRUE; + params->address_binding.flags = address->flags; + params->address_binding.base_address = address->baseAddress; + params->address_binding.size = address->size; + params->address_binding.binding_type = address->bindingType; + }
/* applications should always return VK_FALSE */ - KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, ¶ms, sizeof(params), &ret_ptr, &ret_len ); + KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, params, size + strings_len, &ret_ptr, &ret_len ); + free(params);
- free(object_name_infos); if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; return VK_FALSE; } @@ -236,10 +306,12 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT object_type, 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 wine_vk_debug_report_params *params; struct wine_debug_report_callback *object; - void *ret_ptr; + UINT strings_len; ULONG ret_len; + void *ret_ptr; + char *strings;
TRACE("%#x, %#x, 0x%s, 0x%s, %d, %p, %p, %p\n", flags, object_type, wine_dbgstr_longlong(object_handle), wine_dbgstr_longlong(location), code, layer_prefix, message, user_data); @@ -252,21 +324,29 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk return VK_FALSE; }
- /* FIXME: we should pack all referenced structs instead of passing pointers */ - params.user_callback = object->user_callback; - params.user_data = object->user_data; - params.flags = flags; - params.object_type = object_type; - params.location = location; - params.code = code; - params.layer_prefix = layer_prefix; - params.message = message; + strings_len = 0; + append_string(layer_prefix, NULL, &strings_len); + append_string(message, NULL, &strings_len); + + if (!(params = malloc(sizeof(*params) + strings_len))) return VK_FALSE; + strings = (char *)(params + 1); + + params->user_callback = object->user_callback; + params->user_data = object->user_data; + params->flags = flags; + params->object_type = object_type; + params->location = location; + params->code = code; + params->object_handle = client_handle_from_host(object->instance, object_handle); + if (!params->object_handle) params->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT; + + strings_len = 0; + params->layer_len = append_string(layer_prefix, strings, &strings_len); + params->message_len = append_string(message, strings, &strings_len);
- params.object_handle = client_handle_from_host(object->instance, object_handle); - if (!params.object_handle) - params.object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT; + KeUserModeCallback(NtUserCallVulkanDebugReportCallback, params, sizeof(*params) + strings_len, &ret_ptr, &ret_len); + free(params);
- KeUserModeCallback( NtUserCallVulkanDebugReportCallback, ¶ms, sizeof(params), &ret_ptr, &ret_len ); if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; return VK_FALSE; } diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 275aff425a7..2b5e734a68b 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -107,6 +107,27 @@ void *wine_vk_get_instance_proc_addr(const char *name);
/* debug callbacks params */
+struct debug_utils_label +{ + UINT32 label_name_len; + float color[4]; +}; + +struct debug_utils_object +{ + UINT32 object_type; + UINT64 object_handle; + UINT32 object_name_len; +}; + +struct debug_device_address_binding +{ + UINT32 flags; + UINT64 base_address; + UINT64 size; + UINT32 binding_type; +}; + struct wine_vk_debug_utils_params { UINT64 user_callback; /* client pointer */ @@ -114,7 +135,17 @@ struct wine_vk_debug_utils_params
UINT32 severity; UINT32 message_types; - VkDebugUtilsMessengerCallbackDataEXT data; + UINT32 flags; + UINT32 message_id_number; + + UINT32 message_id_name_len; + UINT32 message_len; + UINT32 queue_label_count; + UINT32 cmd_buf_label_count; + UINT32 object_count; + + UINT8 has_address_binding; + struct debug_device_address_binding address_binding; };
struct wine_vk_debug_report_params @@ -127,8 +158,8 @@ struct wine_vk_debug_report_params UINT64 object_handle; UINT64 location; UINT32 code; - const char *layer_prefix; - const char *message; + UINT32 layer_len; + UINT32 message_len; };
struct is_available_instance_function_params diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 2f41820abbd..dcc613b96c2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1457,14 +1457,12 @@ static NTSTATUS WINAPI wow64_NtUserThunkLock( void *arg, ULONG size )
static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) { - FIXME( "\n" ); - return 0; + return dispatch_callback( NtUserCallVulkanDebugReportCallback, arg, size ); }
static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size ) { - FIXME( "\n" ); - return 0; + return dispatch_callback( NtUserCallVulkanDebugUtilsCallback, arg, size ); }
static NTSTATUS WINAPI wow64_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size )
v2: Fix a couple of typos, fix WOW64 translation, dispatch the WOW64 callbacks.