[vlc-devel] [PATCH] opengl: fix GL_ASSERT_NOERROR macro

Romain Vimont rom1v at videolabs.io
Wed Mar 4 09:17:12 CET 2020


The macro assumed a local variable vgl existed, which is not always the
case.

Instead, pass a pointer to the opengl_vtable_t as parameter.
---
 modules/video_output/opengl/gl_common.h    |  8 +++++---
 modules/video_output/opengl/sub_renderer.c | 10 +++++-----
 modules/video_output/opengl/vout_helper.c  | 20 ++++++++++----------
 3 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/modules/video_output/opengl/gl_common.h b/modules/video_output/opengl/gl_common.h
index 303ef73131..e7a07ad869 100644
--- a/modules/video_output/opengl/gl_common.h
+++ b/modules/video_output/opengl/gl_common.h
@@ -21,6 +21,8 @@
 #ifndef VLC_GL_COMMON_H
 #define VLC_GL_COMMON_H
 
+#include <assert.h>
+
 /* if USE_OPENGL_ES2 is defined, OpenGL ES version 2 will be used, otherwise
  * normal OpenGL will be used */
 #ifdef __APPLE__
@@ -107,8 +109,8 @@
 #endif
 
 #ifdef HAVE_GL_ASSERT_NOERROR
-# define GL_ASSERT_NOERROR() do { \
-    GLenum glError = vgl->vt.GetError(); \
+# define GL_ASSERT_NOERROR(vt) do { \
+    GLenum glError = (vt)->GetError(); \
     switch (glError) \
     { \
         case GL_NO_ERROR: break; \
@@ -121,7 +123,7 @@
     } \
 } while(0)
 #else
-# define GL_ASSERT_NOERROR()
+# define GL_ASSERT_NOERROR(vt)
 #endif
 
 /* Core OpenGL/OpenGLES functions: the following functions pointers typedefs
diff --git a/modules/video_output/opengl/sub_renderer.c b/modules/video_output/opengl/sub_renderer.c
index f25900fd1c..a900f90473 100644
--- a/modules/video_output/opengl/sub_renderer.c
+++ b/modules/video_output/opengl/sub_renderer.c
@@ -320,7 +320,7 @@ vlc_gl_sub_renderer_Delete(struct vlc_gl_sub_renderer *sr)
 int
 vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr, subpicture_t *subpicture)
 {
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(sr->vt);
 
     const struct vlc_gl_interop *interop = sr->interop;
 
@@ -408,7 +408,7 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr, subpicture_t *subpic
     }
     free(last);
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(sr->vt);
 
     return VLC_SUCCESS;
 }
@@ -416,11 +416,11 @@ vlc_gl_sub_renderer_Prepare(struct vlc_gl_sub_renderer *sr, subpicture_t *subpic
 int
 vlc_gl_sub_renderer_Draw(struct vlc_gl_sub_renderer *sr)
 {
-    GL_ASSERT_NOERROR();
-
     const struct vlc_gl_interop *interop = sr->interop;
     const opengl_vtable_t *vt = sr->vt;
 
+    GL_ASSERT_NOERROR(vt);
+
     assert(sr->program_id);
     vt->UseProgram(sr->program_id);
 
@@ -477,7 +477,7 @@ vlc_gl_sub_renderer_Draw(struct vlc_gl_sub_renderer *sr)
     }
     vt->Disable(GL_BLEND);
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(vt);
 
     return VLC_SUCCESS;
 }
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index d4a2eda148..61f1321f69 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -197,7 +197,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR_OPTIONAL(ClientWaitSync);
 #undef GET_PROC_ADDR
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     const char *extensions = (const char *)vgl->vt.GetString(GL_EXTENSIONS);
     assert(extensions);
@@ -251,7 +251,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
         return NULL;
     }
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     vgl->sub_renderer =
         vlc_gl_sub_renderer_New(gl, &vgl->vt, supports_npot);
@@ -263,7 +263,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
         return NULL;
     }
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     if (renderer->fmt.projection_mode != PROJECTION_MODE_RECTANGULAR
      && vout_display_opengl_SetViewpoint(vgl, viewpoint) != VLC_SUCCESS)
@@ -277,13 +277,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
         *subpicture_chromas = gl_subpicture_chromas;
     }
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
     return vgl;
 }
 
 void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
 {
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     /* */
     vgl->vt.Finish();
@@ -292,7 +292,7 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
     vlc_gl_sub_renderer_Delete(vgl->sub_renderer);
     vlc_gl_renderer_Delete(vgl->renderer);
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     free(vgl);
 }
@@ -318,20 +318,20 @@ void vout_display_opengl_Viewport(vout_display_opengl_t *vgl, int x, int y,
 int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
                                 picture_t *picture, subpicture_t *subpicture)
 {
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     int ret = vlc_gl_renderer_Prepare(vgl->renderer, picture);
     if (ret != VLC_SUCCESS)
         return ret;
 
     ret = vlc_gl_sub_renderer_Prepare(vgl->sub_renderer, subpicture);
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
     return ret;
 }
 int vout_display_opengl_Display(vout_display_opengl_t *vgl,
                                 const video_format_t *source)
 {
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     /* Why drawing here and not in Render()? Because this way, the
        OpenGL providers can call vout_display_opengl_Display to force redraw.
@@ -348,7 +348,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
     /* Display */
     vlc_gl_Swap(vgl->gl);
 
-    GL_ASSERT_NOERROR();
+    GL_ASSERT_NOERROR(&vgl->vt);
 
     return VLC_SUCCESS;
 }
-- 
2.25.1



More information about the vlc-devel mailing list