diff options
Diffstat (limited to 'gst/gl/effects/gstgleffectmirror.c')
-rw-r--r-- | gst/gl/effects/gstgleffectmirror.c | 82 |
1 files changed, 48 insertions, 34 deletions
diff --git a/gst/gl/effects/gstgleffectmirror.c b/gst/gl/effects/gstgleffectmirror.c index 7acea2ad2..0f02ee5a8 100644 --- a/gst/gl/effects/gstgleffectmirror.c +++ b/gst/gl/effects/gstgleffectmirror.c @@ -20,57 +20,69 @@ #include <gstgleffects.h> +#define USING_OPENGL(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL) +#define USING_OPENGL3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_OPENGL3) +#define USING_GLES(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES) +#define USING_GLES2(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES2) +#define USING_GLES3(display) (gst_gl_display_get_gl_api_unlocked (display) & GST_GL_API_GLES3) + static void gst_gl_effects_mirror_callback (gint width, gint height, guint texture, gpointer data) { GstGLEffects *effects = GST_GL_EFFECTS (data); - + GstGLFilter *filter = GST_GL_FILTER (effects); GstGLShader *shader; shader = g_hash_table_lookup (effects->shaderstable, "mirror0"); if (!shader) { - shader = gst_gl_shader_new (); + shader = gst_gl_shader_new (filter->display); g_hash_table_insert (effects->shaderstable, "mirror0", shader); -#ifdef OPENGL_ES2 - if (shader) { - GError *error = NULL; - gst_gl_shader_set_vertex_source (shader, vertex_shader_source); - gst_gl_shader_set_fragment_source (shader, mirror_fragment_source); +#if HAVE_GLES2 + if (USING_GLES2 (filter->display)) { + if (shader) { + GError *error = NULL; + gst_gl_shader_set_vertex_source (shader, vertex_shader_source); + gst_gl_shader_set_fragment_source (shader, + mirror_fragment_source_gles2); - gst_gl_shader_compile (shader, &error); - if (error) { + gst_gl_shader_compile (shader, &error); + if (error) { + gst_gl_display_set_error (GST_GL_FILTER (effects)->display, + "Failed to initialize mirror shader, %s", error->message); + g_error_free (error); + error = NULL; + gst_gl_shader_use (NULL); + GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, + GST_GL_DISPLAY_ERR_MSG (GST_GL_FILTER (effects)->display), + (NULL)); + } else { + effects->draw_attr_position_loc = + gst_gl_shader_get_attribute_location (shader, "a_position"); + effects->draw_attr_texture_loc = + gst_gl_shader_get_attribute_location (shader, "a_texCoord"); + } + } + } +#endif +#if HAVE_OPENGL + if (USING_OPENGL (filter->display)) { + if (!gst_gl_shader_compile_and_check (shader, + mirror_fragment_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) { gst_gl_display_set_error (GST_GL_FILTER (effects)->display, - "Failed to initialize mirror shader, %s", error->message); - g_error_free (error); - error = NULL; - gst_gl_shader_use (NULL); + "Failed to initialize mirror shader"); GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, GST_GL_DISPLAY_ERR_MSG (GST_GL_FILTER (effects)->display), (NULL)); - } else { - effects->draw_attr_position_loc = - gst_gl_shader_get_attribute_location (shader, "a_position"); - effects->draw_attr_texture_loc = - gst_gl_shader_get_attribute_location (shader, "a_texCoord"); + return; } + + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); } #endif } -#ifndef OPENGL_ES2 - if (!gst_gl_shader_compile_and_check (shader, - mirror_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) { - gst_gl_display_set_error (GST_GL_FILTER (effects)->display, - "Failed to initialize mirror shader"); - GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, - GST_GL_DISPLAY_ERR_MSG (GST_GL_FILTER (effects)->display), (NULL)); - return; - } - - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); -#endif gst_gl_shader_use (shader); @@ -80,9 +92,11 @@ gst_gl_effects_mirror_callback (gint width, gint height, guint texture, gst_gl_shader_set_uniform_1i (shader, "tex", 0); -#ifndef OPENGL_ES2 - gst_gl_shader_set_uniform_1f (shader, "width", (gfloat) width / 2.0f); - gst_gl_shader_set_uniform_1f (shader, "height", (gfloat) height / 2.0f); +#if HAVE_OPENGL + if (USING_OPENGL (filter->display)) { + gst_gl_shader_set_uniform_1f (shader, "width", (gfloat) width / 2.0f); + gst_gl_shader_set_uniform_1f (shader, "height", (gfloat) height / 2.0f); + } #endif gst_gl_effects_draw_texture (effects, texture, width, height); |