-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathdebug_messenger.cc
104 lines (83 loc) · 4.01 KB
/
debug_messenger.cc
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <vkpp/debug_messenger.hh>
#include <vkpp/exception.hh>
#include <iostream>
namespace vkpp {
static VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_callback(
VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
VkDebugUtilsMessageTypeFlagsEXT,
const VkDebugUtilsMessengerCallbackDataEXT* message_data,
void* usrdata) {
const auto minimum_severity = *reinterpret_cast<DebugMessenger::Severity*>(usrdata);
const auto severity_bit = (VkDebugUtilsMessageSeverityFlagBitsEXT) minimum_severity;
if (message_severity >= severity_bit) {
std::cerr << '\n'
<< message_data->pMessage
<< std::endl;
}
return VK_FALSE;
}
DebugMessenger::DebugMessenger(VkInstance instance, Callback callback) {
VkDebugUtilsMessengerCreateInfoEXT create_info;
create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
if (callback == nullptr) {
create_info.pfnUserCallback = vulkan_debug_callback;
} else {
create_info.pfnUserCallback = callback;
}
this->minimum_severity = new Severity { Severity::Warning };
create_info.pUserData = this->minimum_severity;
auto fp = vkGetInstanceProcAddr(instance, pfn_create);
auto vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) fp;
if (vkCreateDebugUtilsMessengerEXT == nullptr) {
throw Exception { "couldn't create debug messenger!",
"vkCreateDebugUtilsMessengerEXT PFN doesn't exist!"};
}
if (VkResult error = vkCreateDebugUtilsMessengerEXT(instance, &create_info,
nullptr, &handle))
throw Exception { error, "couldn't create debug messenger!" };
this->instance_handle = instance; // Since we need to destroy *this it.
}
DebugMessenger::~DebugMessenger() noexcept {
destroy();
}
void DebugMessenger::destroy() noexcept {
auto fp = vkGetInstanceProcAddr(instance_handle, pfn_destroy);
auto vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT) fp;
if (vkDestroyDebugUtilsMessengerEXT != nullptr && handle != VK_NULL_HANDLE) {
vkDestroyDebugUtilsMessengerEXT(instance_handle, handle, nullptr);
}
instance_handle = VK_NULL_HANDLE;
handle = VK_NULL_HANDLE;
if (minimum_severity != nullptr)
delete minimum_severity;
minimum_severity = nullptr;
}
DebugMessenger::DebugMessenger(DebugMessenger&& debug_messenger) noexcept {
swap(*this, debug_messenger);
}
DebugMessenger& DebugMessenger::operator=(DebugMessenger&& debug_messenger) noexcept {
swap(*this, debug_messenger);
return *this;
}
void swap(DebugMessenger& lhs, DebugMessenger& rhs) {
using std::swap;
swap(lhs.minimum_severity, rhs.minimum_severity);
swap(lhs.handle, rhs.handle);
swap(lhs.instance_handle, rhs.instance_handle);
}
DebugMessenger::Severity DebugMessenger::get_minimum_severity() const {
return *minimum_severity;
}
void DebugMessenger::set_minimum_severity(Severity minimum_severity) {
*(this->minimum_severity) = minimum_severity;
}
}