From 8a1d31f6ab49fdca77194a103bb4ac6d4a88a676 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Thu, 10 Nov 2016 19:14:24 +1100 Subject: [PATCH] gl/utils: move gen_shader() to the plugin and remove del_shader() gst_gl_context_del_shader() can be replaced by a g_object_unref(). gst_gl_context_gen_shader() should be replaced by using GstGLSLStage. --- ext/gl/Makefile.am | 6 ++- ext/gl/gstgldeinterlace.c | 4 +- ext/gl/gstgleffects.c | 4 +- ext/gl/gstglfiltercube.c | 1 + ext/gl/gstglfilterglass.c | 7 ++- ext/gl/gstglmosaic.c | 4 +- ext/gl/gstgloverlay.c | 1 + ext/gl/gstgltransformation.c | 1 + ext/gl/gstglvideomixer.c | 8 +-- ext/gl/meson.build | 1 + gst-libs/gst/gl/gstglutils.c | 87 ------------------------------ gst-libs/gst/gl/gstglutils.h | 7 --- gst-libs/gst/gl/gstglviewconvert.c | 2 +- 13 files changed, 20 insertions(+), 113 deletions(-) diff --git a/ext/gl/Makefile.am b/ext/gl/Makefile.am index 5a82853efc..80036b5e80 100644 --- a/ext/gl/Makefile.am +++ b/ext/gl/Makefile.am @@ -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 diff --git a/ext/gl/gstgldeinterlace.c b/ext/gl/gstgldeinterlace.c index fe207cc388..568f26702a 100644 --- a/ext/gl/gstgldeinterlace.c +++ b/ext/gl/gstgldeinterlace.c @@ -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; } diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c index 8a1b4bc364..9834182aaa 100644 --- a/ext/gl/gstgleffects.c +++ b/ext/gl/gstgleffects.c @@ -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; } diff --git a/ext/gl/gstglfiltercube.c b/ext/gl/gstglfiltercube.c index a5cca44f7c..0d58656466 100644 --- a/ext/gl/gstglfiltercube.c +++ b/ext/gl/gstglfiltercube.c @@ -46,6 +46,7 @@ #include #include "gstglfiltercube.h" +#include "gstglutils.h" #define GST_CAT_DEFAULT gst_gl_filter_cube_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); diff --git a/ext/gl/gstglfilterglass.c b/ext/gl/gstglfilterglass.c index 28bc48585e..254199dd5c 100644 --- a/ext/gl/gstglfilterglass.c +++ b/ext/gl/gstglfilterglass.c @@ -42,6 +42,7 @@ #include #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); diff --git a/ext/gl/gstglmosaic.c b/ext/gl/gstglmosaic.c index 41441b0649..fcd4926a77 100644 --- a/ext/gl/gstglmosaic.c +++ b/ext/gl/gstglmosaic.c @@ -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; } diff --git a/ext/gl/gstgloverlay.c b/ext/gl/gstgloverlay.c index dd6121af64..34b20fadec 100644 --- a/ext/gl/gstgloverlay.c +++ b/ext/gl/gstgloverlay.c @@ -41,6 +41,7 @@ #include "gstgloverlay.h" #include "effects/gstgleffectssources.h" +#include "gstglutils.h" #include #include diff --git a/ext/gl/gstgltransformation.c b/ext/gl/gstgltransformation.c index ccc199ad61..eec262bb30 100644 --- a/ext/gl/gstgltransformation.c +++ b/ext/gl/gstgltransformation.c @@ -49,6 +49,7 @@ #include #include +#include "gstglutils.h" #define GST_CAT_DEFAULT gst_gl_transformation_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c index 47d039678d..0cc4c677cb 100644 --- a/ext/gl/gstglvideomixer.c +++ b/ext/gl/gstglvideomixer.c @@ -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, diff --git a/ext/gl/meson.build b/ext/gl/meson.build index a99b8c25fe..60d9ccc909 100644 --- a/ext/gl/meson.build +++ b/ext/gl/meson.build @@ -42,6 +42,7 @@ opengl_sources = [ 'gstglstereomix.c', 'gltestsrc.c', 'gstgltestsrc.c', + 'gstglutils.c' ] if build_gstgl and gstgl_dep.found() diff --git a/gst-libs/gst/gl/gstglutils.c b/gst-libs/gst/gl/gstglutils.c index d69b179453..4dd95c0c6f 100644 --- a/gst-libs/gst/gl/gstglutils.c +++ b/gst-libs/gst/gl/gstglutils.c @@ -49,93 +49,6 @@ #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) diff --git a/gst-libs/gst/gl/gstglutils.h b/gst-libs/gst/gl/gstglutils.h index 297e462fcd..5389c71717 100644 --- a/gst-libs/gst/gl/gstglutils.h +++ b/gst-libs/gst/gl/gstglutils.h @@ -28,13 +28,6 @@ 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); diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c index d4a2c1b69d..11a98f2ae9 100644 --- a/gst-libs/gst/gl/gstglviewconvert.c +++ b/gst-libs/gst/gl/gstglviewconvert.c @@ -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)