[vlc-devel] [PATCH v2 04/21] opengl: remove tex converter usages

Romain Vimont rom1v at videolabs.io
Tue Jan 7 12:41:40 CET 2020


Use interop instance directly where possible.
---
 modules/video_output/opengl/converter_sw.c    | 47 +++++++++----------
 modules/video_output/opengl/converter_vaapi.c | 12 ++---
 .../video_output/opengl/fragment_shaders.c    | 20 ++++----
 modules/video_output/opengl/vout_helper.c     | 39 +++++++--------
 4 files changed, 56 insertions(+), 62 deletions(-)

diff --git a/modules/video_output/opengl/converter_sw.c b/modules/video_output/opengl/converter_sw.c
index 2b6b9612bb..5c59a53bfa 100644
--- a/modules/video_output/opengl/converter_sw.c
+++ b/modules/video_output/opengl/converter_sw.c
@@ -70,10 +70,8 @@ pbo_picture_destroy(picture_t *pic)
 }
 
 static picture_t *
-pbo_picture_create(const opengl_tex_converter_t *tc)
+pbo_picture_create(const struct vlc_gl_interop *interop)
 {
-    const struct vlc_gl_interop *interop = &tc->interop;
-
     picture_sys_t *picsys = calloc(1, sizeof(*picsys));
     if (unlikely(picsys == NULL))
         return NULL;
@@ -89,8 +87,8 @@ pbo_picture_create(const opengl_tex_converter_t *tc)
         return NULL;
     }
 
-    tc->vt->GenBuffers(pic->i_planes, picsys->buffers);
-    picsys->DeleteBuffers = tc->vt->DeleteBuffers;
+    interop->vt->GenBuffers(pic->i_planes, picsys->buffers);
+    picsys->DeleteBuffers = interop->vt->DeleteBuffers;
 
     /* XXX: needed since picture_NewFromResource override pic planes */
     if (picture_Setup(pic, &interop->fmt))
@@ -118,22 +116,22 @@ pbo_picture_create(const opengl_tex_converter_t *tc)
 }
 
 static int
-pbo_data_alloc(const opengl_tex_converter_t *tc, picture_t *pic)
+pbo_data_alloc(const struct vlc_gl_interop *interop, picture_t *pic)
 {
     picture_sys_t *picsys = pic->p_sys;
 
-    tc->vt->GetError();
+    interop->vt->GetError();
 
     for (int i = 0; i < pic->i_planes; ++i)
     {
-        tc->vt->BindBuffer(GL_PIXEL_UNPACK_BUFFER, picsys->buffers[i]);
-        tc->vt->BufferData(GL_PIXEL_UNPACK_BUFFER, picsys->bytes[i], NULL,
-                            GL_DYNAMIC_DRAW);
+        interop->vt->BindBuffer(GL_PIXEL_UNPACK_BUFFER, picsys->buffers[i]);
+        interop->vt->BufferData(GL_PIXEL_UNPACK_BUFFER, picsys->bytes[i], NULL,
+                                GL_DYNAMIC_DRAW);
 
-        if (tc->vt->GetError() != GL_NO_ERROR)
+        if (interop->vt->GetError() != GL_NO_ERROR)
         {
-            msg_Err(tc->gl, "could not alloc PBO buffers");
-            tc->vt->DeleteBuffers(i, picsys->buffers);
+            msg_Err(interop->gl, "could not alloc PBO buffers");
+            interop->vt->DeleteBuffers(i, picsys->buffers);
             return VLC_EGENERIC;
         }
     }
@@ -141,21 +139,22 @@ pbo_data_alloc(const opengl_tex_converter_t *tc, picture_t *pic)
 }
 
 static int
