diff --git a/CMakeLists.txt b/CMakeLists.txt index 00661fb..caa0d07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/include/renderer.h b/include/renderer.h index 3295b25..e2e4cbc 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -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; }; diff --git a/src/renderer.cpp b/src/renderer.cpp index 8ad7d39..bba4d51 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -2,9 +2,14 @@ #include #include +#include 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 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 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);