summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2019-06-05 18:17:35 +1000
committerMatthew Waters <matthew@centricular.com>2020-02-03 19:42:46 +1100
commita016e47a9159206221cf7c06e511b305fb12b045 (patch)
tree8580b3cfc671380ca137c418664c265df3098844
parent969446f1fcf38c741d40e8a220f4272194bfecc3 (diff)
downloadgstreamer-plugins-base-a016e47a9159206221cf7c06e511b305fb12b045.tar.gz
glvideomixer: perform _get_highest_precision on the GL thread
gst_gl_shader_string_get_highest_precision needs to make an OpenGL call so execution outside the OpenGL thread and context results in undefined behaviour.
-rw-r--r--ext/gl/gstglvideomixer.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/ext/gl/gstglvideomixer.c b/ext/gl/gstglvideomixer.c
index 8eca6e0b5..c5b9dc9a2 100644
--- a/ext/gl/gstglvideomixer.c
+++ b/ext/gl/gstglvideomixer.c
@@ -473,7 +473,7 @@ static GstCaps *_fixate_caps (GstAggregator * agg, GstCaps * caps);
static gboolean gst_gl_video_mixer_propose_allocation (GstAggregator *
agg, GstAggregatorPad * agg_pad, GstQuery * decide_query, GstQuery * query);
static void gst_gl_video_mixer_reset (GstGLMixer * mixer);
-static gboolean gst_gl_video_mixer_init_shader (GstGLMixer * mixer,
+static gboolean gst_gl_video_mixer_set_caps (GstGLMixer * mixer,
GstCaps * outcaps);
static gboolean gst_gl_video_mixer_process_textures (GstGLMixer * mixer,
@@ -918,7 +918,7 @@ gst_gl_video_mixer_class_init (GstGLVideoMixerClass * klass)
GST_TYPE_GL_VIDEO_MIXER_BACKGROUND,
DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- GST_GL_MIXER_CLASS (klass)->set_caps = gst_gl_video_mixer_init_shader;
+ GST_GL_MIXER_CLASS (klass)->set_caps = gst_gl_video_mixer_set_caps;
GST_GL_MIXER_CLASS (klass)->reset = gst_gl_video_mixer_reset;
GST_GL_MIXER_CLASS (klass)->process_textures =
gst_gl_video_mixer_process_textures;
@@ -1203,30 +1203,16 @@ gst_gl_video_mixer_reset (GstGLMixer * mixer)
}
static gboolean
-gst_gl_video_mixer_init_shader (GstGLMixer * mixer, GstCaps * outcaps)
+gst_gl_video_mixer_set_caps (GstGLMixer * mixer, GstCaps * outcaps)
{
GstGLVideoMixer *video_mixer = GST_GL_VIDEO_MIXER (mixer);
- gchar *frag_str;
- gboolean ret;
- if (video_mixer->shader)
- gst_object_unref (video_mixer->shader);
+ g_clear_object (&video_mixer->shader);
/* need reconfigure output geometry */
video_mixer->output_geo_change = TRUE;
- frag_str =
- g_strdup_printf ("%s%s",
- gst_gl_shader_string_get_highest_precision (GST_GL_BASE_MIXER
- (mixer)->context, GST_GLSL_VERSION_NONE,
- GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY),
- video_mixer_f_src);
-
- ret = gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context,
- gst_gl_shader_string_vertex_mat4_vertex_transform,
- frag_str, &video_mixer->shader);
- g_free (frag_str);
- return ret;
+ return TRUE;
}
static void
@@ -1234,6 +1220,19 @@ _video_mixer_process_gl (GstGLContext * context, GstGLVideoMixer * video_mixer)
{
GstGLMixer *mixer = GST_GL_MIXER (video_mixer);
+ if (!video_mixer->shader) {
+ gchar *frag_str = g_strdup_printf ("%s%s",
+ gst_gl_shader_string_get_highest_precision (GST_GL_BASE_MIXER
+ (mixer)->context, GST_GLSL_VERSION_NONE,
+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY),
+ video_mixer_f_src);
+
+ gst_gl_context_gen_shader (GST_GL_BASE_MIXER (mixer)->context,
+ gst_gl_shader_string_vertex_mat4_vertex_transform,
+ frag_str, &video_mixer->shader);
+ g_free (frag_str);
+ }
+
gst_gl_framebuffer_draw_to_texture (mixer->fbo, video_mixer->out_tex,
gst_gl_video_mixer_callback, video_mixer);
}