summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Isorce <julien.isorce@collabora.co.uk>2014-04-30 15:20:23 +0100
committerJulien Isorce <julien.isorce@collabora.co.uk>2014-04-30 15:35:49 +0100
commit64e5b5a203bea47f329f36e6fe6cc43b87a1326f (patch)
treed3c94423924abf1457dbc96eda0a67d24dfad0a7
parentfc38c22f1b394ee7a29680d618505aac978bf849 (diff)
downloadgstreamer-plugins-bad-64e5b5a203bea47f329f36e6fe6cc43b87a1326f.tar.gz
gl: add convenient functions to setup default vertex and fragment shaders
Most of our 2D filters use the same simple vertex shader. Also define the default fragment shader as the identity. Avoid duplicating the same vertex and fragment shader text.
-rw-r--r--gst-libs/gst/gl/gstglshader.c90
-rw-r--r--gst-libs/gst/gl/gstglshader.h7
2 files changed, 97 insertions, 0 deletions
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c
index e07b64501..3482a0446 100644
--- a/gst-libs/gst/gl/gstglshader.c
+++ b/gst-libs/gst/gl/gstglshader.c
@@ -1,6 +1,7 @@
/*
* GStreamer
* Copyright (C) 2008 Filippo Argiolas <filippo.argiolas@gmail.com>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@collabora.co.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -25,6 +26,29 @@
#include "gl.h"
#include "gstglshader.h"
+#if GST_GL_HAVE_GLES2
+/* *INDENT-OFF* */
+static const gchar *simple_vertex_shader_str_gles2 =
+ "attribute vec4 a_position; \n"
+ "attribute vec2 a_texCoord; \n"
+ "varying vec2 v_texCoord; \n"
+ "void main() \n"
+ "{ \n"
+ " gl_Position = a_position; \n"
+ " v_texCoord = a_texCoord; \n"
+ "} \n";
+
+static const gchar *simple_fragment_shader_str_gles2 =
+ "precision mediump float; \n"
+ "varying vec2 v_texCoord; \n"
+ "uniform sampler2D tex; \n"
+ "void main() \n"
+ "{ \n"
+ " gl_FragColor = texture2D( tex, v_texCoord ); \n"
+ "} \n";
+/* *INDENT-ON* */
+#endif
+
#ifndef GL_COMPILE_STATUS
#define GL_COMPILE_STATUS 0x8B81
#endif
@@ -575,6 +599,72 @@ gst_gl_shader_compile_and_check (GstGLShader * shader,
return TRUE;
}
+gboolean
+gst_gl_shader_compile_all_with_attribs_and_check (GstGLShader * shader,
+ const gchar * v_src, const gchar * f_src, const gint n_attribs,
+ const gchar * attrib_names[], GLint attrib_locs[])
+{
+ gint i = 0;
+ GError *error = NULL;
+
+ gst_gl_shader_set_vertex_source (shader, v_src);
+ gst_gl_shader_set_fragment_source (shader, f_src);
+
+ gst_gl_shader_compile (shader, &error);
+ if (error) {
+ gst_gl_context_set_error (shader->context, "%s", error->message);
+ g_error_free (error);
+ gst_gl_context_clear_shader (shader->context);
+
+ return FALSE;
+ }
+
+ for (i = 0; i < n_attribs; i++)
+ attrib_locs[i] =
+ gst_gl_shader_get_attribute_location (shader, attrib_names[i]);
+
+ return TRUE;
+}
+
+#if GST_GL_HAVE_GLES2
+gboolean
+gst_gl_shader_compile_with_default_f_and_check (GstGLShader * shader,
+ const gchar * v_src, const gint n_attribs, const gchar * attrib_names[],
+ GLint attrib_locs[])
+{
+ return gst_gl_shader_compile_all_with_attribs_and_check (shader, v_src,
+ simple_fragment_shader_str_gles2, n_attribs, attrib_names, attrib_locs);
+}
+
+gboolean
+gst_gl_shader_compile_with_default_v_and_check (GstGLShader * shader,
+ const gchar * f_src, GLint * pos_loc, GLint * tex_loc)
+{
+ const gchar *attrib_names[2] = { "a_position", "a_texCoord" };
+ GLint attrib_locs[2] = { 0 };
+ gboolean ret = TRUE;
+
+ ret =
+ gst_gl_shader_compile_all_with_attribs_and_check (shader,
+ simple_vertex_shader_str_gles2, f_src, 2, attrib_names, attrib_locs);
+
+ if (ret) {
+ *pos_loc = attrib_locs[0];
+ *tex_loc = attrib_locs[1];
+ }
+
+ return ret;
+}
+
+gboolean
+gst_gl_shader_compile_with_default_vf_and_check (GstGLShader * shader,
+ GLint * pos_loc, GLint * tex_loc)
+{
+ return gst_gl_shader_compile_with_default_v_and_check (shader,
+ simple_fragment_shader_str_gles2, pos_loc, tex_loc);
+}
+#endif
+
void
gst_gl_shader_set_uniform_1f (GstGLShader * shader, const gchar * name,
gfloat value)
diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h
index d63ceaac3..73cc8ebfd 100644
--- a/gst-libs/gst/gl/gstglshader.h
+++ b/gst-libs/gst/gl/gstglshader.h
@@ -1,6 +1,7 @@
/*
* GStreamer
* Copyright (C) 2008 Filippo Argiolas <filippo.argiolas@gmail.com>
+ * Copyright (C) 2014 Julien Isorce <julien.isorce@collabora.co.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -75,6 +76,12 @@ void gst_gl_shader_set_active (GstGLShader *shader, gboolean active);
gboolean gst_gl_shader_is_compiled (GstGLShader *shader);
gboolean gst_gl_shader_compile (GstGLShader *shader, GError **error);
gboolean gst_gl_shader_compile_and_check (GstGLShader *shader, const gchar *source, GstGLShaderSourceType type);
+gboolean gst_gl_shader_compile_all_with_attribs_and_check (GstGLShader *shader, const gchar *v_src, const gchar *f_src, const gint n_attribs, const gchar *attrib_names[], GLint attrib_locs[]);
+#if GST_GL_HAVE_GLES2
+gboolean gst_gl_shader_compile_with_default_f_and_check (GstGLShader *shader, const gchar *v_src, const gint n_attribs, const gchar *attrib_names[], GLint attrib_locs[]);
+gboolean gst_gl_shader_compile_with_default_v_and_check (GstGLShader *shader, const gchar *f_src, GLint *pos_loc, GLint *tex_loc);
+gboolean gst_gl_shader_compile_with_default_vf_and_check (GstGLShader *shader, GLint *pos_loc, GLint *tex_loc);
+#endif
void gst_gl_shader_release (GstGLShader *shader);
void gst_gl_shader_use (GstGLShader *shader);