[vlc-commits] gl: use vtable in converters

Thomas Guillem git at videolan.org
Wed Aug 30 13:53:56 CEST 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Aug 25 14:11:41 2017 +0200| [63528163650a8b3340d9a3566748f558ed35ddcf] | committer: Thomas Guillem

gl: use vtable in converters

This removes OpenGL / OpenGLES link dependency in converters.

Refs #18575

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

 modules/video_output/opengl/converter_android.c |  4 +-
 modules/video_output/opengl/converter_cvpx.c    | 16 ++---
 modules/video_output/opengl/converter_vaapi.c   |  2 +-
 modules/video_output/opengl/converters.c        | 78 ++++++++++++-------------
 modules/video_output/opengl/internal.h          | 46 ++++++++++++---
 modules/video_output/opengl/vout_helper.c       | 31 ++++++----
 6 files changed, 108 insertions(+), 69 deletions(-)

diff --git a/modules/video_output/opengl/converter_android.c b/modules/video_output/opengl/converter_android.c
index 7132d818a0..f4ab51886f 100644
--- a/modules/video_output/opengl/converter_android.c
+++ b/modules/video_output/opengl/converter_android.c
@@ -154,8 +154,8 @@ tc_anop_update(const opengl_tex_converter_t *tc, GLuint *textures,
         return VLC_EGENERIC;
     }
 
-    glActiveTexture(GL_TEXTURE0);
-    glBindTexture(tc->tex_target, textures[0]);
+    tc->vt->ActiveTexture(GL_TEXTURE0);
+    tc->vt->BindTexture(tc->tex_target, textures[0]);
 
     return VLC_SUCCESS;
 }
