Add performance validation layer code

This commit is contained in:
Benau 2022-07-10 15:36:27 +08:00
parent 27b5770ea9
commit 0b4ebc35b9
2 changed files with 62 additions and 1 deletions

View File

@ -378,6 +378,7 @@ namespace GE
struct VK
{
VkInstance instance;
VkDebugUtilsMessengerEXT debug;
VkSurfaceKHR surface;
VkDevice device;
VkSwapchainKHR swap_chain;
@ -393,6 +394,7 @@ namespace GE
VK()
{
instance = VK_NULL_HANDLE;
debug = VK_NULL_HANDLE;
surface = VK_NULL_HANDLE;
device = VK_NULL_HANDLE;
swap_chain = VK_NULL_HANDLE;
@ -421,6 +423,8 @@ namespace GE
vkDestroyDevice(device, NULL);
if (surface != VK_NULL_HANDLE)
vkDestroySurfaceKHR(instance, surface, NULL);
if (vkDestroyDebugUtilsMessengerEXT && debug != VK_NULL_HANDLE)
vkDestroyDebugUtilsMessengerEXT(instance, debug, NULL);
if (instance != VK_NULL_HANDLE)
vkDestroyInstance(instance, NULL);
}

View File

@ -15,6 +15,10 @@
#include "ISceneManager.h"
#include "IrrlichtDevice.h"
#ifdef __ANDROID__
#include <android/log.h>
#endif
#ifdef _IRR_COMPILE_WITH_VULKAN_
#include "SDL_vulkan.h"
#include <algorithm>
@ -25,6 +29,29 @@
#include <stdexcept>
#include "../source/Irrlicht/os.h"
extern "C" VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback(
VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
VkDebugUtilsMessageTypeFlagsEXT message_type,
const VkDebugUtilsMessengerCallbackDataEXT* callback_data,
void* user_data)
{
#ifdef __ANDROID__
android_LogPriority alp;
switch (message_severity)
{
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: alp = ANDROID_LOG_DEBUG; break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: alp = ANDROID_LOG_INFO; break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: alp = ANDROID_LOG_WARN; break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: alp = ANDROID_LOG_ERROR; break;
default: alp = ANDROID_LOG_INFO;
}
__android_log_print(alp, "VALIDATION:", "%s", callback_data->pMessage);
#else
printf("%s\n", callback_data->pMessage);
#endif
return VK_FALSE;
};
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
struct GE_VK_UserPointer
{
@ -455,6 +482,7 @@ namespace GE
std::atomic_bool g_device_created(false);
std::atomic_bool g_schedule_pausing_rendering(false);
std::atomic_bool g_paused_rendering(false);
bool g_debug_print = false;
GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
io::IFileSystem* io, SDL_Window* window,
@ -506,6 +534,22 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
}
#endif
VkDebugUtilsMessengerCreateInfoEXT debug_create_info = {};
debug_create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
debug_create_info.messageSeverity =
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
debug_create_info.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;
debug_create_info.pfnUserCallback = debug_callback;
if (g_debug_print && vkCreateDebugUtilsMessengerEXT)
{
vkCreateDebugUtilsMessengerEXT(m_vk->instance, &debug_create_info,
NULL, &m_vk->debug);
}
if (SDL_Vulkan_CreateSurface(window, m_vk->instance, &m_vk->surface) == SDL_FALSE)
throw std::runtime_error("SDL_Vulkan_CreateSurface failed");
int w, h = 0;
@ -674,16 +718,29 @@ void GEVulkanDriver::createInstance(SDL_Window* window)
std::vector<VkLayerProperties> available_layers(layer_count);
vkEnumerateInstanceLayerProperties(&layer_count, available_layers.data());
VkInstanceCreateInfo create_info = {};
std::vector<const char*> enabled_validation_layers;
#ifdef ENABLE_VALIDATION
g_debug_print = true;
for (VkLayerProperties& prop : available_layers)
{
if (std::string(prop.layerName) == "VK_LAYER_KHRONOS_validation")
enabled_validation_layers.push_back("VK_LAYER_KHRONOS_validation");
}
VkValidationFeaturesEXT validation_features = {};
validation_features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
validation_features.enabledValidationFeatureCount = 1;
VkValidationFeatureEnableEXT enabled_validation_features =
VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT;
validation_features.pEnabledValidationFeatures = &enabled_validation_features;
create_info.pNext = &validation_features;
const char* debug_ext = "VK_EXT_debug_utils";
extensions.push_back(debug_ext);
#endif
VkInstanceCreateInfo create_info = {};
VkApplicationInfo app_info = {};
if (vulkan_1_1)
{