glfilter: retrieve the shader attributes from the GL thread
authorMatthew Waters <matthew@centricular.com>
Wed, 9 Mar 2016 13:27:53 +0000 (00:27 +1100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:17 +0000 (19:32 +0000)
Otherwise we will receive bogus values

https://bugzilla.gnome.org/show_bug.cgi?id=763365

gst-libs/gst/gl/gstglfilter.c
gst-libs/gst/gl/gstglfilter.h

index 2c518e3143485092037003a1e31ac645f5b0c89f..1e18e410eeeec0ad4763640a0e9f6d27cfb1de4f 100644 (file)
@@ -1031,6 +1031,28 @@ gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize,
       filter->fbo, filter->depthbuffer, target, _glcb2, &cb);
 }
 
+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)
 {
@@ -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);
index 94ab33394599a3b931f366be54f1e191724bb371..a818bab24fcc9f18ade580ff89edf2035fb6ba75 100644 (file)
@@ -71,6 +71,7 @@ struct _GstGLFilter
   GLuint             out_tex_id;
 
   GstGLShader       *default_shader;
+  gboolean           valid_attributes;
 
   GLuint             vao;
   GLuint             vbo_indices;