Add performance validation layer code
This commit is contained in:
parent
27b5770ea9
commit
0b4ebc35b9
@ -378,6 +378,7 @@ namespace GE
|
|||||||
struct VK
|
struct VK
|
||||||
{
|
{
|
||||||
VkInstance instance;
|
VkInstance instance;
|
||||||
|
VkDebugUtilsMessengerEXT debug;
|
||||||
VkSurfaceKHR surface;
|
VkSurfaceKHR surface;
|
||||||
VkDevice device;
|
VkDevice device;
|
||||||
VkSwapchainKHR swap_chain;
|
VkSwapchainKHR swap_chain;
|
||||||
@ -393,6 +394,7 @@ namespace GE
|
|||||||
VK()
|
VK()
|
||||||
{
|
{
|
||||||
instance = VK_NULL_HANDLE;
|
instance = VK_NULL_HANDLE;
|
||||||
|
debug = VK_NULL_HANDLE;
|
||||||
surface = VK_NULL_HANDLE;
|
surface = VK_NULL_HANDLE;
|
||||||
device = VK_NULL_HANDLE;
|
device = VK_NULL_HANDLE;
|
||||||
swap_chain = VK_NULL_HANDLE;
|
swap_chain = VK_NULL_HANDLE;
|
||||||
@ -421,6 +423,8 @@ namespace GE
|
|||||||
vkDestroyDevice(device, NULL);
|
vkDestroyDevice(device, NULL);
|
||||||
if (surface != VK_NULL_HANDLE)
|
if (surface != VK_NULL_HANDLE)
|
||||||
vkDestroySurfaceKHR(instance, surface, NULL);
|
vkDestroySurfaceKHR(instance, surface, NULL);
|
||||||
|
if (vkDestroyDebugUtilsMessengerEXT && debug != VK_NULL_HANDLE)
|
||||||
|
vkDestroyDebugUtilsMessengerEXT(instance, debug, NULL);
|
||||||
if (instance != VK_NULL_HANDLE)
|
if (instance != VK_NULL_HANDLE)
|
||||||
vkDestroyInstance(instance, NULL);
|
vkDestroyInstance(instance, NULL);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include "ISceneManager.h"
|
#include "ISceneManager.h"
|
||||||
#include "IrrlichtDevice.h"
|
#include "IrrlichtDevice.h"
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
#include <android/log.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_VULKAN_
|
#ifdef _IRR_COMPILE_WITH_VULKAN_
|
||||||
#include "SDL_vulkan.h"
|
#include "SDL_vulkan.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -25,6 +29,29 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "../source/Irrlicht/os.h"
|
#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)
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
struct GE_VK_UserPointer
|
struct GE_VK_UserPointer
|
||||||
{
|
{
|
||||||
@ -455,6 +482,7 @@ namespace GE
|
|||||||
std::atomic_bool g_device_created(false);
|
std::atomic_bool g_device_created(false);
|
||||||
std::atomic_bool g_schedule_pausing_rendering(false);
|
std::atomic_bool g_schedule_pausing_rendering(false);
|
||||||
std::atomic_bool g_paused_rendering(false);
|
std::atomic_bool g_paused_rendering(false);
|
||||||
|
bool g_debug_print = false;
|
||||||
|
|
||||||
GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
||||||
io::IFileSystem* io, SDL_Window* window,
|
io::IFileSystem* io, SDL_Window* window,
|
||||||
@ -506,6 +534,22 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
|||||||
}
|
}
|
||||||
#endif
|
#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)
|
if (SDL_Vulkan_CreateSurface(window, m_vk->instance, &m_vk->surface) == SDL_FALSE)
|
||||||
throw std::runtime_error("SDL_Vulkan_CreateSurface failed");
|
throw std::runtime_error("SDL_Vulkan_CreateSurface failed");
|
||||||
int w, h = 0;
|
int w, h = 0;
|
||||||
@ -674,16 +718,29 @@ void GEVulkanDriver::createInstance(SDL_Window* window)
|
|||||||
std::vector<VkLayerProperties> available_layers(layer_count);
|
std::vector<VkLayerProperties> available_layers(layer_count);
|
||||||
vkEnumerateInstanceLayerProperties(&layer_count, available_layers.data());
|
vkEnumerateInstanceLayerProperties(&layer_count, available_layers.data());
|
||||||
|
|
||||||
|
VkInstanceCreateInfo create_info = {};
|
||||||
std::vector<const char*> enabled_validation_layers;
|
std::vector<const char*> enabled_validation_layers;
|
||||||
|
|
||||||
#ifdef ENABLE_VALIDATION
|
#ifdef ENABLE_VALIDATION
|
||||||
|
g_debug_print = true;
|
||||||
for (VkLayerProperties& prop : available_layers)
|
for (VkLayerProperties& prop : available_layers)
|
||||||
{
|
{
|
||||||
if (std::string(prop.layerName) == "VK_LAYER_KHRONOS_validation")
|
if (std::string(prop.layerName) == "VK_LAYER_KHRONOS_validation")
|
||||||
enabled_validation_layers.push_back("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
|
#endif
|
||||||
|
|
||||||
VkInstanceCreateInfo create_info = {};
|
|
||||||
VkApplicationInfo app_info = {};
|
VkApplicationInfo app_info = {};
|
||||||
if (vulkan_1_1)
|
if (vulkan_1_1)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user