From f5d3c94b6f88b5aa95a02325f79175e14f78592c Mon Sep 17 00:00:00 2001 From: Squareys Date: Sun, 1 May 2016 19:50:51 +0200 Subject: [PATCH] [WIP] Fix Debug callback setup Signed-off-by: Squareys --- src/Magnum/Vk/Context.cpp | 80 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/src/Magnum/Vk/Context.cpp b/src/Magnum/Vk/Context.cpp index 8704c00b4..7e2953b3b 100644 --- a/src/Magnum/Vk/Context.cpp +++ b/src/Magnum/Vk/Context.cpp @@ -30,12 +30,6 @@ #include #include "vulkan.h" -PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback; -PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback; -PFN_vkDebugReportMessageEXT dbgBreakCallback; - -VkDebugReportCallbackEXT msgCallback; - namespace Magnum { namespace Vk { const char *validationLayerNames[] = @@ -79,7 +73,7 @@ Context::~Context() { } if (_flags >= Flag::EnableValidation) { - DestroyDebugReportCallback(_instance, msgCallback, nullptr); + //DestroyDebugReportCallback(_instance, msgCallback, nullptr); } vkDestroyInstance(_instance, nullptr); } @@ -89,16 +83,18 @@ void Context::create() { if(!tryCreate()) std::exit(1); } -VkBool32 messageCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, - uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData) { - - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { - Error() << "[" << pLayerPrefix << "] Code" << msgCode << ":" << pMsg; - } else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { - Warning() << "[" << pLayerPrefix << "] Code" << msgCode << ":" << pMsg; - } - - return false; +VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback( + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char* pMessage, + void* pUserData) +{ + Error() << pMessage; + return VK_FALSE; } bool Context::tryCreate() { @@ -108,9 +104,9 @@ bool Context::tryCreate() { appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = "Vulkan Example"; appInfo.pEngineName = "Magnum"; - appInfo.apiVersion = UnsignedInt(_version); + appInfo.apiVersion = VK_API_VERSION_1_0; - std::vector enabledExtensions = { VK_KHR_SURFACE_EXTENSION_NAME }; + std::vector enabledExtensions = {VK_KHR_SURFACE_EXTENSION_NAME, "VK_KHR_win32_surface"}; // Enable surface extensions depending on os //enabledExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -120,11 +116,13 @@ bool Context::tryCreate() { instanceCreateInfo.pNext = nullptr; instanceCreateInfo.pApplicationInfo = &appInfo; if (_flags >= Flag::EnableValidation) { + Debug() << "Enabling Validation"; enabledExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); - instanceCreateInfo.enabledLayerCount = 1; + instanceCreateInfo.enabledLayerCount = layerCount; instanceCreateInfo.ppEnabledLayerNames = validationLayerNames; } + if (!enabledExtensions.empty()) { instanceCreateInfo.enabledExtensionCount = enabledExtensions.size(); instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data(); @@ -140,21 +138,33 @@ bool Context::tryCreate() { /* setup debugging */ if (_flags >= Flag::EnableValidation) { - CreateDebugReportCallback = PFN_vkCreateDebugReportCallbackEXT(vkGetInstanceProcAddr(_instance, "vkCreateDebugReportCallbackEXT")); - DestroyDebugReportCallback = PFN_vkDestroyDebugReportCallbackEXT(vkGetInstanceProcAddr(_instance, "vkDestroyDebugReportCallbackEXT")); - dbgBreakCallback = PFN_vkDebugReportMessageEXT(vkGetInstanceProcAddr(_instance, "vkDebugReportMessageEXT")); - - VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = {}; - dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; - dbgCreateInfo.pfnCallback = PFN_vkDebugReportCallbackEXT(messageCallback); - dbgCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; - - VkResult err = CreateDebugReportCallback( - _instance, - &dbgCreateInfo, - nullptr, - &msgCallback); - assert(!err); + /* Load VK_EXT_debug_report entry points in debug builds */ + PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT = + reinterpret_cast + (vkGetInstanceProcAddr(_instance, "vkCreateDebugReportCallbackEXT")); + PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT = + reinterpret_cast + (vkGetInstanceProcAddr(_instance, "vkDebugReportMessageEXT")); + PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = + reinterpret_cast + (vkGetInstanceProcAddr(_instance, "vkDestroyDebugReportCallbackEXT")); + + /* Setup callback creation information */ + VkDebugReportCallbackCreateInfoEXT callbackCreateInfo; + callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + callbackCreateInfo.pNext = nullptr; + callbackCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | + VK_DEBUG_REPORT_WARNING_BIT_EXT | + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + callbackCreateInfo.pfnCallback = &MyDebugReportCallback; + callbackCreateInfo.pUserData = nullptr; + + /* Register the callback */ + VkDebugReportCallbackEXT callback; + VkResult err = vkCreateDebugReportCallbackEXT(_instance, &callbackCreateInfo, nullptr, &callback); + if (err != VK_SUCCESS) { + Error() << "Could not setup Debug callback"; + } } return true; }