136 lines
No EOL
3.1 KiB
C++
136 lines
No EOL
3.1 KiB
C++
#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);
|
|
} |