gl/utils: move gen_shader() to the plugin and remove del_shader()
authorMatthew Waters <matthew@centricular.com>
Thu, 10 Nov 2016 08:14:24 +0000 (19:14 +1100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:24 +0000 (19:32 +0000)
gst_gl_context_del_shader() can be replaced by a g_object_unref().
gst_gl_context_gen_shader() should be replaced by using GstGLSLStage.

13 files changed:
ext/gl/Makefile.am
ext/gl/gstgldeinterlace.c
ext/gl/gstgleffects.c
ext/gl/gstglfiltercube.c
ext/gl/gstglfilterglass.c
ext/gl/gstglmosaic.c
ext/gl/gstgloverlay.c
ext/gl/gstgltransformation.c
ext/gl/gstglvideomixer.c
ext/gl/meson.build
gst-libs/gst/gl/gstglutils.c
gst-libs/gst/gl/gstglutils.h
gst-libs/gst/gl/gstglviewconvert.c

index 5a82853efc9c150f1ce753cddf18c94bb1795e3e..80036b5e8004358b260f95109bf6a16494f922f7 100644 (file)
@@ -43,7 +43,8 @@ libgstopengl_la_SOURCES = \
        gstgldeinterlace.c \
        gstglstereomix.c \
        gltestsrc.c \
-       gstgltestsrc.c
+       gstgltestsrc.c \
+       gstglutils.c
 
 noinst_HEADERS = \
        gstglbasemixer.h \
@@ -69,7 +70,8 @@ noinst_HEADERS = \
        gstgldeinterlace.h \
        gstglviewconvert.h \
        gltestsrc.h \
-       gstgltestsrc.h
+       gstgltestsrc.h \
+       gstglutils.h
 
 # full opengl required
 if USE_OPENGL
index fe207cc388e19d95e9676d77f4251bbc02908310..568f26702a4fa3f5d872ce428979e1f9f0fd2391 100644 (file)
@@ -294,10 +294,8 @@ gst_gl_deinterlace_ghash_func_clean (gpointer key, gpointer value,
     gpointer data)
 {
   GstGLShader *shader = (GstGLShader *) value;
-  GstGLFilter *filter = (GstGLFilter *) data;
 
-  //blocking call, wait the opengl thread has destroyed the shader
-  gst_gl_context_del_shader (GST_GL_BASE_FILTER (filter)->context, shader);
+  gst_object_unref (shader);
 
   value = NULL;
 }
index 8a1b4bc364626b8e8f8c0913c22d4696fe691dd9..9834182aaa9266afbc719388524e37673e15b69e 100644 (file)
@@ -436,10 +436,8 @@ static void
 gst_gl_effects_ghash_func_clean (gpointer key, gpointer value, gpointer data)
 {
   GstGLShader *shader = (GstGLShader *) value;
-  GstGLFilter *filter = (GstGLFilter *) data;
 
-  //blocking call, wait the opengl thread has destroyed the shader
-  gst_gl_context_del_shader (GST_GL_BASE_FILTER (filter)->context, shader);
+  gst_object_unref (shader);
 
   value = NULL;
 }
index a5cca44f7c2aeec3f4eddf4dfee68285a37f1b40..0d5865646605aae7239c62a40de42f7dcbe92512 100644 (file)
@@ -46,6 +46,7 @@
 
 #include <gst/gl/gstglapi.h>
 #include "gstglfiltercube.h"
+#include "gstglutils.h"
 
 #define GST_CAT_DEFAULT gst_gl_filter_cube_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
index 28bc48585ef2c9322f2d5b5d3661c128f4380489..254199dd5c3b38d1aeff18db9b55f1240b6da401 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <math.h>
 #include "gstglfilterglass.h"
+#include "gstglutils.h"
 
 #define GST_CAT_DEFAULT gst_gl_filter_glass_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -181,12 +182,10 @@ gst_gl_filter_glass_reset (GstBaseTransform * trans)
 
   //blocking call, wait the opengl thread has destroyed the shader
   if (glass_filter->shader)
-    gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context,
-        glass_filter->shader);
+    gst_object_unref (glass_filter->shader);
   glass_filter->shader = NULL;
   if (glass_filter->passthrough_shader)
