mirror of
https://git.yoctoproject.org/poky
synced 2026-04-16 15:32:13 +02:00
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>
This commit is contained in:
committed by
Richard Purdie
parent
e1eca35850
commit
365fdce1ed
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user