summaryrefslogtreecommitdiff
path: root/gst/gl/effects/gstgleffectmirror.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/gl/effects/gstgleffectmirror.c')
-rw-r--r--gst/gl/effects/gstgleffectmirror.c82
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);