-    gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context,
-        glass_filter->passthrough_shader);
+    gst_object_unref (glass_filter->passthrough_shader);
   glass_filter->passthrough_shader = NULL;
 
   return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans);
index 41441b06494373f9de6a9e45d6d993d2944880f2..fcd4926a7760e1659fd1058a01c8ba2582020a82 100644 (file)
@@ -45,6 +45,7 @@
 #endif
 
 #include "gstglmosaic.h"
+#include "gstglutils.h"
 
 #define GST_CAT_DEFAULT gst_gl_mosaic_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -177,8 +178,7 @@ gst_gl_mosaic_reset (GstGLMixer * mixer)
 
   //blocking call, wait the opengl thread has destroyed the shader
   if (mosaic->shader)
-    gst_gl_context_del_shader (GST_GL_BASE_MIXER (mixer)->context,
-        mosaic->shader);
+    gst_object_unref (mosaic->shader);
   mosaic->shader = NULL;
 }
 
index dd6121af64a51d7c63263c7cd247134c4c2bc5a6..34b20fadeca99b6910eb1a764847b3421df2544a 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "gstgloverlay.h"
 #include "effects/gstgleffectssources.h"
+#include "gstglutils.h"
 
 #include <stdio.h>
 #include <stdlib.h>
index ccc199ad61742036393887ed001500aeea29e444..eec262bb30f846f725d213f4af8fe09fbbf239eb 100644 (file)
@@ -49,6 +49,7 @@
 
 #include <gst/gl/gstglapi.h>
 #include <graphene-gobject.h>
+#include "gstglutils.h"
 
 #define GST_CAT_DEFAULT gst_gl_transformation_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
index 47d039678d5475c87d92150a1fece0ede880ea1b..0cc4c677cb76314c9c42eeff5ed816a8530ae381 100644 (file)
@@ -47,6 +47,7 @@
 
 #include "gstglvideomixer.h"
 #include "gstglmixerbin.h"
+#include "gstglutils.h"
 
 #define GST_CAT_DEFAULT gst_gl_video_mixer_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -1129,11 +1130,11 @@ gst_gl_video_mixer_reset (GstGLMixer * mixer)
   GST_DEBUG_OBJECT (mixer, "context:%p", context);
 
   if (video_mixer->shader)
-    gst_gl_context_del_shader (context, video_mixer->shader);
+    gst_object_unref (video_mixer->shader);
   video_mixer->shader = NULL;
 
   if (video_mixer->checker)
-    gst_gl_context_del_shader (context, video_mixer->checker);
+    gst_object_unref (video_mixer->checker);
   video_mixer->checker = NULL;
 
   if (GST_GL_BASE_MIXER (mixer)->context)
@@ -1147,8 +1148,7 @@ gst_gl_video_mixer_init_shader (GstGLMixer * mixer, GstCaps * outcaps)
   GstGLVideoMixer *video_mixer = GST_GL_VIDEO_MIXER (mixer);
 
   if (video_mixer->shader)
-    gst_gl_context_del_shader (GST_GL_BASE_MIXER (mixer)->context,
-        video_mixer->shader);
+    gst_object_unref (video_mixer->shader);
 
   return gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context,
       gst_gl_shader_string_vertex_mat4_vertex_transform,
index a99b8c25fe3bb16b4620c75fcce60354bf5355c6..60d9ccc9096f761c003d8c7e051abb9d62f69a86 100644 (file)
@@ -42,6 +42,7 @@ opengl_sources = [
   'gstglstereomix.c',
   'gltestsrc.c',
   'gstgltestsrc.c',
+  'gstglutils.c'
 ]
 
 if build_gstgl and gstgl_dep.found()
index d69b1794531f683237fa4fe9b39cb772978a0ed7..4dd95c0c6f3caaa20d305f35c84fb06799a7f324 100644 (file)
 #define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
 #define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
 
