
.. _program_listing_file_Src_GraphicsEngineOpenGL_debug_DebugApp.cpp:

Program Listing for File DebugApp.cpp
=====================================

|exhale_lsh| :ref:`Return to documentation for file <file_Src_GraphicsEngineOpenGL_debug_DebugApp.cpp>` (``Src/GraphicsEngineOpenGL/debug/DebugApp.cpp``)

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

.. code-block:: cpp

   #include "DebugApp.hpp"
   
   // clang-format off
   // you must include glad before glfw!
   // therefore disable clang-format for this section
   #include <glad/glad.h>
   // clang-format on
   
   #include <iostream>
   #include <string>
   // stolen from: https://learnopengl.com/In-Practice/Debugging
   static void APIENTRY glDebugOutput(GLenum source,
     GLenum type,
     unsigned int id,
     GLenum severity,
     GLsizei /*length*/,
     const char *message,
     const void * /*userParam*/)
   {
       // ignore non-significant error/warning codes
       if (id == 131169 || id == 131185 || id == 131218 || id == 131204 || id == 8) { return; }
   
       std::cout << "---------------" << '\n';
       std::cout << "Debug message (" << id << "): " << message << '\n';
   
       switch (source) {
       case GL_DEBUG_SOURCE_API:
           std::cout << "Source: API";
           break;
       case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
           std::cout << "Source: Window System";
           break;
       case GL_DEBUG_SOURCE_SHADER_COMPILER:
           std::cout << "Source: Shader Compiler";
           break;
       case GL_DEBUG_SOURCE_THIRD_PARTY:
           std::cout << "Source: Third Party";
           break;
       case GL_DEBUG_SOURCE_APPLICATION:
           std::cout << "Source: Application";
           break;
       case GL_DEBUG_SOURCE_OTHER:
           std::cout << "Source: Other";
           break;
       }
       std::cout << '\n';
   
       switch (type) {
       case GL_DEBUG_TYPE_ERROR:
           std::cout << "Type: Error";
           break;
       case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
           std::cout << "Type: Deprecated Behaviour";
           break;
       case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
           std::cout << "Type: Undefined Behaviour";
           break;
       case GL_DEBUG_TYPE_PORTABILITY:
           std::cout << "Type: Portability";
           break;
       case GL_DEBUG_TYPE_PERFORMANCE:
           std::cout << "Type: Performance";
           break;
       case GL_DEBUG_TYPE_MARKER:
           std::cout << "Type: Marker";
           break;
       case GL_DEBUG_TYPE_PUSH_GROUP:
           std::cout << "Type: Push Group";
           break;
       case GL_DEBUG_TYPE_POP_GROUP:
           std::cout << "Type: Pop Group";
           break;
       case GL_DEBUG_TYPE_OTHER:
           std::cout << "Type: Other";
           break;
       }
       std::cout << '\n';
   
       switch (severity) {
       case GL_DEBUG_SEVERITY_HIGH:
           std::cout << "Severity: high";
           break;
       case GL_DEBUG_SEVERITY_MEDIUM:
           std::cout << "Severity: medium";
           break;
       case GL_DEBUG_SEVERITY_LOW:
           std::cout << "Severity: low";
           break;
       case GL_DEBUG_SEVERITY_NOTIFICATION:
           std::cout << "Severity: notification";
           break;
       }
       std::cout << '\n';
       std::cout << '\n';
   }
   DebugApp::DebugApp()
   {
   #ifdef NDEBUG
       // nondebug
   #else
       int flags = 0;
       glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
       if ((flags & GL_CONTEXT_FLAG_DEBUG_BIT) != 0) {
           // initialize debug output
           glEnable(GL_DEBUG_OUTPUT);
           glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
           glDebugMessageCallback(glDebugOutput, nullptr);
           glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
           constexpr GLuint redundant_fbo_message_id = 8;
           glDebugMessageControl(
             GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, 1, &redundant_fbo_message_id, GL_FALSE);
       }
   #endif
   }
   
   auto DebugApp::areErrorPrintAll(const std::string &AdditionalArrayMessage, const char *file, int line) -> bool
   {
   #ifdef NDEBUG
       // nondebug
       return false;
   #else
       GLenum err = 0;
       bool isError = false;
       while ((err = glGetError()) != GL_NO_ERROR) {
           std::string errorCode;
           switch (err) {
           case GL_INVALID_ENUM:
               errorCode = "INVALID_ENUM";
               break;
           case GL_INVALID_VALUE:
               errorCode = "INVALID_VALUE";
               break;
           case GL_INVALID_OPERATION:
               errorCode = "INVALID_OPERATION";
               break;
           case GL_STACK_OVERFLOW:
               errorCode = "STACK_OVERFLOW";
               break;
           case GL_STACK_UNDERFLOW:
               errorCode = "STACK_UNDERFLOW";
               break;
           case GL_OUT_OF_MEMORY:
               errorCode = "OUT_OF_MEMORY";
               break;
           case GL_INVALID_FRAMEBUFFER_OPERATION:
               errorCode = "INVALID_FRAMEBUFFER_OPERATION";
               break;
           }
           std::cout << "Error, " << errorCode << " | "
                     << "\nAdditional Error Message: " << AdditionalArrayMessage << " "
                     << "In File: " << file << ", Line: " << line << '\n';
           isError = true;
       }
   
       return isError;
       // debug code
   #endif
   }
   
   auto DebugApp::arePreError(const std::string &AdditionalArrayMessage, const char *file, int line) -> bool
   {
   #ifdef NDEBUG
       // nondebug
       return false;
   #else
       // debug code
       GLenum err = 0;
       bool isError = false;
       while ((err = glGetError()) != GL_NO_ERROR) {
           std::string errorCode;
           switch (err) {
           case GL_INVALID_ENUM:
               errorCode = "INVALID_ENUM";
               break;
           case GL_INVALID_VALUE:
               errorCode = "INVALID_VALUE";
               break;
           case GL_INVALID_OPERATION:
               errorCode = "INVALID_OPERATION";
               break;
           case GL_STACK_OVERFLOW:
               errorCode = "STACK_OVERFLOW";
               break;
           case GL_STACK_UNDERFLOW:
               errorCode = "STACK_UNDERFLOW";
               break;
           case GL_OUT_OF_MEMORY:
               errorCode = "OUT_OF_MEMORY";
               break;
           case GL_INVALID_FRAMEBUFFER_OPERATION:
               errorCode = "INVALID_FRAMEBUFFER_OPERATION";
               break;
           }
           std::cout << errorCode << " Error appears befor executing the function, "
                     << " | "
                     << "\nAdditional Error Message: " << AdditionalArrayMessage << " "
                     << "In File: " << file << ", Line: " << line << '\n';
           isError = true;
       }
   
       return isError;
   
   #endif
   }
   
   DebugApp::~DebugApp() = default;
