mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 19:27:17 +00:00
winevulkan: Use KeUserModeCallback for debug callbacks.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1facdbbdcb
commit
bfc3a28670
|
@ -214,7 +214,7 @@ static void dpiaware_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const void *kernel_callback_table[] =
|
static const void *kernel_callback_table[NtUserCallCount] =
|
||||||
{
|
{
|
||||||
User32CallEnumDisplayMonitor,
|
User32CallEnumDisplayMonitor,
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include "vulkan_loader.h"
|
#include "vulkan_loader.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "winuser.h"
|
#include "ntuser.h"
|
||||||
#include "initguid.h"
|
#include "initguid.h"
|
||||||
#include "devguid.h"
|
#include "devguid.h"
|
||||||
#include "setupapi.h"
|
#include "setupapi.h"
|
||||||
|
@ -373,8 +373,21 @@ void WINAPI vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev,
|
||||||
fill_luid_property(properties2);
|
fill_luid_property(properties2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
|
||||||
{
|
{
|
||||||
|
void **kernel_callback_table;
|
||||||
|
|
||||||
TRACE("%p, %u, %p\n", hinst, reason, reserved);
|
TRACE("%p, %u, %p\n", hinst, reason, reserved);
|
||||||
|
|
||||||
switch (reason)
|
switch (reason)
|
||||||
|
@ -382,6 +395,10 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
hinstance = hinst;
|
hinstance = hinst;
|
||||||
DisableThreadLibraryCalls(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;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -27,8 +27,7 @@
|
||||||
|
|
||||||
#include "vulkan_private.h"
|
#include "vulkan_private.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "winuser.h"
|
#include "ntuser.h"
|
||||||
#include "winternl.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
|
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
|
||||||
|
|
||||||
|
@ -115,9 +114,11 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
|
||||||
const VkDebugUtilsMessengerCallbackDataEXT_host *callback_data,
|
const VkDebugUtilsMessengerCallbackDataEXT_host *callback_data,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct VkDebugUtilsMessengerCallbackDataEXT wine_callback_data;
|
struct wine_vk_debug_utils_params params;
|
||||||
VkDebugUtilsObjectNameInfoEXT *object_name_infos;
|
VkDebugUtilsObjectNameInfoEXT *object_name_infos;
|
||||||
struct wine_debug_utils_messenger *object;
|
struct wine_debug_utils_messenger *object;
|
||||||
|
void *ret_ptr;
|
||||||
|
ULONG ret_len;
|
||||||
VkBool32 result;
|
VkBool32 result;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -131,11 +132,16 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
|
||||||
return VK_FALSE;
|
return VK_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_callback_data = *((VkDebugUtilsMessengerCallbackDataEXT *) callback_data);
|
/* 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);
|
||||||
|
|
||||||
object_name_infos = calloc(wine_callback_data.objectCount, sizeof(*object_name_infos));
|
object_name_infos = calloc(params.data.objectCount, sizeof(*object_name_infos));
|
||||||
|
|
||||||
for (i = 0; i < wine_callback_data.objectCount; i++)
|
for (i = 0; i < params.data.objectCount; i++)
|
||||||
{
|
{
|
||||||
object_name_infos[i].sType = callback_data->pObjects[i].sType;
|
object_name_infos[i].sType = callback_data->pObjects[i].sType;
|
||||||
object_name_infos[i].pNext = callback_data->pObjects[i].pNext;
|
object_name_infos[i].pNext = callback_data->pObjects[i].pNext;
|
||||||
|
@ -158,10 +164,11 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_callback_data.pObjects = object_name_infos;
|
params.data.pObjects = object_name_infos;
|
||||||
|
|
||||||
/* applications should always return VK_FALSE */
|
/* applications should always return VK_FALSE */
|
||||||
result = object->user_callback(severity, message_types, &wine_callback_data, object->user_data);
|
result = KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, ¶ms, sizeof(params),
|
||||||
|
&ret_ptr, &ret_len );
|
||||||
|
|
||||||
free(object_name_infos);
|
free(object_name_infos);
|
||||||
|
|
||||||
|
@ -171,7 +178,10 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
|
||||||
static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT object_type,
|
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)
|
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_debug_report_callback *object;
|
struct wine_debug_report_callback *object;
|
||||||
|
void *ret_ptr;
|
||||||
|
ULONG ret_len;
|
||||||
|
|
||||||
TRACE("%#x, %#x, 0x%s, 0x%s, %d, %p, %p, %p\n", flags, object_type, wine_dbgstr_longlong(object_handle),
|
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);
|
wine_dbgstr_longlong(location), code, layer_prefix, message, user_data);
|
||||||
|
@ -184,12 +194,22 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk
|
||||||
return VK_FALSE;
|
return VK_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
object_handle = wine_vk_get_wrapper(object->instance, object_handle);
|
/* FIXME: we should pack all referenced structs instead of passing pointers */
|
||||||
if (!object_handle)
|
params.user_callback = object->user_callback;
|
||||||
object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
|
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;
|
||||||
|
|
||||||
return object->user_callback(
|
params.object_handle = wine_vk_get_wrapper(object->instance, object_handle);
|
||||||
flags, object_type, object_handle, location, code, layer_prefix, message, object->user_data);
|
if (!params.object_handle)
|
||||||
|
params.object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
|
||||||
|
|
||||||
|
return KeUserModeCallback( NtUserCallVulkanDebugReportCallback, ¶ms, sizeof(params),
|
||||||
|
&ret_ptr, &ret_len );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wine_vk_physical_device_free(struct VkPhysicalDevice_T *phys_dev)
|
static void wine_vk_physical_device_free(struct VkPhysicalDevice_T *phys_dev)
|
||||||
|
|
|
@ -69,6 +69,32 @@ 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_phys_dev_proc_addr(const char *name) DECLSPEC_HIDDEN;
|
||||||
void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
|
void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
/* debug callbacks params */
|
||||||
|
|
||||||
|
struct wine_vk_debug_utils_params
|
||||||
|
{
|
||||||
|
PFN_vkDebugUtilsMessengerCallbackEXT user_callback;
|
||||||
|
void *user_data;
|
||||||
|
|
||||||
|
VkDebugUtilsMessageSeverityFlagBitsEXT severity;
|
||||||
|
VkDebugUtilsMessageTypeFlagsEXT 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;
|
||||||
|
const char *layer_prefix;
|
||||||
|
const char *message;
|
||||||
|
};
|
||||||
|
|
||||||
extern const struct unix_funcs *unix_funcs;
|
extern const struct unix_funcs *unix_funcs;
|
||||||
extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
|
extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
NtUserCallEnumDisplayMonitor,
|
NtUserCallEnumDisplayMonitor,
|
||||||
|
NtUserCallVulkanDebugReportCallback,
|
||||||
|
NtUserCallVulkanDebugUtilsCallback,
|
||||||
|
NtUserCallCount
|
||||||
};
|
};
|
||||||
|
|
||||||
/* NtUserCallEnumDisplayMonitor params */
|
/* NtUserCallEnumDisplayMonitor params */
|
||||||
|
|
Loading…
Reference in a new issue