From bac430f14a528ec2c46f0ab145ac28fe00cdb152 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 10 Aug 2017 11:01:17 -0600 Subject: layers: GH1991, Implement BREAK debug action Change-Id: I19ee76db3a380116c7c25819a112751d988e23b4 --- layers/vk_layer_logging.h | 15 +++++++++++++++ layers/vk_layer_utils.cpp | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h index 7cf113bf..7a565645 100644 --- a/layers/vk_layer_logging.h +++ b/layers/vk_layer_logging.h @@ -28,6 +28,7 @@ #include "vk_layer_table.h" #include "vk_loader_platform.h" #include "vulkan/vk_layer.h" +#include #include #include #include @@ -35,6 +36,7 @@ #include #include + typedef struct _debug_report_data { VkLayerDbgFunctionNode *debug_callback_list; VkLayerDbgFunctionNode *default_debug_callback_list; @@ -399,6 +401,19 @@ static inline VKAPI_ATTR VkBool32 VKAPI_CALL win32_debug_output_msg(VkFlags msgF return false; } +static inline VKAPI_ATTR VkBool32 VKAPI_CALL DebugBreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg, void *pUserData) { +#ifdef WIN32 + DebugBreak(); +#else + raise(SIGTRAP); +#endif + + return false; +} + + // TODO: Could be autogenerated for the specific handles for extra type safety... template static inline uint64_t HandleToUint64(HANDLE_T *h) { diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp index 31bedd8d..367c0bf1 100644 --- a/layers/vk_layer_utils.cpp +++ b/layers/vk_layer_utils.cpp @@ -133,4 +133,18 @@ VK_LAYER_EXPORT void layer_debug_actions(debug_report_data *report_data, std::ve layer_create_msg_callback(report_data, default_layer_callback, &dbgCreateInfo, pAllocator, &callback); logging_callback.push_back(callback); } + + callback = VK_NULL_HANDLE; + + if (debug_action & VK_DBG_LAYER_ACTION_BREAK) { + VkDebugReportCallbackCreateInfoEXT dbgCreateInfo; + memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo)); + dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + dbgCreateInfo.flags = report_flags; + dbgCreateInfo.pfnCallback = DebugBreakCallback; + dbgCreateInfo.pUserData = NULL; + layer_create_msg_callback(report_data, default_layer_callback, &dbgCreateInfo, pAllocator, &callback); + logging_callback.push_back(callback); + } + } -- cgit v1.2.3