diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-08-10 11:01:17 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-08-10 14:20:32 -0600 |
| commit | bac430f14a528ec2c46f0ab145ac28fe00cdb152 (patch) | |
| tree | cfddb15b29b8188c924346c3e7dc2ae2ab6618a8 | |
| parent | 273c0f252825381eceefd6a7e63d243d3a1205fb (diff) | |
| download | usermoji-bac430f14a528ec2c46f0ab145ac28fe00cdb152.tar.xz | |
layers: GH1991, Implement BREAK debug action
Change-Id: I19ee76db3a380116c7c25819a112751d988e23b4
| -rw-r--r-- | layers/vk_layer_logging.h | 15 | ||||
| -rw-r--r-- | layers/vk_layer_utils.cpp | 14 |
2 files changed, 29 insertions, 0 deletions
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 <signal.h> #include <cinttypes> #include <stdarg.h> #include <stdbool.h> @@ -35,6 +36,7 @@ #include <unordered_map> #include <vector> + 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 <typename HANDLE_T> 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); + } + } |
