[vlc-devel] [PATCH] opengl: add debug callbacks

Steve Lhomme robux4 at ycbcr.xyz
Thu Sep 26 15:59:51 CEST 2019


From: Alexandre Janniaux <ajanni at videolabs.io>

---
 modules/video_output/opengl/converter.h   |  6 ++++
 modules/video_output/opengl/vout_helper.c | 41 +++++++++++++++++++++--
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/modules/video_output/opengl/converter.h b/modules/video_output/opengl/converter.h
index 73dfabeb713..66e2bb6d4c3 100644
--- a/modules/video_output/opengl/converter.h
+++ b/modules/video_output/opengl/converter.h
@@ -93,6 +93,10 @@ typedef void (APIENTRY *PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GL
 typedef void (APIENTRY *PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
 typedef void (APIENTRY *PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
 typedef void (APIENTRY *PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void APIENTRY PFNGLDEBUGCALLBACK(GLenum source, GLenum type, GLuint id,
+   GLenum severity, GLsizei length, const GLchar* message, const void* userdata);
+typedef void (APIENTRY *PFNGLDEBUGMESSAGECALLBACK) (PFNGLDEBUGCALLBACK callback, void * userdata);
+
 
 /* The following are defined in glext.h but not for GLES2 or on Apple systems */
 #if defined(USE_OPENGL_ES2) || defined(__APPLE__)
@@ -175,6 +179,8 @@ typedef struct {
     PFNGLTEXSUBIMAGE2DPROC  TexSubImage2D;
     PFNGLVIEWPORTPROC       Viewport;
 
+    PFNGLDEBUGMESSAGECALLBACK DebugMessageCallback;
+
     /* GL only core functions: NULL for GLES2 */
     PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv; /* Can be NULL */
     PFNGLTEXENVFPROC                TexEnvf; /* Can be NULL */
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index b37b6532572..b013b8e423b 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -628,6 +628,33 @@ opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
     return VLC_SUCCESS;
 }
 
+#if !defined(USE_OPENGL_ES2)
+static void GLAPIENTRY
+OpenglMessageCallback(GLenum source,
+                      GLenum type,
+                      GLuint id,
+                      GLenum severity,
+                      GLsizei length,
+                      const GLchar* message,
+                      const void* userdata)
+{
+    vout_display_opengl_t *vgl = userdata;
+
+    const char *format = "OpenGL Debug callback: "
+        "type = 0x%x, severity = 0x%x, message = %s";
+
+    if (type == GL_DEBUG_TYPE_ERROR)
+        msg_Err(vgl->gl, format, type, severity, message);
+    else
+        msg_Dbg(vgl->gl, format, type, severity, message );
+
+    VLC_UNUSED(source);
+    VLC_UNUSED(id);
+    VLC_UNUSED(length);
+}
+#endif
+
+
 static void
 ResizeFormatToGLMaxTexSize(video_format_t *fmt, unsigned int max_tex_size)
 {
@@ -717,6 +744,8 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR_CORE_GL(GetTexLevelParameteriv);
     GET_PROC_ADDR_CORE_GL(TexEnvf);
 
+    GET_PROC_ADDR_CORE_GL(DebugMessageCallback);
+
     GET_PROC_ADDR(CreateShader);
     GET_PROC_ADDR(ShaderSource);
     GET_PROC_ADDR(CompileShader);
@@ -881,6 +910,12 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     vgl->vt.GenBuffers(1, &vgl->index_buffer_object);
     vgl->vt.GenBuffers(vgl->prgm->tc->tex_count, vgl->texture_buffer_object);
 
+#if !defined(USE_OPENGL_ES2)
+    // During init, enable debug output
+    vgl->vt.Enable(GL_DEBUG_OUTPUT);
+    vgl->vt.DebugMessageCallback(OpenglMessageCallback, vgl);
+#endif
+
     /* Initial number of allocated buffer objects for subpictures, will grow dynamically. */
     int subpicture_buffer_object_count = 8;
     vgl->subpicture_buffer_object = vlc_alloc(subpicture_buffer_object_count, sizeof(GLuint));
@@ -915,7 +950,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
 void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
 {
     GL_ASSERT_NOERROR();
-
     /* */
     vgl->vt.Finish();
     vgl->vt.Flush();
@@ -948,6 +982,10 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
     free(vgl->region);
     GL_ASSERT_NOERROR();
 
+#if !defined(USE_OPENGL_ES2)
+    vgl->vt.Disable(GL_DEBUG_OUTPUT);
+#endif
+
     free(vgl);
 }
 
@@ -1697,4 +1735,3 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
 
     return VLC_SUCCESS;
 }
-
-- 
2.23.0



More information about the vlc-devel mailing list