-
Notifications
You must be signed in to change notification settings - Fork 1
/
VulkanDebug.cpp
67 lines (57 loc) · 2.45 KB
/
VulkanDebug.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "VulkanDebug.h"
VulkanEngineApplication::VulkanDebug::VulkanDebug(const VulkanEngineApplication::VulkanData * vulkanData) : vulkanData(const_cast<VulkanEngineApplication::VulkanData *>(vulkanData)) {
}
VulkanEngineApplication::VulkanDebug::~VulkanDebug() {
destroyDebugReportCallbackEXT(vulkanData->vulkanInstance, mCallbackDebugReport, nullptr);
}
void VulkanEngineApplication::VulkanDebug::initialize(void) {
setupDebugReport();
}
VkResult VulkanEngineApplication::VulkanDebug::createDebugReportCallbackEXT(VkInstance mxInstance,
const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
const VkAllocationCallbacks *mAllocators,
VkDebugReportCallbackEXT *pCallback)
{
auto mFunc = reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>(
vkGetInstanceProcAddr(mxInstance, "vkCreateDebugReportCallbackEXT"));
if (mFunc != nullptr)
return mFunc(mxInstance, pCreateInfo, mAllocators, pCallback);
else
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
void VulkanEngineApplication::VulkanDebug::destroyDebugReportCallbackEXT(
VkInstance mxInstance,
VkDebugReportCallbackEXT pCallback,
const VkAllocationCallbacks * mAllocators)
{
auto mFunc = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT> (
vkGetInstanceProcAddr(mxInstance, "vkDestroyDebugReportCallbackEXT"));
if (mFunc != nullptr)
mFunc(mxInstance, pCallback, mAllocators);
else
throw std::runtime_error("[ERR]\t vkDestroyDebugReportCallbackEXT is not find!");
}
void VulkanEngineApplication::VulkanDebug::setupDebugReport(void)
{
VkDebugReportCallbackCreateInfoEXT mDebugReportCallbackCreateInfoStruct = {};
mDebugReportCallbackCreateInfoStruct.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
mDebugReportCallbackCreateInfoStruct.flags = VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT;
mDebugReportCallbackCreateInfoStruct.pfnCallback = debugCallback;
mDebugReportCallbackCreateInfoStruct.pUserData = this;
if (createDebugReportCallbackEXT(vulkanData->vulkanInstance, &mDebugReportCallbackCreateInfoStruct, nullptr, &mCallbackDebugReport) != VK_SUCCESS) {
throw std::runtime_error("Failed to set up debug callback!");
}
}
VKAPI_ATTR VkBool32 VKAPI_CALL VulkanEngineApplication::VulkanDebug::debugCallback(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objType,
uint64_t obj,
size_t location,
int32_t code,
const char * layerPrefix,
const char * msg,
void * userData)
{
std::cout << "[DBG]\tValidation Layer: " << msg << std::endl;
return VK_FALSE;
}