-pbo_pics_alloc(const opengl_tex_converter_t *tc)
+pbo_pics_alloc(const struct vlc_gl_interop *interop)
 {
-    struct priv *priv = tc->interop.priv;
+    struct priv *priv = interop->priv;
     for (size_t i = 0; i < PBO_DISPLAY_COUNT; ++i)
     {
-        picture_t *pic = priv->pbo.display_pics[i] = pbo_picture_create(tc);
+        picture_t *pic = priv->pbo.display_pics[i] =
+            pbo_picture_create(interop);
         if (pic == NULL)
             goto error;
 
-        if (pbo_data_alloc(tc, pic) != VLC_SUCCESS)
+        if (pbo_data_alloc(interop, pic) != VLC_SUCCESS)
             goto error;
     }
 
     /* turn off pbo */
-    tc->vt->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+    interop->vt->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
 
     return VLC_SUCCESS;
 error:
@@ -308,7 +307,7 @@ opengl_tex_converter_generic_init(opengl_tex_converter_t *tc, bool allow_dr)
     if (vlc_fourcc_IsYUV(interop->fmt.i_chroma))
     {
         GLint max_texture_units = 0;
-        tc->vt->GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
+        interop->vt->GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
         if (max_texture_units < 3)
             return VLC_EGENERIC;
 
@@ -358,7 +357,7 @@ opengl_tex_converter_generic_init(opengl_tex_converter_t *tc, bool allow_dr)
     struct priv *priv = interop->priv = calloc(1, sizeof(struct priv));
     if (unlikely(priv == NULL))
     {
-        tc->vt->DeleteShader(fragment_shader);
+        interop->vt->DeleteShader(fragment_shader);
         return VLC_ENOMEM;
     }
 
@@ -375,16 +374,16 @@ opengl_tex_converter_generic_init(opengl_tex_converter_t *tc, bool allow_dr)
     if (allow_dr && priv->has_unpack_subimage)
     {
         /* Ensure we do direct rendering / PBO with OpenGL 3.0 or higher. */
-        const unsigned char *ogl_version = tc->vt->GetString(GL_VERSION);
+        const unsigned char *ogl_version = interop->vt->GetString(GL_VERSION);
         const bool glver_ok = strverscmp((const char *)ogl_version, "3.0") >= 0;
 
         const bool has_pbo = glver_ok &&
             (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_pixel_buffer_object") ||
              vlc_gl_StrHasToken(interop->glexts, "GL_EXT_pixel_buffer_object"));
 
-        const bool supports_pbo = has_pbo && tc->vt->BufferData
-            && tc->vt->BufferSubData;
-        if (supports_pbo && pbo_pics_alloc(tc) == VLC_SUCCESS)
+        const bool supports_pbo = has_pbo && interop->vt->BufferData
+            && interop->vt->BufferSubData;
+        if (supports_pbo && pbo_pics_alloc(interop) == VLC_SUCCESS)
         {
             static const struct vlc_gl_interop_ops pbo_ops = {
                 .allocate_textures = tc_common_allocate_textures,
diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c
index 7e6e106fe2..bea2164d05 100644
--- a/modules/video_output/opengl/converter_vaapi.c
+++ b/modules/video_output/opengl/converter_vaapi.c
@@ -101,10 +101,8 @@ vaegl_release_last_pic(const struct vlc_gl_interop *interop, struct priv *priv)
 }
 
 static int
-vaegl_init_fourcc(const opengl_tex_converter_t *tc, struct priv *priv,
-                  unsigned va_fourcc)
+vaegl_init_fourcc(struct priv *priv, unsigned va_fourcc)
 {
-    (void) tc;
     switch (va_fourcc)
     {
         case VA_FOURCC_NV12:
@@ -305,7 +303,7 @@ static int strcasecmp_void(const void *a, const void *b)
 }
 
 static int
-tc_va_check_interop_blacklist(opengl_tex_converter_t *tc, VADisplay *vadpy)
+tc_va_check_interop_blacklist(const struct vlc_gl_interop *interop, VADisplay *vadpy)
 {
     const char *vendor = vaQueryVendorString(vadpy);
     if (vendor == NULL)
@@ -326,7 +324,7 @@ tc_va_check_interop_blacklist(opengl_tex_converter_t *tc, VADisplay *vadpy)
                                 BL_SIZE_MAX, strcasecmp_void);
     if (found != NULL)
     {
-        msg_Warn(tc->gl, "The '%s' driver is blacklisted: no interop", found);
+        msg_Warn(interop->gl, "The '%s' driver is blacklisted: no interop", found);
         return VLC_EGENERIC;
     }
 
@@ -407,7 +405,7 @@ Open(vlc_object_t *obj)
             vlc_assert_unreachable();
     }
 
-    if (vaegl_init_fourcc(tc, priv, va_fourcc))
+    if (vaegl_init_fourcc(priv, va_fourcc))
         goto error;
 
     priv->glEGLImageTargetTexture2DOES =
@@ -418,7 +416,7 @@ Open(vlc_object_t *obj)
     priv->vadpy = dec_device->opaque;
     assert(priv->vadpy != NULL);
 
-    if (tc_va_check_interop_blacklist(tc, priv->vadpy))
+    if (tc_va_check_interop_blacklist(interop, priv->vadpy))
         goto error;
 
     if (tc_va_check_derive_image(interop))
diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
index 1d5b455416..7edf4d2f74 100644
--- a/modules/video_output/opengl/fragment_shaders.c
+++ b/modules/video_output/opengl/fragment_shaders.c
@@ -62,10 +62,10 @@
 # define GL_TEXTURE_LUMINANCE_SIZE 0x8060
 #endif
 
-static int GetTexFormatSize(opengl_tex_converter_t *tc, int target,
+static int GetTexFormatSize(const opengl_vtable_t *vt, int target,
                             int tex_format, int tex_internal, int tex_type)
 {
-    if (!tc->vt->GetTexLevelParameteriv)
+    if (!vt->GetTexLevelParameteriv)
         return -1;
 
     GLint tex_param_size;
@@ -87,13 +87,13 @@ static int GetTexFormatSize(opengl_tex_converter_t *tc, int target,
     }
     GLuint texture;
 
-    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);
+    vt->GenTextures(1, &texture);
+    vt->BindTexture(target, texture);
+    vt->TexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format, tex_type, NULL);
     GLint size = 0;
-    tc->vt->GetTexLevelParameteriv(target, 0, tex_param_size, &size);
+    vt->GetTexLevelParameteriv(target, 0, tex_param_size, &size);
 
-    tc->vt->DeleteTextures(1, &texture);
+    vt->DeleteTextures(1, &texture);
     return size > 0 ? size * mul : size;
 }
 
@@ -126,7 +126,7 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
     float yuv_range_correction = 1.0;
     if (desc->pixel_size == 2)
     {
-        if (GetTexFormatSize(tc, tex_target, oneplane_texfmt,
+        if (GetTexFormatSize(tc->vt, tex_target, oneplane_texfmt,
                              oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
             return VLC_EGENERIC;
 
@@ -187,7 +187,7 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
         else if (desc->pixel_size == 2)
         {
             if (twoplanes16_texfmt == 0
-             || GetTexFormatSize(tc, tex_target, twoplanes_texfmt,
+             || GetTexFormatSize(tc->vt, tex_target, twoplanes_texfmt,
                                  twoplanes16_texfmt, GL_UNSIGNED_SHORT) != 16)
                 return VLC_EGENERIC;
             interop->texs[0] = (struct vlc_gl_tex_cfg) {
@@ -316,7 +316,7 @@ tc_rgb_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
             };
             break;
         case VLC_CODEC_BGRA: {
-            if (GetTexFormatSize(tc, tex_target, GL_BGRA, GL_RGBA,
+            if (GetTexFormatSize(tc->vt, tex_target, GL_BGRA, GL_RGBA,
                                  GL_UNSIGNED_BYTE) != 32)
                 return VLC_EGENERIC;
             interop->texs[0] = (struct vlc_gl_tex_cfg) {
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 25805780c5..e06f59fd74 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -353,36 +353,34 @@ static GLuint BuildVertexShader(const opengl_tex_converter_t *tc,
 }
 
 static int
-GenTextures(const opengl_tex_converter_t *tc,
+GenTextures(const struct vlc_gl_interop *interop,
             const GLsizei *tex_width, const GLsizei *tex_height,
             GLuint *textures)
 {
-    const struct vlc_gl_interop *interop = &tc->interop;
-
-    tc->vt->GenTextures(interop->tex_count, textures);
+    interop->vt->GenTextures(interop->tex_count, textures);
 
     for (unsigned i = 0; i < interop->tex_count; i++)
     {
-        tc->vt->BindTexture(interop->tex_target, textures[i]);
+        interop->vt->BindTexture(interop->tex_target, textures[i]);
 
 #if !defined(USE_OPENGL_ES2)
         /* Set the texture parameters */
-        tc->vt->TexParameterf(interop->tex_target, GL_TEXTURE_PRIORITY, 1.0);
-        tc->vt->TexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+        interop->vt->TexParameterf(interop->tex_target, GL_TEXTURE_PRIORITY, 1.0);
+        interop->vt->TexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 #endif
 
-        tc->vt->TexParameteri(interop->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-        tc->vt->TexParameteri(interop->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-        tc->vt->TexParameteri(interop->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        tc->vt->TexParameteri(interop->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        interop->vt->TexParameteri(interop->tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        interop->vt->TexParameteri(interop->tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        interop->vt->TexParameteri(interop->tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        interop->vt->TexParameteri(interop->tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     }
 
     if (interop->ops->allocate_textures != NULL)
     {
-        int ret = interop->ops->allocate_textures(&tc->interop, textures, tex_width, tex_height);
+        int ret = interop->ops->allocate_textures(interop, textures, tex_width, tex_height);
         if (ret != VLC_SUCCESS)
         {
-            tc->vt->DeleteTextures(interop->tex_count, textures);
+            interop->vt->DeleteTextures(interop->tex_count, textures);
             memset(textures, 0, interop->tex_count * sizeof(GLuint));
             return ret;
         }
@@ -391,10 +389,9 @@ GenTextures(const opengl_tex_converter_t *tc,
 }
 
 static void
-DelTextures(const opengl_tex_converter_t *tc, GLuint *textures)
+DelTextures(const struct vlc_gl_interop *interop, GLuint *textures)
 {
-    const struct vlc_gl_interop *interop = &tc->interop;
-    tc->vt->DeleteTextures(interop->tex_count, textures);
+    interop->vt->DeleteTextures(interop->tex_count, textures);
     memset(textures, 0, interop->tex_count * sizeof(GLuint));
 }
 
@@ -881,7 +878,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
 
     if (!interop->handle_texs_gen)
     {
-        ret = GenTextures(vgl->prgm->tc, vgl->tex_width, vgl->tex_height,
+        ret = GenTextures(&vgl->prgm->tc->interop, vgl->tex_width, vgl->tex_height,
                           vgl->texture);
         if (ret != VLC_SUCCESS)
         {
@@ -1071,7 +1068,7 @@ picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl, unsigned
     return vgl->pool;
 
 error:
-    DelTextures(tc, vgl->texture);
+    DelTextures(interop, vgl->texture);
     return NULL;
 }
 
@@ -1081,7 +1078,7 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
     GL_ASSERT_NOERROR();
 
     opengl_tex_converter_t *tc = vgl->prgm->tc;
-    struct vlc_gl_interop *interop = &tc->interop;
+    const struct vlc_gl_interop *interop = &tc->interop;
 
     /* Update the texture */
     int ret = interop->ops->update_textures(interop, vgl->texture, vgl->tex_width, vgl->tex_height,
@@ -1147,7 +1144,7 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
             if (!glr->texture)
             {
                 /* Could not recycle a previous texture, generate a new one. */
-                ret = GenTextures(tc, &glr->width, &glr->height, &glr->texture);
+                ret = GenTextures(interop, &glr->width, &glr->height, &glr->texture);
                 if (ret != VLC_SUCCESS)
                     continue;
             }
@@ -1161,7 +1158,7 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
     }
     for (int i = 0; i < last_count; i++) {
         if (last[i].texture)
-            DelTextures(tc, &last[i].texture);
+            DelTextures(interop, &last[i].texture);
     }
     free(last);
 
-- 
2.25.0.rc0



More information about the vlc-devel mailing list