-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathValidationLayer.cpp
More file actions
106 lines (88 loc) · 3.09 KB
/
Copy pathValidationLayer.cpp
File metadata and controls
106 lines (88 loc) · 3.09 KB
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
105
106
#include "ValidationLayer.hpp"
#include <iostream>
#include "Config.hpp"
/**
* These functions are not automatically loaded by the Vulkan loader.
* That's why we created
* @code
* ValidationLayer::loadDebugUtilsMessengerFunctions(const vk::Instance&)
* @endcode
*/
PFN_vkCreateDebugUtilsMessengerEXT pfnVkCreateDebugUtilsMessengerEXT;
PFN_vkDestroyDebugUtilsMessengerEXT pfnVkDestroyDebugUtilsMessengerEXT;
[[maybe_unused]] VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT(
VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDebugUtilsMessengerEXT* pMessenger
) {
return pfnVkCreateDebugUtilsMessengerEXT(
instance, pCreateInfo, pAllocator, pMessenger
);
}
[[maybe_unused]] VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT(
VkInstance instance,
VkDebugUtilsMessengerEXT messenger,
VkAllocationCallbacks const* pAllocator
) {
return pfnVkDestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator);
}
bool ValidationLayer::checkValidationLayerSupport() {
const std::vector<vk::LayerProperties>& availableLayers =
vk::enumerateInstanceLayerProperties();
for (const auto& requestedLayerName : Config::VALIDATION_LAYERS) {
bool layerFound = false;
for (const auto& layerProperties : availableLayers) {
if (strcmp(requestedLayerName, layerProperties.layerName) == 0) {
layerFound = true;
break;
}
}
if (!layerFound) {
return false;
}
}
return true;
}
VkBool32 ValidationLayer::debugCallback(
[[maybe_unused]] VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
[[maybe_unused]] VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
[[maybe_unused]] void* pUserData
) {
std::cerr << "Validation layer: " << pCallbackData->pMessage << std::endl;
return VK_FALSE;
}
void ValidationLayer::loadDebugUtilsMessengerFunctions(
const vk::Instance& instance
) {
pfnVkCreateDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(
instance.getProcAddr("vkCreateDebugUtilsMessengerEXT")
);
if (!pfnVkCreateDebugUtilsMessengerEXT) {
throw std::runtime_error(
"GetInstanceProcAddr: Unable to find "
"pfnVkCreateDebugUtilsMessengerEXT function."
);
}
pfnVkDestroyDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(
instance.getProcAddr("vkDestroyDebugUtilsMessengerEXT")
);
if (!pfnVkDestroyDebugUtilsMessengerEXT) {
throw std::runtime_error(
"GetInstanceProcAddr: Unable to find "
"pfnVkDestroyDebugUtilsMessengerEXT function."
);
}
}
vk::DebugUtilsMessengerCreateInfoEXT
ValidationLayer::getDebugUtilsMessengerCreateInfoEXT() {
vk::DebugUtilsMessengerCreateInfoEXT createInfo =
vk::DebugUtilsMessengerCreateInfoEXT()
.setMessageSeverity(Config::DEBUG_MESSENGER_SEVERITY)
.setMessageType(Config::DEBUG_MESSAGE_TYPE)
.setPfnUserCallback(ValidationLayer::debugCallback);
return createInfo;
}