Archived
1
Fork 0

Add debug messenger and validation layers support

This commit is contained in:
Joshua Goins 2018-09-28 18:10:33 -04:00
parent 582428fc71
commit c2435144e3
3 changed files with 70 additions and 0 deletions

View file

@ -8,6 +8,8 @@ set(CMAKE_CXX_STANDARD 14)
find_package(SDL2 REQUIRED)
find_package(Vulkan REQUIRED)
add_definitions(-DDEBUG)
add_executable(Graph
src/main.cpp
src/renderer.cpp)

View file

@ -9,10 +9,21 @@ public:
private:
void createInstance();
#ifdef DEBUG
void createDebugMessenger();
#endif
void createLogicalDevice();
VkInstance instance_ = nullptr;
#ifdef DEBUG
bool enableDebug = false;
PFN_vkCreateDebugUtilsMessengerEXT createMessenger_ = nullptr;
VkDebugUtilsMessengerEXT messenger_ = nullptr;
#endif
VkDevice device_ = nullptr;
VkQueue graphicsQueue_ = nullptr;
};

View file

@ -2,9 +2,14 @@
#include <set>
#include <vector>
#include <iostream>
Renderer::Renderer() {
createInstance();
#ifdef DEBUG
if(enableDebug)
createDebugMessenger();
#endif
createLogicalDevice();
}
@ -13,12 +18,64 @@ Renderer::~Renderer() {
}
void Renderer::createInstance() {
uint32_t layerCount = 0;
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
VkLayerProperties* availableLayers = new VkLayerProperties[layerCount];
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers);
std::vector<const char*> enabledLayers;
#ifdef DEBUG
for(uint32_t i = 0; i < layerCount; i++) {
if(!strcmp(availableLayers[i].layerName, "VK_LAYER_LUNARG_standard_validation"))
enabledLayers.push_back("VK_LAYER_LUNARG_standard_validation");
}
#endif
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
VkExtensionProperties* availableExtensions = new VkExtensionProperties[extensionCount];
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, availableExtensions);
std::vector<const char*> enabledExtensions;
#ifdef DEBUG
for(uint32_t i = 0; i < extensionCount; i++) {
if(!strcmp(availableExtensions[i].extensionName, "VK_EXT_debug_utils")) {
enabledExtensions.push_back("VK_EXT_debug_utils");
enableDebug = true;
}
}
#endif
VkInstanceCreateInfo instanceCreateInfo = {};
instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instanceCreateInfo.enabledLayerCount = enabledLayers.size();
instanceCreateInfo.ppEnabledLayerNames = enabledLayers.data();
instanceCreateInfo.enabledExtensionCount = enabledExtensions.size();
instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
vkCreateInstance(&instanceCreateInfo, nullptr, &instance_);
}
#ifdef DEBUG
void Renderer::createDebugMessenger() {
createMessenger_ = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance_, "vkCreateDebugUtilsMessengerEXT");
VkDebugUtilsMessengerCreateInfoEXT messengerCreateInfo = {};
messengerCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
messengerCreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
messengerCreateInfo.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;
messengerCreateInfo.pfnUserCallback = [](VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int, const VkDebugUtilsMessengerCallbackDataEXT* callback, void*) -> unsigned int {
std::cout << callback->pMessage << std::endl;
return VK_SUCCESS;
};
createMessenger_(instance_, &messengerCreateInfo, nullptr, &messenger_);
}
#endif
void Renderer::createLogicalDevice() {
uint32_t physicalDeviceCount = 0;
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, nullptr);