diff --git a/modules/video_output/opengl/converter_cvpx.c b/modules/video_output/opengl/converter_cvpx.c
index fdcb5cbbb4..7c2472ac13 100644
--- a/modules/video_output/opengl/converter_cvpx.c
+++ b/modules/video_output/opengl/converter_cvpx.c
@@ -63,7 +63,7 @@ tc_cvpx_update(const opengl_tex_converter_t *tc, GLuint *textures,
 
     for (unsigned i = 0; i < tc->tex_count; ++i)
     {
-        glActiveTexture(GL_TEXTURE0 + i);
+        tc->vt->ActiveTexture(GL_TEXTURE0 + i);
 
         CVOpenGLESTextureRef texture;
         CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(
@@ -79,11 +79,11 @@ tc_cvpx_update(const opengl_tex_converter_t *tc, GLuint *textures,
         }
 
         textures[i] = CVOpenGLESTextureGetName(texture);
-        glBindTexture(tc->tex_target, textures[i]);
-        glTexParameteri(tc->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        glTexParameteri(tc->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        glTexParameterf(tc->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameterf(tc->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        tc->vt->TexParameteri(tc->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        tc->vt->TexParameterf(tc->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        tc->vt->TexParameterf(tc->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
         CFRelease(texture);
     }
 
@@ -113,8 +113,8 @@ tc_cvpx_update(const opengl_tex_converter_t *tc, GLuint *textures,
 
     for (unsigned i = 0; i < tc->tex_count; ++i)
     {
-        glActiveTexture(GL_TEXTURE0 + i);
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->ActiveTexture(GL_TEXTURE0 + i);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
 
         CGLError err =
             CGLTexImageIOSurface2D(glsys->locked_ctx, tc->tex_target,
diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c
index 9044398432..463aec0345 100644
--- a/modules/video_output/opengl/converter_vaapi.c
+++ b/modules/video_output/opengl/converter_vaapi.c
@@ -190,7 +190,7 @@ tc_vaegl_update(const opengl_tex_converter_t *tc, GLuint *textures,
         if (egl_images[i] == NULL)
             goto error;
 
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
 
         priv->glEGLImageTargetTexture2DOES(tc->tex_target, egl_images[i]);
     }
diff --git a/modules/video_output/opengl/converters.c b/modules/video_output/opengl/converters.c
index 096dd09154..20bc9a5cac 100644
--- a/modules/video_output/opengl/converters.c
+++ b/modules/video_output/opengl/converters.c
@@ -81,8 +81,8 @@ struct priv
 };
 
 #if !defined(USE_OPENGL_ES2)
-static int GetTexFormatSize(int target, int tex_format, int tex_internal,
-                            int tex_type)
+static int GetTexFormatSize(opengl_tex_converter_t *tc, int target,
+                            int tex_format, int tex_internal, int tex_type)
 {
     GLint tex_param_size;
     switch (tex_format)
@@ -98,13 +98,13 @@ static int GetTexFormatSize(int target, int tex_format, int tex_internal,
     }
     GLuint texture;
 
-    glGenTextures(1, &texture);
-    glBindTexture(target, texture);
-    glTexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format, tex_type, NULL);
+    tc->vt->GenTextures(1, &texture);
+    tc->vt->BindTexture(target, texture);
+    tc->vt->TexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format, tex_type, NULL);
     GLint size = 0;
-    glGetTexLevelParameteriv(target, 0, tex_param_size, &size);
+    tc->vt->GetTexLevelParameteriv(target, 0, tex_param_size, &size);
 
-    glDeleteTextures(1, &texture);
+    tc->vt->DeleteTextures(1, &texture);
     return size;
 }
 #endif
@@ -150,8 +150,8 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
         else if (desc->pixel_size == 2)
         {
             if (oneplane16_texfmt == 0
-             || GetTexFormatSize(tex_target, oneplane_texfmt, oneplane16_texfmt,
-                                 GL_UNSIGNED_SHORT) != 16)
+             || GetTexFormatSize(tc, tex_target, oneplane_texfmt,
+                                 oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
                 return VLC_EGENERIC;
 
             internal = oneplane16_texfmt;
@@ -561,7 +561,7 @@ pbo_data_alloc(const opengl_tex_converter_t *tc, picture_t *pic)
 {
     picture_sys_t *picsys = pic->p_sys;
 
-    glGetError();
+    tc->vt->GetError();
     tc->vt->GenBuffers(pic->i_planes, picsys->buffers);
 
     for (int i = 0; i < pic->i_planes; ++i)
@@ -570,7 +570,7 @@ pbo_data_alloc(const opengl_tex_converter_t *tc, picture_t *pic)
         tc->vt->BufferData(GL_PIXEL_UNPACK_BUFFER, picsys->bytes[i], NULL,
                             GL_DYNAMIC_DRAW);
 
-        if (glGetError() != GL_NO_ERROR)
+        if (tc->vt->GetError() != GL_NO_ERROR)
         {
             msg_Err(tc->gl, "could not alloc PBO buffers");
             tc->vt->DeleteBuffers(i, picsys->buffers);
@@ -636,14 +636,14 @@ tc_pbo_update(const opengl_tex_converter_t *tc, GLuint *textures,
                             display_pic->p_sys->buffers[i]);
         tc->vt->BufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, size, data);
 
-        glActiveTexture(GL_TEXTURE0 + i);
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->ActiveTexture(GL_TEXTURE0 + i);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
 
-        glPixelStorei(GL_UNPACK_ROW_LENGTH,
-                      pic->p[i].i_pitch / pic->p[i].i_pixel_pitch);
+        tc->vt->PixelStorei(GL_UNPACK_ROW_LENGTH,
+                            pic->p[i].i_pitch / pic->p[i].i_pixel_pitch);
 
-        glTexSubImage2D(tc->tex_target, 0, 0, 0, tex_width[i], tex_height[i],
-                        tc->texs[i].format, tc->texs[i].type, NULL);
+        tc->vt->TexSubImage2D(tc->tex_target, 0, 0, 0, tex_width[i], tex_height[i],
+                              tc->texs[i].format, tc->texs[i].type, NULL);
     }
 
     /* turn off pbo */
@@ -751,14 +751,14 @@ tc_persistent_update(const opengl_tex_converter_t *tc, GLuint *textures,
         if (picsys->fence == NULL)
             tc->vt->FlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, 0,
                                             picsys->bytes[i]);
-        glActiveTexture(GL_TEXTURE0 + i);
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->ActiveTexture(GL_TEXTURE0 + i);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
 
-        glPixelStorei(GL_UNPACK_ROW_LENGTH,
-                      pic->p[i].i_pitch / pic->p[i].i_pixel_pitch);
+        tc->vt->PixelStorei(GL_UNPACK_ROW_LENGTH,
+                            pic->p[i].i_pitch / pic->p[i].i_pixel_pitch);
 
-        glTexSubImage2D(tc->tex_target, 0, 0, 0, tex_width[i], tex_height[i],
-                        tc->texs[i].format, tc->texs[i].type, NULL);
+        tc->vt->TexSubImage2D(tc->tex_target, 0, 0, 0, tex_width[i], tex_height[i],
+                              tc->texs[i].format, tc->texs[i].type, NULL);
     }
 
     bool hold;
@@ -880,10 +880,10 @@ tc_common_allocate_textures(const opengl_tex_converter_t *tc, GLuint *textures,
 {
     for (unsigned i = 0; i < tc->tex_count; i++)
     {
-        glBindTexture(tc->tex_target, textures[i]);
-        glTexImage2D(tc->tex_target, 0, tc->texs[i].internal,
-                     tex_width[i], tex_height[i], 0, tc->texs[i].format,
-                     tc->texs[i].type, NULL);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
+        tc->vt->TexImage2D(tc->tex_target, 0, tc->texs[i].internal,
+                           tex_width[i], tex_height[i], 0, tc->texs[i].format,
+                           tc->texs[i].type, NULL);
     }
     return VLC_SUCCESS;
 }
@@ -898,7 +898,7 @@ upload_plane(const opengl_tex_converter_t *tc, unsigned tex_idx,
     GLenum tex_type = tc->texs[tex_idx].type;
 
     /* This unpack alignment is the default, but setting it just in case. */
-    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+    tc->vt->PixelStorei(GL_UNPACK_ALIGNMENT, 4);
 
     if (!priv->has_unpack_subimage)
     {
@@ -929,21 +929,21 @@ upload_plane(const opengl_tex_converter_t *tc, unsigned tex_idx,
                 source += pitch;
                 destination += dst_pitch;
             }
-            glTexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
-                            tex_format, tex_type, priv->texture_temp_buf);
+            tc->vt->TexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
+                                  tex_format, tex_type, priv->texture_temp_buf);
         }
         else
         {
-            glTexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
-                            tex_format, tex_type, pixels);
+            tc->vt->TexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
+                                  tex_format, tex_type, pixels);
         }
 #undef ALIGN
     }
     else
     {
-        glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / pixel_pitch);
-        glTexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
-                        tex_format, tex_type, pixels);
+        tc->vt->PixelStorei(GL_UNPACK_ROW_LENGTH, pitch / pixel_pitch);
+        tc->vt->TexSubImage2D(tc->tex_target, 0, 0, 0, width, height,
+                              tex_format, tex_type, pixels);
     }
     return VLC_SUCCESS;
 }
@@ -958,8 +958,8 @@ tc_common_update(const opengl_tex_converter_t *tc, GLuint *textures,
     for (unsigned i = 0; i < tc->tex_count && ret == VLC_SUCCESS; i++)
     {
         assert(textures[i] != 0);
-        glActiveTexture(GL_TEXTURE0 + i);
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->ActiveTexture(GL_TEXTURE0 + i);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
         const void *pixels = plane_offset != NULL ?
                              &pic->p[i].p_pixels[plane_offset[i]] :
                              pic->p[i].p_pixels;
@@ -1066,7 +1066,7 @@ generic_init(opengl_tex_converter_t *tc, bool allow_dr)
         if (vlc_fourcc_IsYUV(tc->fmt.i_chroma))
         {
             GLint max_texture_units = 0;
-            glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
+            tc->vt->GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
             if (max_texture_units < 3)
                 return VLC_EGENERIC;
 
@@ -1136,7 +1136,7 @@ generic_init(opengl_tex_converter_t *tc, bool allow_dr)
         /* Ensure we do direct rendering with OpenGL 3.0 or higher. Indeed,
          * persistent mapped buffers seems to be slow with OpenGL 2.1 drivers
          * and bellow. This may be caused by OpenGL compatibility layer. */
-        const unsigned char *ogl_version = glGetString(GL_VERSION);
+        const unsigned char *ogl_version = tc->vt->GetString(GL_VERSION);
         const bool glver_ok = strverscmp((const char *)ogl_version, "3.0") >= 0;
 
         supports_map_persistent = glver_ok && has_pbo && has_bs && tc->vt->BufferStorage
diff --git a/modules/video_output/opengl/internal.h b/modules/video_output/opengl/internal.h
index 764539fb72..53712c8532 100644
--- a/modules/video_output/opengl/internal.h
+++ b/modules/video_output/opengl/internal.h
@@ -43,6 +43,25 @@
 #   endif
 #endif
 
+/* Core OpenGL/OpenGLES functions: the following functions pointers typedefs
+ * are not defined. */
+#if !defined(_WIN32) /* Already defined on Win32 */
+typedef void (*PFNGLACTIVETEXTUREPROC) (GLenum texture);
+#endif
+typedef GLenum (*PFNGLGETERRORPROC) (void);
+typedef const GLubyte *(*PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (*PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (*PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (*PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (*PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (*PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (*PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (*PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (*PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (*PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef void (*PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+
+/* The following are defined in glext.h but not for GLES2 or on Apple systems */
 #if defined(USE_OPENGL_ES2) || defined(__APPLE__)
 #   define PFNGLGETPROGRAMIVPROC             typeof(glGetProgramiv)*
 #   define PFNGLGETPROGRAMINFOLOGPROC        typeof(glGetProgramInfoLog)*
@@ -91,6 +110,11 @@
  * Structure containing function pointers to shaders commands
  */
 typedef struct {
+    /* Utils commands */
+    PFNGLGETERRORPROC       GetError;
+    PFNGLGETSTRINGPROC      GetString;
+    PFNGLGETINTEGERVPROC    GetIntegerv;
+
     /* Shader variables commands*/
     PFNGLGETUNIFORMLOCATIONPROC      GetUniformLocation;
     PFNGLGETATTRIBLOCATIONPROC       GetAttribLocation;
@@ -122,6 +146,18 @@ typedef struct {
     PFNGLGETSHADERIVPROC   GetShaderiv;
     PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
 
+    /* Texture commands */
+    PFNGLACTIVETEXTUREPROC          ActiveTexture;
+    PFNGLBINDTEXTUREPROC            BindTexture;
+    PFNGLTEXPARAMETERIPROC          TexParameteri;
+    PFNGLTEXPARAMETERFPROC          TexParameterf;
+    PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv; /* OpenGL only */
+    PFNGLPIXELSTOREIPROC            PixelStorei;
+    PFNGLGENTEXTURESPROC            GenTextures;
+    PFNGLDELETETEXTURESPROC         DeleteTextures;
+    PFNGLTEXIMAGE2DPROC             TexImage2D;
+    PFNGLTEXSUBIMAGE2DPROC          TexSubImage2D;
+
     /* Buffers commands */
     PFNGLGENBUFFERSPROC    GenBuffers;
     PFNGLBINDBUFFERPROC    BindBuffer;
@@ -141,13 +177,6 @@ typedef struct {
     PFNGLDELETESYNCPROC             DeleteSync; /* can be NULL */
     PFNGLCLIENTWAITSYNCPROC         ClientWaitSync; /* can be NULL */
 #endif
-
-#if defined(_WIN32)
-    PFNGLACTIVETEXTUREPROC  ActiveTexture;
-#   undef glActiveTexture
-#   define glActiveTexture tc->vt->ActiveTexture
-#endif
-
 } opengl_vtable_t;
 
 typedef struct opengl_tex_converter_t opengl_tex_converter_t;
@@ -172,7 +201,8 @@ struct opengl_tex_converter_t
 {
     /* Pointer to object gl, set by the caller of the init cb */
     vlc_gl_t *gl;
-    /* Function pointer to shaders commands, set by the caller of the init cb */
+
+    /* Function pointers to OpenGL functions, set by the caller */
     const opengl_vtable_t *vt;
     /* Available gl extensions (from GL_EXTENSIONS) */
     const char *glexts;
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index a4173dd078..646cac5529 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -399,7 +399,7 @@ GenTextures(const opengl_tex_converter_t *tc,
 
     for (unsigned i = 0; i < tc->tex_count; i++)
     {
-        glBindTexture(tc->tex_target, textures[i]);
+        tc->vt->BindTexture(tc->tex_target, textures[i]);
 
 #if !defined(USE_OPENGL_ES2)
         /* Set the texture parameters */
@@ -677,6 +677,10 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
 #define GET_PROC_ADDR_GL(name) GET_PROC_ADDR(name)
 #endif
 #define GET_PROC_ADDR_OPTIONAL(name) GET_PROC_ADDR_EXT(name, false) /* GL 3 or more */
+    GET_PROC_ADDR(GetError);
+    GET_PROC_ADDR(GetString);
+    GET_PROC_ADDR(GetIntegerv);
+
     GET_PROC_ADDR(CreateShader);
     GET_PROC_ADDR(ShaderSource);
     GET_PROC_ADDR(CompileShader);
@@ -704,6 +708,17 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR(UseProgram);
     GET_PROC_ADDR(DeleteProgram);
 
+    GET_PROC_ADDR(ActiveTexture);
+    GET_PROC_ADDR(BindTexture);
+    GET_PROC_ADDR(TexParameteri);
+    GET_PROC_ADDR(TexParameterf);
+    GET_PROC_ADDR_GL(GetTexLevelParameteriv);
+    GET_PROC_ADDR(PixelStorei);
+    GET_PROC_ADDR(GenTextures);
+    GET_PROC_ADDR(DeleteTextures);
+    GET_PROC_ADDR(TexImage2D);
+    GET_PROC_ADDR(TexSubImage2D);
+
     GET_PROC_ADDR(GenBuffers);
     GET_PROC_ADDR(BindBuffer);
     GET_PROC_ADDR(BufferData);
@@ -721,12 +736,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     GET_PROC_ADDR_OPTIONAL(DeleteSync);
     GET_PROC_ADDR_OPTIONAL(ClientWaitSync);
 #endif
-
-#if defined(_WIN32)
-    GET_PROC_ADDR(ActiveTexture, true);
-#   undef glActiveTexture
-#   define glActiveTexture vgl->vt.ActiveTexture
-#endif
 #undef GET_PROC_ADDR
 
     /* Resize the format if it is greater than the maximum texture size
@@ -1415,8 +1424,8 @@ static void DrawWithShaders(vout_display_opengl_t *vgl, struct prgm *prgm)
 
     for (unsigned j = 0; j < vgl->prgm->tc.tex_count; j++) {
         assert(vgl->texture[j] != 0);
-        glActiveTexture(GL_TEXTURE0+j);
-        glBindTexture(tc->tex_target, vgl->texture[j]);
+        vgl->vt.ActiveTexture(GL_TEXTURE0+j);
+        vgl->vt.BindTexture(tc->tex_target, vgl->texture[j]);
 
         vgl->vt.BindBuffer(GL_ARRAY_BUFFER, vgl->texture_buffer_object[j]);
 
@@ -1529,7 +1538,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
                            vgl->subpicture_buffer_object);
     }
 
-    glActiveTexture(GL_TEXTURE0 + 0);
+    vgl->vt.ActiveTexture(GL_TEXTURE0 + 0);
     for (int i = 0; i < vgl->region_count; i++) {
         gl_region_t *glr = &vgl->region[i];
         const GLfloat vertexCoord[] = {
@@ -1546,7 +1555,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
         };
 
         assert(glr->texture != 0);
-        glBindTexture(tc->tex_target, glr->texture);
+        vgl->vt.BindTexture(tc->tex_target, glr->texture);
 
         tc->pf_prepare_shader(tc, &glr->width, &glr->height, glr->alpha);
 



More information about the vlc-commits mailing list