1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
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
|