From 0d6c956cfbdc206d460038fcab55f34f8d90bb8d Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Sun, 7 Sep 2008 00:45:34 +0200 Subject: [PATCH] [212/906] add a glbumper (bump mapping filter through GLSL) that exposes how to use both vertex and fragment shaders --- gst-libs/gst/gl/gstgldisplay.c | 39 ++++++++++++++++++++++++++++++++------- gst-libs/gst/gl/gstgldisplay.h | 8 ++++++-- gst-libs/gst/gl/gstglshader.c | 12 ++++++++++++ gst-libs/gst/gl/gstglshader.h | 2 ++ 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c index 3d81f28..9f28844 100644 --- a/gst-libs/gst/gl/gstgldisplay.c +++ b/gst-libs/gst/gl/gstgldisplay.c @@ -216,7 +216,8 @@ gst_gl_display_init (GstGLDisplay *display, GstGLDisplayClass *klass) display->ouput_texture_height = 0; //action gen and del shader - display->gen_text_shader = NULL; + display->gen_shader_fragment_source = NULL; + display->gen_shader_vertex_source = NULL; display->gen_shader = NULL; display->del_shader = NULL; @@ -1566,7 +1567,7 @@ gst_gl_display_thread_use_fbo (GstGLDisplay *display) glDrawBuffer(GL_NONE); - glMatrixMode(GL_PROJECTION); + glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); @@ -1606,11 +1607,28 @@ gst_gl_display_thread_gen_shader (GstGLDisplay* display) glutSetWindow (display->glutWinId); if (GLEW_ARB_fragment_shader) { + gboolean isAlive = TRUE; + GError *error = NULL; + display->gen_shader = gst_gl_shader_new (); - if (!gst_gl_shader_compile_and_check (display->gen_shader, - display->gen_text_shader, - GST_GL_SHADER_FRAGMENT_SOURCE)) + if (display->gen_shader_vertex_source) + gst_gl_shader_set_vertex_source(display->gen_shader, display->gen_shader_vertex_source); + + if (display->gen_shader_fragment_source) + gst_gl_shader_set_fragment_source(display->gen_shader, display->gen_shader_fragment_source); + + gst_gl_shader_compile (display->gen_shader, &error); + if (error) + { + g_warning ("%s", error->message); + g_error_free (error); + error = NULL; + gst_gl_shader_use (NULL); + isAlive = FALSE; + } + + if (!isAlive) { display->isAlive = FALSE; g_object_unref (G_OBJECT (display->gen_shader)); @@ -2254,13 +2272,20 @@ gst_gl_display_del_fbo (GstGLDisplay* display, GLuint fbo, /* Called by glfilter */ void -gst_gl_display_gen_shader (GstGLDisplay* display, const gchar* textShader, GstGLShader** shader) +gst_gl_display_gen_shader (GstGLDisplay* display, + const gchar* shader_vertex_source, + const gchar* shader_fragment_source, + GstGLShader** shader) { gst_gl_display_lock (display); - display->gen_text_shader = textShader; + display->gen_shader_vertex_source = shader_vertex_source; + display->gen_shader_fragment_source = shader_fragment_source; gst_gl_display_post_message (GST_GL_DISPLAY_ACTION_GEN_SHADER, display); g_cond_wait (display->cond_gen_shader, display->mutex); *shader = display->gen_shader; + display->gen_shader = NULL; + display->gen_shader_vertex_source = NULL; + display->gen_shader_fragment_source = NULL; gst_gl_display_unlock (display); } diff --git a/gst-libs/gst/gl/gstgldisplay.h b/gst-libs/gst/gl/gstgldisplay.h index 333c1ea..10c91be 100644 --- a/gst-libs/gst/gl/gstgldisplay.h +++ b/gst-libs/gst/gl/gstgldisplay.h @@ -222,7 +222,8 @@ struct _GstGLDisplay { GLuint ouput_texture_height; //action gen and del shader - const gchar* gen_text_shader; + const gchar* gen_shader_fragment_source; + const gchar* gen_shader_vertex_source; GstGLShader* gen_shader; GstGLShader* del_shader; @@ -300,7 +301,10 @@ gboolean gst_gl_display_use_fbo (GstGLDisplay* display, gint texture_fbo_width, void gst_gl_display_del_fbo (GstGLDisplay* display, GLuint fbo, GLuint depth_buffer); -void gst_gl_display_gen_shader (GstGLDisplay* display, const gchar* textShader, GstGLShader** shader); +void gst_gl_display_gen_shader (GstGLDisplay* display, + const gchar* shader_vertex_source, + const gchar* shader_fragment_source, + GstGLShader** shader); void gst_gl_display_del_shader (GstGLDisplay* display, GstGLShader* shader); void gst_gl_display_set_window_id (GstGLDisplay* display, gulong winId); diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c index e391758..fee9dc7 100644 --- a/gst-libs/gst/gl/gstglshader.c +++ b/gst-libs/gst/gl/gstglshader.c @@ -490,6 +490,18 @@ gst_gl_shader_set_uniform_1i (GstGLShader * shader, const gchar * name, glUniform1iARB (location, value); } +GLint +gst_gl_shader_get_attribute_location (GstGLShader * shader, const gchar *name) +{ + GstGLShaderPrivate *priv; + + priv = shader->priv; + + g_return_val_if_fail (priv->program_handle != 0, 0); + + return glGetUniformLocationARB (priv->program_handle, name); +} + GQuark gst_gl_shader_error_quark (void) { diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h index 53a71dd..3506997 100644 --- a/gst-libs/gst/gl/gstglshader.h +++ b/gst-libs/gst/gl/gstglshader.h @@ -89,6 +89,8 @@ void gst_gl_shader_set_uniform_1i (GstGLShader *shader, const gchar *name, gint void gst_gl_shader_set_uniform_1f (GstGLShader *shader, const gchar *name, gfloat value); void gst_gl_shader_set_uniform_1fv (GstGLShader *shader, const gchar *name, guint count, gfloat * value); +GLint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name); + G_END_DECLS #endif /* __GST_GL_SHADER_H__ */ -- 2.7.4