|
|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
|