From c8ceb6a4eddd408dea07e84889c2045c788801b8 Mon Sep 17 00:00:00 2001 From: Erik Abair Date: Thu, 17 Feb 2022 10:47:05 -0800 Subject: [PATCH] nv2a: Log gl errors to stderr --- hw/xbox/nv2a/pgraph/gl/debug.c | 99 +++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/hw/xbox/nv2a/pgraph/gl/debug.c b/hw/xbox/nv2a/pgraph/gl/debug.c index 968941dc7e..43575b4e1d 100644 --- a/hw/xbox/nv2a/pgraph/gl/debug.c +++ b/hw/xbox/nv2a/pgraph/gl/debug.c @@ -44,6 +44,97 @@ static bool has_GL_GREMEDY_frame_terminator = false; static bool has_GL_KHR_debug = false; +#ifdef STREAM_GL_DEBUG_MESSAGES + +static const char *gl_debug_type_names[] = { + "ERROR", + "DEPRECATED", + "UNDEFINED", + "PORTABILITY", + "PERFORMANCE", + "MARKER", + "PUSH_GROUP", + "POP_GROUP", + "OTHER", +}; + +static const char *gl_debug_severity_names[] = { + "HIGH", + "MEDIUM", + "LOW", + "NOTIFICATION", +}; + +static void APIENTRY print_gl_debug_message(GLenum /*source*/, GLenum type, + GLuint id, GLenum severity, + GLsizei length, + const GLchar *message, + const void *userParam) +{ + const char *type_name = ""; + const char *severity_name = ""; + + if (type != GL_DEBUG_TYPE_ERROR) { + return; + } + + switch (type) { + default: + break; + case GL_DEBUG_TYPE_ERROR: + type_name = gl_debug_type_names[0]; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + type_name = gl_debug_type_names[1]; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + type_name = gl_debug_type_names[2]; + break; + case GL_DEBUG_TYPE_PORTABILITY: + type_name = gl_debug_type_names[3]; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + type_name = gl_debug_type_names[4]; + break; + case GL_DEBUG_TYPE_MARKER: + type_name = gl_debug_type_names[5]; + break; + case GL_DEBUG_TYPE_PUSH_GROUP: + type_name = gl_debug_type_names[6]; + break; + case GL_DEBUG_TYPE_POP_GROUP: + type_name = gl_debug_type_names[7]; + break; + case GL_DEBUG_TYPE_OTHER: + type_name = gl_debug_type_names[8]; + break; + } + + switch (severity) { + default: + break; + case GL_DEBUG_SEVERITY_HIGH: + severity_name = gl_debug_severity_names[0]; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + severity_name = gl_debug_severity_names[1]; + break; + case GL_DEBUG_SEVERITY_LOW: + severity_name = gl_debug_severity_names[2]; + break; + case GL_DEBUG_SEVERITY_NOTIFICATION: + severity_name = gl_debug_severity_names[3]; + break; + } + + if (length < 0) { + fprintf(stderr,"GLDBG[%s][%s]> %s\n", type_name, severity_name, message); + } else { + fprintf(stderr,"GLDBG[%s][%s]> %*s\n", type_name, severity_name, length, message); + } +} +#endif + void gl_debug_initialize(void) { has_GL_KHR_debug = glo_check_extension("GL_KHR_debug"); @@ -62,8 +153,12 @@ void gl_debug_initialize(void) * so skip the call for this platform. */ #else - glEnable(GL_DEBUG_OUTPUT); - assert(glGetError() == GL_NO_ERROR); + glEnable(GL_DEBUG_OUTPUT); + assert(glGetError() == GL_NO_ERROR); +#endif + +#ifdef STREAM_GL_DEBUG_MESSAGES + glDebugMessageCallback(print_gl_debug_message, NULL); #endif }