
.. _program_listing_file_Src_GraphicsEngineVulkan_vulkan_base_VulkanDebug.cpp:

Program Listing for File VulkanDebug.cpp
========================================

|exhale_lsh| :ref:`Return to documentation for file <file_Src_GraphicsEngineVulkan_vulkan_base_VulkanDebug.cpp>` (``Src/GraphicsEngineVulkan/vulkan_base/VulkanDebug.cpp``)

.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS

.. code-block:: 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
