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(Vulkan REQUIRED)
|
||||
|
||||
add_definitions(-DDEBUG)
|
||||
|
||||
add_executable(Graph
|
||||
src/main.cpp
|
||||
src/renderer.cpp)
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
Reference in a new issue