Add debug messenger and validation layers support
This commit is contained in:
parent
582428fc71
commit
c2435144e3
3 changed files with 70 additions and 0 deletions
|
@ -8,6 +8,8 @@ set(CMAKE_CXX_STANDARD 14)
|
||||||
find_package(SDL2 REQUIRED)
|
find_package(SDL2 REQUIRED)
|
||||||
find_package(Vulkan REQUIRED)
|
find_package(Vulkan REQUIRED)
|
||||||
|
|
||||||
|
add_definitions(-DDEBUG)
|
||||||
|
|
||||||
add_executable(Graph
|
add_executable(Graph
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/renderer.cpp)
|
src/renderer.cpp)
|
||||||
|
|
|
@ -9,10 +9,21 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createInstance();
|
void createInstance();
|
||||||
|
#ifdef DEBUG
|
||||||
|
void createDebugMessenger();
|
||||||
|
#endif
|
||||||
void createLogicalDevice();
|
void createLogicalDevice();
|
||||||
|
|
||||||
VkInstance instance_ = nullptr;
|
VkInstance instance_ = nullptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
bool enableDebug = false;
|
||||||
|
|
||||||
|
PFN_vkCreateDebugUtilsMessengerEXT createMessenger_ = nullptr;
|
||||||
|
|
||||||
|
VkDebugUtilsMessengerEXT messenger_ = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
VkDevice device_ = nullptr;
|
VkDevice device_ = nullptr;
|
||||||
VkQueue graphicsQueue_ = nullptr;
|
VkQueue graphicsQueue_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,9 +2,14 @@
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
Renderer::Renderer() {
|
Renderer::Renderer() {
|
||||||
createInstance();
|
createInstance();
|
||||||
|
#ifdef DEBUG
|
||||||
|
if(enableDebug)
|
||||||
|
createDebugMessenger();
|
||||||
|
#endif
|
||||||
createLogicalDevice();
|
createLogicalDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,12 +18,64 @@ Renderer::~Renderer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::createInstance() {
|
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 = {};
|
VkInstanceCreateInfo instanceCreateInfo = {};
|
||||||
instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
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_);
|
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() {
|
void Renderer::createLogicalDevice() {
|
||||||
uint32_t physicalDeviceCount = 0;
|
uint32_t physicalDeviceCount = 0;
|
||||||
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, nullptr);
|
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, nullptr);
|
||||||
|
|
Reference in a new issue