summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorwarzes <[email protected]>2021-10-19 20:43:27 +1000
committerGitHub <[email protected]>2021-10-19 12:43:27 +0200
commit9f2ff3e4d6698e675f63d915e72350ee6912477c (patch)
tree1445fd054b61c704b2359c1babd5cdad5577ee60
parent963021d39388ccd85bffabf16b3c1129ec7b038d (diff)
downloadraylib-9f2ff3e4d6698e675f63d915e72350ee6912477c.tar.gz
raylib-9f2ff3e4d6698e675f63d915e72350ee6912477c.zip
Support create OpenGL debug context in OpenGL 4.3 (#2068)
* - support create OpenGL debug context in OpenGL 4.3 * - additional events in debug message - fixed glEnable(GL_DEBUG_OUTPUT) * Reviewed OpenGL Debug Context
-rw-r--r--src/config.h4
-rw-r--r--src/rcore.c4
-rw-r--r--src/rlgl.h62
3 files changed, 70 insertions, 0 deletions
diff --git a/src/config.h b/src/config.h
index 931fdf5b..5cb50903 100644
--- a/src/config.h
+++ b/src/config.h
@@ -84,6 +84,10 @@
//------------------------------------------------------------------------------------
// Module: rlgl - Configuration values
//------------------------------------------------------------------------------------
+
+// Enable OpenGL Debug Context (only OpenGL 4.3)
+//#define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT 1
+
// Show OpenGL extensions and capabilities detailed logs on init
//#define RLGL_SHOW_GL_DETAILS_INFO 1
diff --git a/src/rcore.c b/src/rcore.c
index 0af89cf7..0d1a75ff 100644
--- a/src/rcore.c
+++ b/src/rcore.c
@@ -3858,6 +3858,10 @@ static bool InitGraphicsDevice(int width, int height)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // Choose OpenGL minor version (just hint)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_FALSE);
+
+#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT)
+ glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); // Enable OpenGL Debug Context
+#endif
}
else if (rlGetVersion() == OPENGL_ES_20) // Request OpenGL ES 2.0 context
{
diff --git a/src/rlgl.h b/src/rlgl.h
index 1641ec15..e67e1004 100644
--- a/src/rlgl.h
+++ b/src/rlgl.h
@@ -1798,12 +1798,74 @@ void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation)
}
//----------------------------------------------------------------------------------
+// Module Functions Definition - OpenGL Debug
+//----------------------------------------------------------------------------------
+
+#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43)
+static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
+{
+ // ignore non-significant error/warning codes
+ if (id == 131169 || id == 131185 || id == 131218 || id == 131204) return;
+
+ const char *msgSource = NULL;
+ switch (source)
+ {
+ case GL_DEBUG_SOURCE_API: msgSource = "API"; break;
+ case GL_DEBUG_SOURCE_WINDOW_SYSTEM: msgSource = "WINDOW_SYSTEM"; break;
+ case GL_DEBUG_SOURCE_SHADER_COMPILER: msgSource = "SHADER_COMPILER"; break;
+ case GL_DEBUG_SOURCE_THIRD_PARTY: msgSource = "THIRD_PARTY"; break;
+ case GL_DEBUG_SOURCE_APPLICATION: msgSource = "APPLICATION"; break;
+ case GL_DEBUG_SOURCE_OTHER: msgSource = "OTHER"; break;
+ }
+
+ const char *msgType = NULL;
+ switch (type)
+ {
+ case GL_DEBUG_TYPE_ERROR: msgType = "ERROR"; break;
+ case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: msgType = "DEPRECATED_BEHAVIOR"; break;
+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: msgType = "UNDEFINED_BEHAVIOR"; break;
+ case GL_DEBUG_TYPE_PORTABILITY: msgType = "PORTABILITY"; break;
+ case GL_DEBUG_TYPE_PERFORMANCE: msgType = "PERFORMANCE"; break;
+ case GL_DEBUG_TYPE_MARKER: msgType = "MARKER"; break;
+ case GL_DEBUG_TYPE_PUSH_GROUP: msgType = "PUSH_GROUP"; break;
+ case GL_DEBUG_TYPE_POP_GROUP: msgType = "POP_GROUP"; break;
+ case GL_DEBUG_TYPE_OTHER: msgType = "OTHER"; break;
+ }
+
+ const char *msgSeverity = "DEFAULT";
+ switch (severity)
+ {
+ case GL_DEBUG_SEVERITY_LOW: msgSeverity = "LOW"; break;
+ case GL_DEBUG_SEVERITY_MEDIUM: msgSeverity = "MEDIUM"; break;
+ case GL_DEBUG_SEVERITY_HIGH: msgSeverity = "HIGH"; break;
+ case GL_DEBUG_SEVERITY_NOTIFICATION: msgSeverity = "NOTIFICATION"; break;
+ }
+
+ TRACELOG(LOG_WARNING, "OpenGL Debug Message: %s, type = %s, source = %s, severity = %s", message, msgType, msgSource, msgSeverity);
+}
+#endif
+
+//----------------------------------------------------------------------------------
// Module Functions Definition - rlgl functionality
//----------------------------------------------------------------------------------
// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states
void rlglInit(int width, int height)
{
+ // Enable OpenGL Debug Context
+#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43)
+ if (glDebugMessageCallback != NULL && glDebugMessageControl != NULL)
+ {
+ glDebugMessageCallback(rlDebugMessageCallback, 0);
+ // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); // TODO: filter message
+
+ // GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints
+ // GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error.
+ glEnable(GL_DEBUG_OUTPUT);
+ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+ }
+#endif
+
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
// Init default white texture
unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes)