Program Listing for File VulkanDebug.cpp

Program Listing for File VulkanDebug.cpp#

Return to documentation for file (Src/GraphicsEngineVulkan/vulkan_base/VulkanDebug.cpp)

module;

#include <cstdio>
#include <iostream>
#include <sstream>
#include <string>
#include <vulkan/vulkan.hpp>
#include <vulkan/vulkan_structs.hpp>

#include "common/Utilities.hpp"

module kataglyphis.vulkan.debug;

namespace Kataglyphis::debug {
static vk::DebugUtilsMessengerEXT debugUtilsMessenger;

VKAPI_ATTR static VkBool32 VKAPI_CALL debugUtilsMessengerCallback(
  vk::DebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
  vk::DebugUtilsMessageTypeFlagsEXT /*messageType*/,
  const vk::DebugUtilsMessengerCallbackDataEXT *pCallbackData,
  void * /*pUserData*/)
{
    // Select prefix depending on flags passed to the callback
    std::string prefix;

    if ((messageSeverity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose)
        == vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose) {
        prefix = "VERBOSE: ";
    } else if ((messageSeverity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo)
               == vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo) {
        prefix = "INFO: ";
    } else if ((messageSeverity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning)
               == vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning) {
        prefix = "WARNING: ";
    } else if ((messageSeverity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eError)
               == vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) {
        prefix = "ERROR: ";
    }

    // Display message to default output (console/logcat)
    std::stringstream debugMessage;
    debugMessage << prefix << "[" << pCallbackData->messageIdNumber << "][" << pCallbackData->pMessageIdName
                 << "] : " << pCallbackData->pMessage;

#ifdef __ANDROID__
    if (messageSeverity >= vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) {
        LOGE("%s", debugMessage.str().c_str());
    } else {
        LOGD("%s", debugMessage.str().c_str());
    }
#else
    if (messageSeverity >= vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) {
        std::cerr << debugMessage.str() << "\n";
    } else {
        std::cout << debugMessage.str() << "\n";
    }
    fflush(stdout);
#endif

    // The return value of this callback controls whether the Vulkan call that
    // caused the validation message will be aborted or not We return VK_FALSE as
    // we DON'T want Vulkan calls that cause a validation message to abort If you
    // instead want to have calls abort, pass in VK_TRUE and the function will
    // return VK_ERROR_VALIDATION_FAILED_EXT
    return VK_FALSE;
}

void setupDebugging(vk::Instance instance, vk::DebugReportFlagsEXT /*flags*/, vk::DebugReportCallbackEXT /*callBack*/)
{
    vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{};
    debugUtilsMessengerCI.messageSeverity =
      vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
    debugUtilsMessengerCI.messageType =
      vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation;
    debugUtilsMessengerCI.pfnUserCallback = debugUtilsMessengerCallback;

    vk::Result result;
    std::tie(result, debugUtilsMessenger) = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCI, nullptr);
    ASSERT_VULKAN(static_cast<VkResult>(result), "Failed to create debug messenger")
}

void freeDebugCallback(vk::Instance instance)
{
    if (debugUtilsMessenger) { instance.destroyDebugUtilsMessengerEXT(debugUtilsMessenger, nullptr); }
}
}// namespace Kataglyphis::debug