[vlc-commits] opengl: use all GL symbols from the vtable

Thomas Guillem git at videolan.org
Wed Dec 6 16:34:19 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Jul 19 17:18:29 2017 +0200| [a373a92bf6d4319ce79c87adc45df3c1ab5ab7ed] | committer: Thomas Guillem

opengl: use all GL symbols from the vtable

Refs #19093

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a373a92bf6d4319ce79c87adc45df3c1ab5ab7ed
---

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

diff --git a/modules/video_output/opengl/converter.h b/modules/video_output/opengl/converter.h
index 5924903f4b..42ba005160 100644
--- a/modules/video_output/opengl/converter.h
+++ b/modules/video_output/opengl/converter.h
@@ -44,18 +44,30 @@
 typedef void (*PFNGLACTIVETEXTUREPROC) (GLenum texture);
 #endif
 typedef void (APIENTRY *PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (APIENTRY *PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
 typedef void (APIENTRY *PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+typedef void (APIENTRY *PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (APIENTRY *PFNGLCLEARPROC) (GLbitfield mask);
 typedef void (APIENTRY *PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (APIENTRY *PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (APIENTRY *PFNGLDISABLEPROC) (GLenum cap);
+typedef void (APIENTRY *PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (APIENTRY *PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (APIENTRY *PFNGLENABLEPROC) (GLenum cap);
+typedef void (APIENTRY *PFNGLFINISHPROC)(void);
+typedef void (APIENTRY *PFNGLFLUSHPROC)(void);
 typedef void (APIENTRY *PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
 typedef GLenum (APIENTRY *PFNGLGETERRORPROC) (void);
 typedef void (APIENTRY *PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
 typedef const GLubyte *(APIENTRY *PFNGLGETSTRINGPROC) (GLenum name);
 typedef void (APIENTRY *PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
 typedef void (APIENTRY *PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRY *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);
 typedef void (APIENTRY *PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
 typedef void (APIENTRY *PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
 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);
 
 /* The following are defined in glext.h but not for GLES2 or on Apple systems */
 #if defined(USE_OPENGL_ES2) || defined(__APPLE__)
@@ -115,7 +127,17 @@ typedef struct {
      * GL / GLES core functions
      */
     PFNGLBINDTEXTUREPROC    BindTexture;
+    PFNGLBLENDFUNCPROC      BlendFunc;
+    PFNGLCLEARCOLORPROC     ClearColor;
+    PFNGLCLEARPROC          Clear;
     PFNGLDELETETEXTURESPROC DeleteTextures;
+    PFNGLDEPTHMASKPROC      DepthMask;
+    PFNGLDISABLEPROC        Disable;
+    PFNGLDRAWARRAYSPROC     DrawArrays;
+    PFNGLDRAWELEMENTSPROC   DrawElements;
+    PFNGLENABLEPROC         Enable;
+    PFNGLFINISHPROC         Finish;
+    PFNGLFLUSHPROC          Flush;
     PFNGLGENTEXTURESPROC    GenTextures;
     PFNGLGETERRORPROC       GetError;
     PFNGLGETINTEGERVPROC    GetIntegerv;
@@ -125,9 +147,11 @@ typedef struct {
     PFNGLTEXPARAMETERFPROC  TexParameterf;
     PFNGLTEXPARAMETERIPROC  TexParameteri;
     PFNGLTEXSUBIMAGE2DPROC  TexSubImage2D;
+    PFNGLVIEWPORTPROC       Viewport;
 
     /* GL only core functions: NULL for GLES2 */
     PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv; /* Can be NULL */
+    PFNGLTEXENVFPROC                TexEnvf; /* Can be NULL */
 
     /*
      * GL / GLES extensions
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index d0a2c73410..c220e42c44 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -60,7 +60,7 @@
 
 #ifdef HAVE_GL_ASSERT_NOERROR
 # define GL_ASSERT_NOERROR() do { \
-    GLenum glError = glGetError(); \
+    GLenum glError = vgl->vt.GetError(); \
     switch (glError) \
     { \
         case GL_NO_ERROR: break; \
@@ -411,7 +411,7 @@ GenTextures(const opengl_tex_converter_t *tc,
             const GLsizei *tex_width, const GLsizei *tex_height,
             GLuint *textures)
 {
-    glGenTextures(tc->tex_count, textures);
+    tc->vt->GenTextures(tc->tex_count, textures);
 
     for (unsigned i = 0; i < tc->tex_count; i++)
     {
@@ -419,14 +419,14 @@ GenTextures(const opengl_tex_converter_t *tc,
 
 #if !defined(USE_OPENGL_ES2)
         /* Set the texture parameters */
-        glTexParameterf(tc->tex_target, GL_TEXTURE_PRIORITY, 1.0);
-        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+        tc->vt->TexParameterf(tc->tex_target, GL_TEXTURE_PRIORITY, 1.0);
+        tc->vt->TexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 #endif
 
-        glTexParameteri(tc->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        glTexParameteri(tc->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(tc->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameteri(tc->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     }
 
     if (tc->pf_allocate_textures != NULL)
@@ -434,7 +434,7 @@ GenTextures(const opengl_tex_converter_t *tc,
         int ret = tc->pf_allocate_textures(tc, textures, tex_width, tex_height);
         if (ret != VLC_SUCCESS)
         {
-            glDeleteTextures(tc->tex_count, textures);
+            tc->vt->DeleteTextures(tc->tex_count, textures);
             memset(textures, 0, tc->tex_count * sizeof(GLuint));
             return ret;
         }
@@ -445,7 +445,7 @@ GenTextures(const opengl_tex_converter_t *tc,
 static void
 DelTextures(const opengl_tex_converter_t *tc, GLuint *textures)
 {
-    glDeleteTextures(tc->tex_count, textures);
+    tc->vt->DeleteTextures(tc->tex_count, textures);
     memset(textures, 0, tc->tex_count * sizeof(GLuint));
 }
 
@@ -727,30 +727,16 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
                                                vlc_gl_t *gl,
                                                const vlc_viewpoint_t *viewpoint)
 {
-    vout_display_opengl_t *vgl = calloc(1, sizeof(*vgl));
-    if (!vgl)
-        return NULL;
-
-    GL_ASSERT_NOERROR();
-    vgl->gl = gl;
-
     if (gl->getProcAddress == NULL) {
         msg_Err(gl, "getProcAddress not implemented, bailing out\n");
-        free(vgl);
         return NULL;
     }
 
-    const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
-#if !defined(USE_OPENGL_ES2)
-    const unsigned char *ogl_version = glGetString(GL_VERSION);
-    bool supports_shaders = strverscmp((const char *)ogl_version, "2.0") >= 0;
-    if (!supports_shaders)
-    {
-        msg_Err(gl, "shaders not supported, bailing out\n");
-        free(vgl);
+    vout_display_opengl_t *vgl = calloc(1, sizeof(*vgl));
+    if (!vgl)
         return NULL;
-    }
-#endif
+
+    vgl->gl = gl;
 
 #define GET_PROC_ADDR_CORE(name) vgl->vt.name = gl##name
 #define GET_PROC_ADDR_EXT(name, critical) do { \
@@ -771,7 +757,17 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
 #define GET_PROC_ADDR_OPTIONAL(name) GET_PROC_ADDR_EXT(name, false) /* GL 3 or more */
 
     GET_PROC_ADDR_CORE(BindTexture);
+    GET_PROC_ADDR_CORE(BlendFunc);
+    GET_PROC_ADDR_CORE(Clear);
+    GET_PROC_ADDR_CORE(ClearColor);
     GET_PROC_ADDR_CORE(DeleteTextures);
+    GET_PROC_ADDR_CORE(DepthMask);
+    GET_PROC_ADDR_CORE(Disable);
+    GET_PROC_ADDR_CORE(DrawArrays);
+    GET_PROC_ADDR_CORE(DrawElements);
+    GET_PROC_ADDR_CORE(Enable);
+    GET_PROC_ADDR_CORE(Finish);
+    GET_PROC_ADDR_CORE(Flush);
     GET_PROC_ADDR_CORE(GenTextures);
     GET_PROC_ADDR_CORE(GetError);
     GET_PROC_ADDR_CORE(GetIntegerv);
@@ -781,8 +777,10 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR_CORE(TexParameterf);
     GET_PROC_ADDR_CORE(TexParameteri);
     GET_PROC_ADDR_CORE(TexSubImage2D);
+    GET_PROC_ADDR_CORE(Viewport);
 
     GET_PROC_ADDR_CORE_GL(GetTexLevelParameteriv);
+    GET_PROC_ADDR_CORE_GL(TexEnvf);
 
     GET_PROC_ADDR(CreateShader);
     GET_PROC_ADDR(ShaderSource);
@@ -831,10 +829,24 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR_OPTIONAL(ClientWaitSync);
 #undef GET_PROC_ADDR
 
+    GL_ASSERT_NOERROR();
+
+    const char *extensions = (const char *)vgl->vt.GetString(GL_EXTENSIONS);
+#if !defined(USE_OPENGL_ES2)
+    const unsigned char *ogl_version = vgl->vt.GetString(GL_VERSION);
+    bool supports_shaders = strverscmp((const char *)ogl_version, "2.0") >= 0;
+    if (!supports_shaders)
+    {
+        msg_Err(gl, "shaders not supported, bailing out\n");
+        free(vgl);
+        return NULL;
+    }
+#endif
+
     /* Resize the format if it is greater than the maximum texture size
      * supported by the hardware */
     GLint       max_tex_size;
-    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size);
+    vgl->vt.GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size);
 
     if ((GLint)fmt->i_width > max_tex_size ||
         (GLint)fmt->i_height > max_tex_size)
@@ -914,12 +926,12 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     }
 
     /* */
-    glDisable(GL_BLEND);
-    glDisable(GL_DEPTH_TEST);
-    glDepthMask(GL_FALSE);
-    glEnable(GL_CULL_FACE);
-    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-    glClear(GL_COLOR_BUFFER_BIT);
+    vgl->vt.Disable(GL_BLEND);
+    vgl->vt.Disable(GL_DEPTH_TEST);
+    vgl->vt.DepthMask(GL_FALSE);
+    vgl->vt.Enable(GL_CULL_FACE);
+    vgl->vt.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    vgl->vt.Clear(GL_COLOR_BUFFER_BIT);
 
     vgl->vt.GenBuffers(1, &vgl->vertex_buffer_object);
     vgl->vt.GenBuffers(1, &vgl->index_buffer_object);
@@ -961,8 +973,8 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
     GL_ASSERT_NOERROR();
 
     /* */
-    glFinish();
-    glFlush();
+    vgl->vt.Finish();
+    vgl->vt.Flush();
 
     opengl_tex_converter_t *tc = vgl->prgm->tc;
     if (!tc->handle_texs_gen)
@@ -990,9 +1002,9 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
     opengl_deinit_program(vgl, vgl->prgm);
     opengl_deinit_program(vgl, vgl->sub_prgm);
 
-    free(vgl);
-
     GL_ASSERT_NOERROR();
+
+    free(vgl);
 }
 
 static void UpdateZ(vout_display_opengl_t *vgl)
@@ -1568,7 +1580,7 @@ static void DrawWithShaders(vout_display_opengl_t *vgl, struct prgm *prgm)
     vgl->vt.UniformMatrix4fv(prgm->uloc.ZoomMatrix, 1, GL_FALSE,
                              prgm->var.ZoomMatrix);
 
-    glDrawElements(GL_TRIANGLES, vgl->nb_indices, GL_UNSIGNED_SHORT, 0);
+    vgl->vt.DrawElements(GL_TRIANGLES, vgl->nb_indices, GL_UNSIGNED_SHORT, 0);
 }
 
 
@@ -1628,7 +1640,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
     /* Why drawing here and not in Render()? Because this way, the
        OpenGL providers can call vout_display_opengl_Display to force redraw.
        Currently, the OS X provider uses it to get a smooth window resizing */
-    glClear(GL_COLOR_BUFFER_BIT);
+    vgl->vt.Clear(GL_COLOR_BUFFER_BIT);
 
     vgl->vt.UseProgram(vgl->prgm->id);
 
@@ -1685,8 +1697,8 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
     opengl_tex_converter_t *tc = prgm->tc;
     vgl->vt.UseProgram(program);
 
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    vgl->vt.Enable(GL_BLEND);
+    vgl->vt.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
     /* We need two buffer objects for each region: for vertex and texture coordinates. */
     if (2 * vgl->region_count > vgl->subpicture_buffer_object_count) {
@@ -1751,9 +1763,9 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
         vgl->vt.UniformMatrix4fv(prgm->uloc.ZoomMatrix, 1, GL_FALSE,
                                  prgm->var.ZoomMatrix);
 
-        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+        vgl->vt.DrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     }
-    glDisable(GL_BLEND);
+    vgl->vt.Disable(GL_BLEND);
 
     /* Display */
     vlc_gl_Swap(vgl->gl);



More information about the vlc-commits mailing list