| From 38221080181229d520522a20bcb1663ca19f7aff Mon Sep 17 00:00:00 2001 |
| From: Matthew Waters <matthew@centricular.com> |
| Date: Thu, 31 Mar 2016 19:25:32 +1100 |
| Subject: [PATCH 2/3] glshader: add glBindFragDataLocation |
| |
| There are some cases where it's needed for binding in/out variables in shaders. |
| e.g. glsl 150 (gl 3.2) doesn't support the 'layout (location = ?)' specifiers in |
| the shader source so we have to bind them ourselves. |
| |
| Upstream-Status: Backport [1.9.1] |
| --- |
| gst-libs/gst/gl/glprototypes/shaders.h | 10 ++++++++++ |
| gst-libs/gst/gl/gstglshader.c | 20 ++++++++++++++++++++ |
| gst-libs/gst/gl/gstglshader.h | 1 + |
| 3 files changed, 31 insertions(+) |
| |
| diff --git a/gst-libs/gst/gl/glprototypes/shaders.h b/gst-libs/gst/gl/glprototypes/shaders.h |
| index 817e479..6d828db 100644 |
| --- a/gst-libs/gst/gl/glprototypes/shaders.h |
| +++ b/gst-libs/gst/gl/glprototypes/shaders.h |
| @@ -362,3 +362,13 @@ GST_GL_EXT_FUNCTION (void, UniformMatrix3x4fv, |
| GST_GL_EXT_FUNCTION (void, UniformMatrix4x3fv, |
| (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) |
| GST_GL_EXT_END () |
| + |
| +GST_GL_EXT_BEGIN (bind_frag_data, |
| + GST_GL_API_OPENGL | GST_GL_API_OPENGL3, |
| + 3, 0, |
| + 255, 255, |
| + "\0", |
| + "\0") |
| +GST_GL_EXT_FUNCTION (void, BindFragDataLocation, |
| + (GLuint program, GLuint index, const GLchar * name)) |
| +GST_GL_EXT_END () |
| diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c |
| index 9d96784..9f09236 100644 |
| --- a/gst-libs/gst/gl/gstglshader.c |
| +++ b/gst-libs/gst/gl/gstglshader.c |
| @@ -1306,3 +1306,23 @@ gst_gl_shader_bind_attribute_location (GstGLShader * shader, GLuint index, |
| |
| gl->BindAttribLocation (priv->program_handle, index, name); |
| } |
| + |
| +void |
| +gst_gl_shader_bind_frag_data_location (GstGLShader * shader, |
| + guint index, const gchar * name) |
| +{ |
| + GstGLShaderPrivate *priv; |
| + GstGLFuncs *gl; |
| + |
| + g_return_if_fail (shader != NULL); |
| + if (!_ensure_program (shader)) |
| + g_return_if_fail (shader->priv->program_handle); |
| + priv = shader->priv; |
| + gl = shader->context->gl_vtable; |
| + g_return_if_fail (gl->BindFragDataLocation); |
| + |
| + GST_TRACE_OBJECT (shader, "binding program %i frag data \'%s\' location %i", |
| + (int) priv->program_handle, name, index); |
| + |
| + gl->BindFragDataLocation (priv->program_handle, index, name); |
| +} |
| diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h |
| index 21410e2..2200b89 100644 |
| --- a/gst-libs/gst/gl/gstglshader.h |
| +++ b/gst-libs/gst/gl/gstglshader.h |
| @@ -104,6 +104,7 @@ void gst_gl_shader_set_uniform_matrix_4x3fv (GstGLShader *shader, const gchar *n |
| |
| gint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name); |
| void gst_gl_shader_bind_attribute_location (GstGLShader * shader, guint index, const gchar * name); |
| +void gst_gl_shader_bind_frag_data_location (GstGLShader * shader, guint index, const gchar * name); |
| |
| G_END_DECLS |
| |
| -- |
| 1.9.1 |
| |