-struct _compile_shader
-{
-  GstGLShader **shader;
-  const gchar *vertex_src;
-  const gchar *fragment_src;
-};
-
-static void
-_compile_shader (GstGLContext * context, struct _compile_shader *data)
-{
-  GstGLShader *shader;
-  GstGLSLStage *vert, *frag;
-  GError *error = NULL;
-
-  shader = gst_gl_shader_new (context);
-
-  if (data->vertex_src) {
-    vert = gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
-        GST_GLSL_VERSION_NONE,
-        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY, data->vertex_src);
-    if (!gst_glsl_stage_compile (vert, &error)) {
-      GST_ERROR_OBJECT (vert, "%s", error->message);
-      gst_object_unref (vert);
-      gst_object_unref (shader);
-      return;
-    }
-    if (!gst_gl_shader_attach (shader, vert)) {
-      gst_object_unref (shader);
-      return;
-    }
-  }
-
-  if (data->fragment_src) {
-    frag = gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
-        GST_GLSL_VERSION_NONE,
-        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
-        data->fragment_src);
-    if (!gst_glsl_stage_compile (frag, &error)) {
-      GST_ERROR_OBJECT (frag, "%s", error->message);
-      gst_object_unref (frag);
-      gst_object_unref (shader);
-      return;
-    }
-    if (!gst_gl_shader_attach (shader, frag)) {
-      gst_object_unref (shader);
-      return;
-    }
-  }
-
-  if (!gst_gl_shader_link (shader, &error)) {
-    GST_ERROR_OBJECT (shader, "%s", error->message);
-    g_error_free (error);
-    error = NULL;
-    gst_gl_context_clear_shader (context);
-    gst_object_unref (shader);
-    return;
-  }
-
-  *data->shader = shader;
-}
-
-/* Called by glfilter */
-gboolean
-gst_gl_context_gen_shader (GstGLContext * context, const gchar * vert_src,
-    const gchar * frag_src, GstGLShader ** shader)
-{
-  struct _compile_shader data;
-
-  g_return_val_if_fail (frag_src != NULL || vert_src != NULL, FALSE);
-  g_return_val_if_fail (shader != NULL, FALSE);
-
-  data.shader = shader;
-  data.vertex_src = vert_src;
-  data.fragment_src = frag_src;
-
-  gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _compile_shader,
-      &data);
-
-  return *shader != NULL;
-}
-
-/* Called by glfilter */
-void
-gst_gl_context_del_shader (GstGLContext * context, GstGLShader * shader)
-{
-  gst_object_unref (shader);
-}
 
 static gboolean
 gst_gl_display_found (GstElement * element, GstGLDisplay * display)
index 297e462fcd5ed9046fdf279c2c6702a4c0a0ac9c..5389c71717d9acee6f132f7655d449891b30b3cb 100644 (file)
 
 G_BEGIN_DECLS
 
-GST_EXPORT
-gboolean gst_gl_context_gen_shader (GstGLContext * context,
-    const gchar * shader_vertex_source,
-    const gchar * shader_fragment_source, GstGLShader ** shader);
-GST_EXPORT
-void gst_gl_context_del_shader (GstGLContext * context, GstGLShader * shader);
-
 GST_EXPORT
 gboolean gst_gl_ensure_element_data (gpointer element,
     GstGLDisplay **display_ptr, GstGLContext ** other_context_ptr);
index d4a2c1b69d694d7e242d5b95caa4d5868333e136..11a98f2ae913a010ca4656866b54ea5d542d34b5 100644 (file)
@@ -1357,7 +1357,7 @@ gst_gl_view_convert_reset (GstGLViewConvert * viewconvert)
 {
   g_return_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert));
   if (viewconvert->shader)
-    gst_gl_context_del_shader (viewconvert->context, viewconvert->shader);
+    gst_object_unref (viewconvert->shader);
   viewconvert->shader = NULL;
 
   if (viewconvert->fbo)