Browse Source

[WIP] Fix Debug callback setup

Signed-off-by: Squareys <Squareys@googlemail.com>
pull/202/head
Squareys 10 years ago committed by Jonathan Hale
parent
commit
f5d3c94b6f
  1. 80
      src/Magnum/Vk/Context.cpp

80
src/Magnum/Vk/Context.cpp

@ -30,12 +30,6 @@
#include <Corrade/Utility/String.h> #include <Corrade/Utility/String.h>
#include "vulkan.h" #include "vulkan.h"
PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback;
PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback;
PFN_vkDebugReportMessageEXT dbgBreakCallback;
VkDebugReportCallbackEXT msgCallback;
namespace Magnum { namespace Vk { namespace Magnum { namespace Vk {
const char *validationLayerNames[] = const char *validationLayerNames[] =
@ -79,7 +73,7 @@ Context::~Context() {
} }
if (_flags >= Flag::EnableValidation) { if (_flags >= Flag::EnableValidation) {
DestroyDebugReportCallback(_instance, msgCallback, nullptr); //DestroyDebugReportCallback(_instance, msgCallback, nullptr);
} }
vkDestroyInstance(_instance, nullptr); vkDestroyInstance(_instance, nullptr);
} }
@ -89,16 +83,18 @@ void Context::create() {
if(!tryCreate()) std::exit(1); if(!tryCreate()) std::exit(1);
} }
VkBool32 messageCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback(
uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData) { VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { uint64_t object,
Error() << "[" << pLayerPrefix << "] Code" << msgCode << ":" << pMsg; size_t location,
} else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { int32_t messageCode,
Warning() << "[" << pLayerPrefix << "] Code" << msgCode << ":" << pMsg; const char* pLayerPrefix,
} const char* pMessage,
void* pUserData)
return false; {
Error() << pMessage;
return VK_FALSE;
} }
bool Context::tryCreate() { bool Context::tryCreate() {
@ -108,9 +104,9 @@ bool Context::tryCreate() {
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "Vulkan Example"; appInfo.pApplicationName = "Vulkan Example";
appInfo.pEngineName = "Magnum"; appInfo.pEngineName = "Magnum";
appInfo.apiVersion = UnsignedInt(_version); appInfo.apiVersion = VK_API_VERSION_1_0;
std::vector<const char*> enabledExtensions = { VK_KHR_SURFACE_EXTENSION_NAME }; std::vector<const char*> enabledExtensions = {VK_KHR_SURFACE_EXTENSION_NAME, "VK_KHR_win32_surface"};
// Enable surface extensions depending on os // Enable surface extensions depending on os
//enabledExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); //enabledExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
@ -120,11 +116,13 @@ bool Context::tryCreate() {
instanceCreateInfo.pNext = nullptr; instanceCreateInfo.pNext = nullptr;
instanceCreateInfo.pApplicationInfo = &appInfo; instanceCreateInfo.pApplicationInfo = &appInfo;
if (_flags >= Flag::EnableValidation) { if (_flags >= Flag::EnableValidation) {
Debug() << "Enabling Validation";
enabledExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); enabledExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
instanceCreateInfo.enabledLayerCount = 1; instanceCreateInfo.enabledLayerCount = layerCount;
instanceCreateInfo.ppEnabledLayerNames = validationLayerNames; instanceCreateInfo.ppEnabledLayerNames = validationLayerNames;
} }
if (!enabledExtensions.empty()) { if (!enabledExtensions.empty()) {
instanceCreateInfo.enabledExtensionCount = enabledExtensions.size(); instanceCreateInfo.enabledExtensionCount = enabledExtensions.size();
instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data(); instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
@ -140,21 +138,33 @@ bool Context::tryCreate() {
/* setup debugging */ /* setup debugging */
if (_flags >= Flag::EnableValidation) { if (_flags >= Flag::EnableValidation) {
CreateDebugReportCallback = PFN_vkCreateDebugReportCallbackEXT(vkGetInstanceProcAddr(_instance, "vkCreateDebugReportCallbackEXT")); /* Load VK_EXT_debug_report entry points in debug builds */
DestroyDebugReportCallback = PFN_vkDestroyDebugReportCallbackEXT(vkGetInstanceProcAddr(_instance, "vkDestroyDebugReportCallbackEXT")); PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT =
dbgBreakCallback = PFN_vkDebugReportMessageEXT(vkGetInstanceProcAddr(_instance, "vkDebugReportMessageEXT")); reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>
(vkGetInstanceProcAddr(_instance, "vkCreateDebugReportCallbackEXT"));
VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = {}; PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT =
dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; reinterpret_cast<PFN_vkDebugReportMessageEXT>
dbgCreateInfo.pfnCallback = PFN_vkDebugReportCallbackEXT(messageCallback); (vkGetInstanceProcAddr(_instance, "vkDebugReportMessageEXT"));
dbgCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT =
reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>
VkResult err = CreateDebugReportCallback( (vkGetInstanceProcAddr(_instance, "vkDestroyDebugReportCallbackEXT"));
_instance,
&dbgCreateInfo, /* Setup callback creation information */
nullptr, VkDebugReportCallbackCreateInfoEXT callbackCreateInfo;
&msgCallback); callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
assert(!err); 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; return true;
} }

Loading…
Cancel
Save