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 "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<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
//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<PFN_vkCreateDebugReportCallbackEXT>
(vkGetInstanceProcAddr(_instance, "vkCreateDebugReportCallbackEXT"));
PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT =
reinterpret_cast<PFN_vkDebugReportMessageEXT>
(vkGetInstanceProcAddr(_instance, "vkDebugReportMessageEXT"));
PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT =
reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>
(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;
}

Loading…
Cancel
Save