summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmeta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch244
-rw-r--r--meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb1
2 files changed, 245 insertions, 0 deletions
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch
new file mode 100755
index 0000000000..31d8e052fd
--- /dev/null
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch
@@ -0,0 +1,244 @@
+From 127e517568490fc147211d8b2fb4da01cecbbeb5 Mon Sep 17 00:00:00 2001
+From: Matthew Waters <matthew@centricular.com>
+Date: Thu, 31 Mar 2016 19:50:28 +1100
+Subject: [PATCH 5/6] glcolorconvert: implement multiple render targets for
+ GLES3
+
+There are numerous slight differences required between Desktop GL and GLES3 for
+multiple render targets.
+
+1. gl_FragData doesn't exist at all and one is required to use
+ 'layout (location = ?) out ...' instead.
+2. gl_FragColor doesn't exist, same as 1
+3. texture2D() has been deprecated
+
+Fortunately most of these have been taken care of with GL3 and the shader
+mangling already exists so just expand the conditions they are used in. The
+gl_FragData issue requires a new mangle pass though. We also use this new
+pass on desktop GL for consistency.
+
+Upstream-Status: Backport [1.9.1]
+
+---
+ gst-libs/gst/gl/gstglcolorconvert.c | 125 ++++++++++++++++++++++++++++--------
+ 1 file changed, 99 insertions(+), 26 deletions(-)
+
+diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c
+index 490ec54..f478faa 100644
+--- a/gst-libs/gst/gl/gstglcolorconvert.c
++++ b/gst-libs/gst/gl/gstglcolorconvert.c
+@@ -1802,10 +1802,11 @@ _mangle_sampler_type (const gchar * str, GstGLTextureTarget from,
+
+ static gchar *
+ _mangle_varying_attribute (const gchar * str, guint shader_type,
+- GstGLAPI gl_api)
++ GstGLAPI gl_api, guint gl_major, guint gl_minor)
+ {
+- if (gl_api & GST_GL_API_OPENGL3) {
+- if (shader_type == GL_VERTEX_SHADER) {
++ if (shader_type == GL_VERTEX_SHADER) {
++ if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2
++ && gl_major >= 3)) {
+ gchar *tmp, *tmp2;
+ GRegex *regex;
+
+@@ -1821,7 +1822,10 @@ _mangle_varying_attribute (const gchar * str, guint shader_type,
+
+ g_free (tmp);
+ return tmp2;
+- } else if (shader_type == GL_FRAGMENT_SHADER) {
++ }
++ } else if (shader_type == GL_FRAGMENT_SHADER) {
++ if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2
++ && gl_major > 3)) {
+ gchar *tmp;
+ GRegex *regex;
+
+@@ -1837,28 +1841,48 @@ _mangle_varying_attribute (const gchar * str, guint shader_type,
+ }
+
+ static gchar *
+-_mangle_frag_color (const gchar * str)
++_mangle_frag_color_data (const gchar * str)
+ {
+ GRegex *regex;
+- gchar *ret;
++ gchar *ret, *tmp;
+
+ regex = g_regex_new ("gl_FragColor", 0, 0, NULL);
+ ret = g_regex_replace_literal (regex, str, -1, 0, "fragColor", 0, NULL);
+ g_regex_unref (regex);
+
++ tmp = ret;
++ /* search and replace 'gl_FragData[NUM]' into fragColor_NUM */
++ regex = g_regex_new ("gl_FragData\\[(\\d+)\\]", 0, 0, NULL);
++ ret = g_regex_replace (regex, tmp, -1, 0, "fragColor_\\1", 0, NULL);
++ g_regex_unref (regex);
++ g_free (tmp);
++
+ return ret;
+ }
+
+ static void
+-_mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version,
+- GstGLSLProfile * profile)
++_mangle_version_profile_from_gl_api (GstGLAPI gl_api, gint gl_major,
++ gint gl_minor, GstGLSLVersion * version, GstGLSLProfile * profile)
+ {
++ *version = GST_GLSL_VERSION_NONE;
++ *profile = GST_GLSL_PROFILE_NONE;
++
+ if (gl_api & GST_GL_API_OPENGL3) {
+- *version = GST_GLSL_VERSION_150;
+- *profile = GST_GLSL_PROFILE_NONE;
++ if (gl_major > 3 || gl_minor >= 3) {
++ *version = GST_GLSL_VERSION_330;
++ *profile = GST_GLSL_PROFILE_CORE;
++ } else {
++ *version = GST_GLSL_VERSION_150;
++ *profile = GST_GLSL_PROFILE_NONE;
++ }
+ } else if (gl_api & GST_GL_API_GLES2) {
+- *version = GST_GLSL_VERSION_100;
+- *profile = GST_GLSL_PROFILE_ES;
++ if (gl_major >= 3) {
++ *version = GST_GLSL_VERSION_300;
++ *profile = GST_GLSL_PROFILE_ES;
++ } else if (gl_major >= 2) {
++ *version = GST_GLSL_VERSION_100;
++ *profile = GST_GLSL_PROFILE_ES;
++ }
+ } else if (gl_api & GST_GL_API_OPENGL) {
+ *version = GST_GLSL_VERSION_110;
+ *profile = GST_GLSL_PROFILE_COMPATIBILITY;
+@@ -1867,22 +1891,28 @@ _mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version,
+
+ static gchar *
+ _mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from,
+- GstGLTextureTarget to, GstGLAPI gl_api, GstGLSLVersion * version,
+- GstGLSLProfile * profile)
++ GstGLTextureTarget to, GstGLAPI gl_api, gint gl_major, gint gl_minor,
++ GstGLSLVersion * version, GstGLSLProfile * profile)
+ {
+ gchar *tmp, *tmp2;
+
++ _mangle_version_profile_from_gl_api (gl_api, gl_major, gl_minor, version,
++ profile);
+ tmp = _mangle_texture_access (str, from, to, gl_api);
+ tmp2 = _mangle_sampler_type (tmp, from, to);
+ g_free (tmp);
+- tmp = _mangle_varying_attribute (tmp2, shader_type, gl_api);
++ tmp =
++ _mangle_varying_attribute (tmp2, shader_type, gl_api, gl_major, gl_minor);
+ g_free (tmp2);
+- if (shader_type == GL_FRAGMENT_SHADER && gl_api & GST_GL_API_OPENGL3) {
+- tmp2 = _mangle_frag_color (tmp);
+- g_free (tmp);
+- tmp = tmp2;
++ if (shader_type == GL_FRAGMENT_SHADER) {
++ if ((*profile == GST_GLSL_PROFILE_ES && *version >= GST_GLSL_VERSION_300)
++ || (*profile == GST_GLSL_PROFILE_CORE
++ && *version >= GST_GLSL_VERSION_150)) {
++ tmp2 = _mangle_frag_color_data (tmp);
++ g_free (tmp);
++ tmp = tmp2;
++ }
+ }
+- _mangle_version_profile_from_gl_api (gl_api, version, profile);
+ return tmp;
+ }
+
+@@ -1899,15 +1929,18 @@ _create_shader (GstGLColorConvert * convert)
+ const gchar *strings[2];
+ GError *error = NULL;
+ GstGLAPI gl_api;
++ gint gl_major, gl_minor;
+ int i;
+
+ gl_api = gst_gl_context_get_gl_api (convert->context);
++ gst_gl_context_get_gl_version (convert->context, &gl_major, &gl_minor);
+
+ ret = gst_gl_shader_new (convert->context);
+
+ tmp =
+ _mangle_shader (text_vertex_shader, GL_VERTEX_SHADER, info->templ->target,
+- convert->priv->from_texture_target, gl_api, &version, &profile);
++ convert->priv->from_texture_target, gl_api, gl_major, gl_minor, &version,
++ &profile);
+
+ tmp1 = gst_glsl_version_profile_to_string (version, profile);
+ version_str = g_strdup_printf ("#version %s\n", tmp1);
+@@ -1945,9 +1978,37 @@ _create_shader (GstGLColorConvert * convert)
+ if (info->templ->uniforms)
+ g_string_append (str, info->templ->uniforms);
+
+- if (gl_api & GST_GL_API_OPENGL3) {
+- g_string_append_c (str, '\n');
+- g_string_append (str, "out vec4 fragColor;\n");
++ g_string_append_c (str, '\n');
++
++ /* GL 3.3+ and GL ES 3.x */
++ if ((profile == GST_GLSL_PROFILE_CORE && version >= GST_GLSL_VERSION_330)
++ || (profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)) {
++ if (info->out_n_textures > 1) {
++ gint i;
++
++ for (i = 0; i < info->out_n_textures; i++) {
++ g_string_append_printf (str,
++ "layout(location = %d) out vec4 fragColor_%d;\n", i, i);
++ }
++ } else {
++ g_string_append (str, "layout (location = 0) out vec4 fragColor;\n");
++ }
++ } else if (profile == GST_GLSL_PROFILE_CORE
++ && version >= GST_GLSL_VERSION_150) {
++ /* no layout specifiers, use glBindFragDataLocation instead */
++ if (info->out_n_textures > 1) {
++ gint i;
++
++ for (i = 0; i < info->out_n_textures; i++) {
++ gchar *var_name = g_strdup_printf ("fragColor_%d", i);
++ g_string_append_printf (str, "out vec4 %s;\n", var_name);
++ gst_gl_shader_bind_frag_data_location (ret, i, var_name);
++ g_free (var_name);
++ }
++ } else {
++ g_string_append (str, "out vec4 fragColor;\n");
++ gst_gl_shader_bind_frag_data_location (ret, 0, "fragColor");
++ }
+ }
+
+ for (i = 0; i < MAX_FUNCTIONS; i++) {
+@@ -1959,7 +2020,19 @@ _create_shader (GstGLColorConvert * convert)
+ g_string_append_c (str, '\n');
+ }
+
+- g_string_append (str, "\nvarying vec2 v_texcoord;\nvoid main (void) {\n");
++ {
++ const gchar *varying = NULL;
++
++ if ((profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)
++ || (profile == GST_GLSL_PROFILE_CORE
++ && version >= GST_GLSL_VERSION_150)) {
++ varying = "in";
++ } else {
++ varying = "varying";
++ }
++ g_string_append_printf (str, "\n%s vec2 v_texcoord;\nvoid main (void) {\n",
++ varying);
++ }
+ if (info->frag_body) {
+ g_string_append (str, "vec2 texcoord;\n");
+ if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE
+@@ -1975,7 +2048,7 @@ _create_shader (GstGLColorConvert * convert)
+ tmp = g_string_free (str, FALSE);
+ info->frag_prog = _mangle_shader (tmp, GL_FRAGMENT_SHADER,
+ info->templ->target, convert->priv->from_texture_target, gl_api,
+- &version, &profile);
++ gl_major, gl_minor, &version, &profile);
+ g_free (tmp);
+
+ strings[1] = info->frag_prog;
+--
+1.9.1
+
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb
index 7cd14c73be..0df1b8e91b 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb
@@ -13,6 +13,7 @@ SRC_URI = " \
file://ensure-valid-sentinels-for-gst_structure_get-etc.patch \
file://0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch \
file://0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch \
+ file://0003-glcolorconvert-implement-multiple-render-targets-for.patch \
"
SRC_URI[md5sum] = "83abc2e70684e7b195f18ca2992ef6e8"
SRC_URI[sha256sum] = "d7995317530c8773ec088f94d9320909d41da61996b801ebacce9a56af493f97"