summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2016-03-10 00:27:53 +1100
committerMatthew Waters <matthew@centricular.com>2016-03-10 22:53:01 +1100
commit92b9b57d3ea0029358b1b76944a3afc7589043b4 (patch)
tree21fbf1fe4205d242c324d109085b44b497b595b9
parent59da66f969857a3b6a67a9e1b5198d2263aedffc (diff)
downloadgstreamer-plugins-bad-92b9b57d3ea0029358b1b76944a3afc7589043b4.tar.gz
glfilter: retrieve the shader attributes from the GL thread
Otherwise we will receive bogus values https://bugzilla.gnome.org/show_bug.cgi?id=763365
-rw-r--r--gst-libs/gst/gl/gstglfilter.c43
-rw-r--r--gst-libs/gst/gl/gstglfilter.h1
2 files changed, 26 insertions, 18 deletions
diff --git a/gst-libs/gst/gl/gstglfilter.c b/gst-libs/gst/gl/gstglfilter.c
index 2c518e314..1e18e410e 100644
--- a/gst-libs/gst/gl/gstglfilter.c
+++ b/gst-libs/gst/gl/gstglfilter.c
@@ -1032,6 +1032,28 @@ gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize,
}
static void
+_get_attributes (GstGLFilter * filter)
+{
+ if (!filter->default_shader)
+ return;
+
+ if (filter->valid_attributes)
+ return;
+
+ if (filter->draw_attr_position_loc == -1)
+ filter->draw_attr_position_loc =
+ gst_gl_shader_get_attribute_location (filter->default_shader,
+ "a_position");
+
+ if (filter->draw_attr_texture_loc == -1)
+ filter->draw_attr_texture_loc =
+ gst_gl_shader_get_attribute_location (filter->default_shader,
+ "a_texcoord");
+
+ filter->valid_attributes = TRUE;
+}
+
+static void
_draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
{
GstGLFilter *filter = GST_GL_FILTER (stuff);
@@ -1045,6 +1067,7 @@ _draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
}
#endif
+ _get_attributes (filter);
gst_gl_shader_use (filter->default_shader);
gl->ActiveTexture (GL_TEXTURE1);
@@ -1057,23 +1080,6 @@ _draw_with_shader_cb (gint width, gint height, guint texture, gpointer stuff)
gst_gl_filter_draw_texture (filter, texture, width, height);
}
-static void
-_get_attributes (GstGLFilter * filter)
-{
- if (!filter->default_shader)
- return;
-
- if (filter->draw_attr_position_loc == -1)
- filter->draw_attr_position_loc =
- gst_gl_shader_get_attribute_location (filter->default_shader,
- "a_position");
-
- if (filter->draw_attr_texture_loc == -1)
- filter->draw_attr_texture_loc =
- gst_gl_shader_get_attribute_location (filter->default_shader,
- "a_texcoord");
-}
-
/**
* gst_gl_filter_render_to_target_with_shader:
* @filter: a #GstGLFilter
@@ -1094,8 +1100,9 @@ void
gst_gl_filter_render_to_target_with_shader (GstGLFilter * filter,
gboolean resize, GLuint input, GLuint target, GstGLShader * shader)
{
+ if (filter->default_shader != shader)
+ filter->valid_attributes = FALSE;
filter->default_shader = shader;
- _get_attributes (filter);
gst_gl_filter_render_to_target (filter, resize, input, target,
_draw_with_shader_cb, filter);
diff --git a/gst-libs/gst/gl/gstglfilter.h b/gst-libs/gst/gl/gstglfilter.h
index 94ab33394..a818bab24 100644
--- a/gst-libs/gst/gl/gstglfilter.h
+++ b/gst-libs/gst/gl/gstglfilter.h
@@ -71,6 +71,7 @@ struct _GstGLFilter
GLuint out_tex_id;
GstGLShader *default_shader;
+ gboolean valid_attributes;
GLuint vao;
GLuint vbo_indices;