[gnome-continuous-yocto/gnomeostree-3.28-rocko: 1375/8267] gstreamer1.0-plugins-bad: Implement multiple render targets for GLES3



commit 365fdce1edf9cf6886fc0272da5cc5a08856004e
Author: Yuqing Zhu <carol zhu nxp com>
Date:   Mon Jul 4 13:46:29 2016 +0800

    gstreamer1.0-plugins-bad: Implement multiple render targets for GLES3
    
    There are numerous slight differences required between Desktop GL and GLES3 for
    multiple render targets. Need to realize it.
    
    (From OE-Core rev: 11618110c2e17d6018ad5ec71ec0f357e900034d)
    
    Signed-off-by: Yuqing Zhu <carol zhu nxp com>
    Signed-off-by: Ross Burton <ross burton intel com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 ...ert-implement-multiple-render-targets-for.patch |  244 ++++++++++++++++++++
 .../gstreamer/gstreamer1.0-plugins-bad_1.8.2.bb    |    1 +
 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 0000000..31d8e05
--- /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 7cd14c7..0df1b8e 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"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]