From d6cb37383bd5bd00bb082cae87530b9aacaa628c Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sat, 2 Mar 2024 00:19:15 +0800 Subject: [PATCH] vulkan instance --- .../src/engine/vulkanapi/wrapper/instance.cpp | 16 ++++++++-- .../src/engine/vulkanapi/wrapper/instance.h | 5 ++++ .../vulkanapi/wrapper/instance_creator.cpp | 30 +++++++++++++++++-- .../vulkanapi/wrapper/instance_creator.h | 8 +++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/engine/src/engine/vulkanapi/wrapper/instance.cpp b/engine/src/engine/vulkanapi/wrapper/instance.cpp index 80b574a..cc34a2e 100644 --- a/engine/src/engine/vulkanapi/wrapper/instance.cpp +++ b/engine/src/engine/vulkanapi/wrapper/instance.cpp @@ -21,9 +21,12 @@ namespace vulkanapi { Creator.engineVersion, // uint32_t engineVersion Creator.apiVersion // uint32_t apiVersion }; +#ifdef _USE_GRAPHIC_DEBUG + Creator._AddDebugExtension(); +#endif + Creator._AddWindowExtension(); auto extensions = Creator.EnabledExtensionNames(); - auto layers = Creator.EnabledLayerNames(); - //VkDebugUtilsMessengerCreateInfoEXT createInfo = _DebugUtilsLayerNext(); + auto layers = Creator.EnabledLayerNames();; VkInstanceCreateInfo instance_create_info = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType nullptr, // const void * pNext @@ -34,6 +37,10 @@ namespace vulkanapi { static_cast(extensions.size()), // uint32_t enabledExtensionCount extensions.data() // const char * const * ppEnabledExtensionNames }; +#ifdef _USE_GRAPHIC_DEBUG + VkDebugUtilsMessengerCreateInfoEXT debugInfo = Creator._DebugUtilsLayerNext(); + instance_create_info.pNext = &debugInfo; +#endif VkResult result = vkCreateInstance(&instance_create_info, nullptr, &mPtr); if (result != VK_SUCCESS) { zlog::error("Failed to create instance."); @@ -64,4 +71,9 @@ namespace vulkanapi { return true; } + VKAPI_ATTR VkBool32 VKAPI_CALL Instance::DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void*) + { + zlog::error("validation layer: {}", pCallbackData->pMessage); + return VK_FALSE; + } }; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/wrapper/instance.h b/engine/src/engine/vulkanapi/wrapper/instance.h index 87d13a7..76504c3 100644 --- a/engine/src/engine/vulkanapi/wrapper/instance.h +++ b/engine/src/engine/vulkanapi/wrapper/instance.h @@ -16,5 +16,10 @@ namespace vulkanapi { return mPtr; } bool EnumerateAvailablePhysicalDevices(std::vector& available_devices); + + static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT, + VkDebugUtilsMessageTypeFlagsEXT, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void*); }; }; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/wrapper/instance_creator.cpp b/engine/src/engine/vulkanapi/wrapper/instance_creator.cpp index fd4bba6..f361de9 100644 --- a/engine/src/engine/vulkanapi/wrapper/instance_creator.cpp +++ b/engine/src/engine/vulkanapi/wrapper/instance_creator.cpp @@ -15,7 +15,7 @@ namespace vulkanapi { #ifdef _USE_GRAPHIC_DEBUG , messageSeverity(VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) , 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) - // , debugCallback(Instance::DebugCallback) + , debugCallback(Instance::DebugCallback) #endif { @@ -28,6 +28,20 @@ namespace vulkanapi { { desiredLayers.push_back(layerName); } + void InstanceCreator::_AddWindowExtension() + { + AddExtension("VK_KHR_win32_surface"); + AddExtension(VK_KHR_SURFACE_EXTENSION_NAME); + AddExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + AddExtension(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + } + void InstanceCreator::_AddDebugExtension() + { + AddLayer("VK_LAYER_KHRONOS_validation"); + AddLayer("VK_LAYER_RENDERDOC_Capture"); + AddExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + AddExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); + } std::vector InstanceCreator::EnabledExtensionNames() { std::vector available_extensions; @@ -64,7 +78,19 @@ namespace vulkanapi { return _layers; } - +#ifdef _USE_GRAPHIC_DEBUG + VkDebugUtilsMessengerCreateInfoEXT InstanceCreator::_DebugUtilsLayerNext() + { + VkDebugUtilsMessengerCreateInfoEXT createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + createInfo.messageSeverity = + VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + createInfo.messageType = + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + createInfo.pfnUserCallback = debugCallback; + return createInfo; + } +#endif bool InstanceCreator::CheckAvailableInstanceExtensions(std::vector& available_extensions) { uint32_t extensions_count = 0; diff --git a/engine/src/engine/vulkanapi/wrapper/instance_creator.h b/engine/src/engine/vulkanapi/wrapper/instance_creator.h index 799363a..78ff947 100644 --- a/engine/src/engine/vulkanapi/wrapper/instance_creator.h +++ b/engine/src/engine/vulkanapi/wrapper/instance_creator.h @@ -16,10 +16,12 @@ namespace vulkanapi { std::vector desiredExtensions; std::vector desiredLayers; - public: - InstanceCreator(); + InstanceCreator(); public: + void AddExtension(std::string extensionName); void AddLayer(std::string layerName); + void _AddWindowExtension(); + void _AddDebugExtension(); std::vector EnabledExtensionNames(); std::vector EnabledLayerNames(); @@ -28,6 +30,8 @@ namespace vulkanapi { VkDebugUtilsMessageSeverityFlagsEXT messageSeverity; VkDebugUtilsMessageTypeFlagsEXT messageType; PFN_vkDebugUtilsMessengerCallbackEXT debugCallback; + + VkDebugUtilsMessengerCreateInfoEXT _DebugUtilsLayerNext(); #endif private: