CGI/common/src/util/GLDebug.cpp

136 lines
3.1 KiB
C++
Raw Normal View History

2018-09-06 12:35:43 +00:00
#include "util/GLDebug.h"
#include <iostream>
std::unordered_set<GLuint> nse::util::GLDebug::ignoredIds;
std::string FormatDebugOutput(GLenum source, GLenum type, GLuint id, GLenum severity, const char* msg)
{
std::stringstream stringStream;
std::string sourceString;
std::string typeString;
std::string severityString;
// The AMD variant of this extension provides a less detailed classification of the error,
// which is why some arguments might be "Unknown".
switch (source) {
case GL_DEBUG_CATEGORY_API_ERROR_AMD:
case GL_DEBUG_SOURCE_API: {
sourceString = "API";
break;
}
case GL_DEBUG_CATEGORY_APPLICATION_AMD:
case GL_DEBUG_SOURCE_APPLICATION: {
sourceString = "Application";
break;
}
case GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD:
case GL_DEBUG_SOURCE_WINDOW_SYSTEM: {
sourceString = "Window System";
break;
}
case GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD:
case GL_DEBUG_SOURCE_SHADER_COMPILER: {
sourceString = "Shader Compiler";
break;
}
case GL_DEBUG_SOURCE_THIRD_PARTY: {
sourceString = "Third Party";
break;
}
case GL_DEBUG_CATEGORY_OTHER_AMD:
case GL_DEBUG_SOURCE_OTHER: {
sourceString = "Other";
break;
}
default: {
sourceString = "Unknown";
break;
}
}
switch (type) {
case GL_DEBUG_TYPE_ERROR: {
typeString = "Error";
break;
}
case GL_DEBUG_CATEGORY_DEPRECATION_AMD:
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: {
typeString = "Deprecated Behavior";
break;
}
case GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD:
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: {
typeString = "Undefined Behavior";
break;
}
case GL_DEBUG_TYPE_PORTABILITY_ARB: {
typeString = "Portability";
break;
}
case GL_DEBUG_CATEGORY_PERFORMANCE_AMD:
case GL_DEBUG_TYPE_PERFORMANCE: {
typeString = "Performance";
break;
}
case GL_DEBUG_CATEGORY_OTHER_AMD:
case GL_DEBUG_TYPE_OTHER: {
typeString = "Other";
break;
}
default: {
typeString = "Unknown";
break;
}
}
switch (severity) {
case GL_DEBUG_SEVERITY_HIGH: {
severityString = "High";
break;
}
case GL_DEBUG_SEVERITY_MEDIUM: {
severityString = "Medium";
break;
}
case GL_DEBUG_SEVERITY_LOW: {
severityString = "Low";
break;
}
default: {
severityString = "Unknown";
break;
}
}
stringStream << "OpenGL Error: " << msg;
stringStream << " [Source = " << sourceString;
stringStream << ", Type = " << typeString;
stringStream << ", Severity = " << severityString;
stringStream << ", ID = " << id << "]";
return stringStream.str();
}
void APIENTRY DebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
const std::unordered_set<GLuint>* ignoredIds = static_cast<const std::unordered_set<GLuint>*>(userParam);
if(ignoredIds->find(id) != ignoredIds->end())
return;
std::string error = FormatDebugOutput(source, type, id, severity, message);
std::cout << error << std::endl;
}
void nse::util::GLDebug::IgnoreGLError(GLuint errorId)
{
ignoredIds.insert(errorId);
}
void nse::util::GLDebug::SetupDebugCallback()
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(DebugCallback, &ignoredIds);
}