From 3ba30d42a4bb29290535acea033293eb7779e8c0 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Mon, 10 Aug 2015 16:38:32 +0200 Subject: [PATCH] gl: use gles2 shaders everywhere This effectively limits a glfilter subclass to be > GL(ES) 2.0. rather than a possible GL 1.4. --- ext/gl/effects/gstgleffectblur.c | 4 +- ext/gl/effects/gstgleffectbulge.c | 2 +- ext/gl/effects/gstgleffectfisheye.c | 2 +- ext/gl/effects/gstgleffectglow.c | 9 +- ext/gl/effects/gstgleffectidentity.c | 38 ++-- ext/gl/effects/gstgleffectlaplacian.c | 2 +- ext/gl/effects/gstgleffectlumatocurve.c | 3 +- ext/gl/effects/gstgleffectmirror.c | 2 +- ext/gl/effects/gstgleffectrgbtocurve.c | 2 +- ext/gl/effects/gstgleffectsin.c | 2 +- ext/gl/effects/gstgleffectsobel.c | 12 +- ext/gl/effects/gstgleffectsquare.c | 2 +- ext/gl/effects/gstgleffectsqueeze.c | 2 +- ext/gl/effects/gstgleffectssources.c | 335 -------------------------------- ext/gl/effects/gstgleffectssources.h | 22 --- ext/gl/effects/gstgleffectstretch.c | 2 +- ext/gl/effects/gstgleffecttunnel.c | 2 +- ext/gl/effects/gstgleffecttwirl.c | 2 +- ext/gl/effects/gstgleffectxray.c | 17 +- ext/gl/gstgldifferencematte.c | 39 ++-- ext/gl/gstgleffects.c | 47 ++--- ext/gl/gstgleffects.h | 2 +- gst-libs/gst/gl/gstglfilter.c | 32 +-- 23 files changed, 85 insertions(+), 497 deletions(-) diff --git a/ext/gl/effects/gstgleffectblur.c b/ext/gl/effects/gstgleffectblur.c index 8042b27..f03af37 100644 --- a/ext/gl/effects/gstgleffectblur.c +++ b/ext/gl/effects/gstgleffectblur.c @@ -48,7 +48,7 @@ gst_gl_effects_blur_callback_hconv (gint width, gint height, guint texture, GstGLEffects *effects = GST_GL_EFFECTS (data); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0", - hconv7_fragment_source_gles2, hconv7_fragment_source_opengl))) { + hconv7_fragment_source_gles2))) { GstGLFilter *filter = GST_GL_FILTER (effects); GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; @@ -82,7 +82,7 @@ gst_gl_effects_blur_callback_vconv (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0", - vconv7_fragment_source_gles2, vconv7_fragment_source_opengl))) { + vconv7_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; #if GST_GL_HAVE_OPENGL diff --git a/ext/gl/effects/gstgleffectbulge.c b/ext/gl/effects/gstgleffectbulge.c index f228867..9856321 100644 --- a/ext/gl/effects/gstgleffectbulge.c +++ b/ext/gl/effects/gstgleffectbulge.c @@ -34,7 +34,7 @@ gst_gl_effects_bulge_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "bulge", - bulge_fragment_source_gles2, bulge_fragment_source_opengl); + bulge_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectfisheye.c b/ext/gl/effects/gstgleffectfisheye.c index 2be8609..285deb3 100644 --- a/ext/gl/effects/gstgleffectfisheye.c +++ b/ext/gl/effects/gstgleffectfisheye.c @@ -34,7 +34,7 @@ gst_gl_effects_fisheye_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "fisheye", - fisheye_fragment_source_gles2, fisheye_fragment_source_opengl); + fisheye_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectglow.c b/ext/gl/effects/gstgleffectglow.c index 97277b8..9fc09e0 100644 --- a/ext/gl/effects/gstgleffectglow.c +++ b/ext/gl/effects/gstgleffectglow.c @@ -37,8 +37,7 @@ gst_gl_effects_glow_step_one (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold", - luma_threshold_fragment_source_gles2, - luma_threshold_fragment_source_opengl); + luma_threshold_fragment_source_gles2); if (!shader) return; @@ -71,7 +70,7 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "hconv7", - hconv7_fragment_source_gles2, hconv7_fragment_source_opengl); + hconv7_fragment_source_gles2); if (!shader) return; @@ -110,7 +109,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "vconv7", - vconv7_fragment_source_gles2, vconv7_fragment_source_opengl); + vconv7_fragment_source_gles2); if (!shader) return; @@ -145,7 +144,7 @@ gst_gl_effects_glow_step_four (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "sum", - sum_fragment_source_gles2, sum_fragment_source_opengl); + sum_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectidentity.c b/ext/gl/effects/gstgleffectidentity.c index 58d0055..9740cc7 100644 --- a/ext/gl/effects/gstgleffectidentity.c +++ b/ext/gl/effects/gstgleffectidentity.c @@ -31,6 +31,7 @@ gst_gl_effects_identity_callback (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; GstGLFuncs *gl = context->gl_vtable; + GstGLShader *shader; #if GST_GL_HAVE_OPENGL if (USING_OPENGL (context)) { @@ -38,32 +39,27 @@ gst_gl_effects_identity_callback (gint width, gint height, guint texture, gl->LoadIdentity (); } #endif - if (USING_GLES2 (context) || USING_OPENGL3 (context)) { - GstGLShader *shader = - g_hash_table_lookup (effects->shaderstable, "identity0"); - if (!shader) { - shader = gst_gl_shader_new (context); - g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", - shader); + shader = g_hash_table_lookup (effects->shaderstable, "identity0"); + if (!shader) { + shader = gst_gl_shader_new (context); + g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader); - if (!gst_gl_shader_compile_with_default_vf_and_check (shader, - &filter->draw_attr_position_loc, - &filter->draw_attr_texture_loc)) { - /* gst gl context error is already set */ - GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, - ("Failed to initialize identity shader, %s", - gst_gl_context_get_error ()), (NULL)); - return; - } + if (!gst_gl_shader_compile_with_default_vf_and_check (shader, + &filter->draw_attr_position_loc, &filter->draw_attr_texture_loc)) { + /* gst gl context error is already set */ + GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, + ("Failed to initialize identity shader, %s", + gst_gl_context_get_error ()), (NULL)); + return; } - gst_gl_shader_use (shader); + } + gst_gl_shader_use (shader); - gl->ActiveTexture (GL_TEXTURE0); - gl->BindTexture (GL_TEXTURE_2D, texture); + gl->ActiveTexture (GL_TEXTURE0); + gl->BindTexture (GL_TEXTURE_2D, texture); - gst_gl_shader_set_uniform_1i (shader, "tex", 0); - } + gst_gl_shader_set_uniform_1i (shader, "tex", 0); gst_gl_filter_draw_texture (filter, texture, width, height); } diff --git a/ext/gl/effects/gstgleffectlaplacian.c b/ext/gl/effects/gstgleffectlaplacian.c index a6eadcc..ca5b88c 100644 --- a/ext/gl/effects/gstgleffectlaplacian.c +++ b/ext/gl/effects/gstgleffectlaplacian.c @@ -34,7 +34,7 @@ gst_gl_effects_laplacian_callback (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "conv0", - conv9_fragment_source_gles2, conv9_fragment_source_opengl))) { + conv9_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; static gfloat kernel[9] = { 0.0, -1.0, 0.0, -1.0, 4.0, -1.0, diff --git a/ext/gl/effects/gstgleffectlumatocurve.c b/ext/gl/effects/gstgleffectlumatocurve.c index f4e303c..158fda0 100644 --- a/ext/gl/effects/gstgleffectlumatocurve.c +++ b/ext/gl/effects/gstgleffectlumatocurve.c @@ -35,8 +35,7 @@ gst_gl_effects_luma_to_curve (GstGLEffects * effects, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "luma_to_curve", - luma_to_curve_fragment_source_gles2, - luma_to_curve_fragment_source_opengl); + luma_to_curve_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectmirror.c b/ext/gl/effects/gstgleffectmirror.c index 4f5d473..5080099 100644 --- a/ext/gl/effects/gstgleffectmirror.c +++ b/ext/gl/effects/gstgleffectmirror.c @@ -34,7 +34,7 @@ gst_gl_effects_mirror_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "mirror", - mirror_fragment_source_gles2, mirror_fragment_source_opengl); + mirror_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectrgbtocurve.c b/ext/gl/effects/gstgleffectrgbtocurve.c index b2d84e1..e2b6bdb 100644 --- a/ext/gl/effects/gstgleffectrgbtocurve.c +++ b/ext/gl/effects/gstgleffectrgbtocurve.c @@ -35,7 +35,7 @@ gst_gl_effects_rgb_to_curve (GstGLEffects * effects, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "rgb_to_curve", - rgb_to_curve_fragment_source_gles2, rgb_to_curve_fragment_source_opengl); + rgb_to_curve_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectsin.c b/ext/gl/effects/gstgleffectsin.c index 302b2bb..5c09e8b 100644 --- a/ext/gl/effects/gstgleffectsin.c +++ b/ext/gl/effects/gstgleffectsin.c @@ -34,7 +34,7 @@ gst_gl_effects_sin_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "sin", - sin_fragment_source_gles2, sin_fragment_source_opengl); + sin_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectsobel.c b/ext/gl/effects/gstgleffectsobel.c index a18dbd3..8996b93 100644 --- a/ext/gl/effects/gstgleffectsobel.c +++ b/ext/gl/effects/gstgleffectsobel.c @@ -34,8 +34,7 @@ gst_gl_effects_sobel_callback_desaturate (gint width, gint height, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "desat0", - desaturate_fragment_source_gles2, - desaturate_fragment_source_opengl))) { + desaturate_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; #if GST_GL_HAVE_OPENGL @@ -65,8 +64,7 @@ gst_gl_effects_sobel_callback_hconv (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0", - sep_sobel_hconv3_fragment_source_gles2, - sep_sobel_hconv3_fragment_source_opengl))) { + sep_sobel_hconv3_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; #if GST_GL_HAVE_OPENGL @@ -97,8 +95,7 @@ gst_gl_effects_sobel_callback_vconv (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0", - sep_sobel_vconv3_fragment_source_gles2, - sep_sobel_vconv3_fragment_source_opengl))) { + sep_sobel_vconv3_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; #if GST_GL_HAVE_OPENGL @@ -129,8 +126,7 @@ gst_gl_effects_sobel_callback_length (gint width, gint height, guint texture, GstGLFilter *filter = GST_GL_FILTER (effects); if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "len0", - sep_sobel_length_fragment_source_gles2, - sep_sobel_length_fragment_source_opengl))) { + sep_sobel_length_fragment_source_gles2))) { GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; #if GST_GL_HAVE_OPENGL diff --git a/ext/gl/effects/gstgleffectsquare.c b/ext/gl/effects/gstgleffectsquare.c index 1dc09a2..e74c943 100644 --- a/ext/gl/effects/gstgleffectsquare.c +++ b/ext/gl/effects/gstgleffectsquare.c @@ -34,7 +34,7 @@ gst_gl_effects_square_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "square", - square_fragment_source_gles2, square_fragment_source_opengl); + square_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectsqueeze.c b/ext/gl/effects/gstgleffectsqueeze.c index 249deff..2dbded5 100644 --- a/ext/gl/effects/gstgleffectsqueeze.c +++ b/ext/gl/effects/gstgleffectsqueeze.c @@ -34,7 +34,7 @@ gst_gl_effects_squeeze_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "squeeze", - squeeze_fragment_source_gles2, squeeze_fragment_source_opengl); + squeeze_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectssources.c b/ext/gl/effects/gstgleffectssources.c index b783ced..3da856c 100644 --- a/ext/gl/effects/gstgleffectssources.c +++ b/ext/gl/effects/gstgleffectssources.c @@ -91,19 +91,6 @@ const gchar *mirror_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Squeeze effect */ -const gchar *squeeze_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - " r = pow(r, 0.40)*1.3;" - " normcoord = normcoord / r;" - " texturecoord = (normcoord + 0.5);" - " gl_FragColor = texture2D (tex, texturecoord);" - "}"; - const gchar *squeeze_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -120,20 +107,6 @@ const gchar *squeeze_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Stretch Effect */ -const gchar *stretch_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - " normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - " normcoord *= 2.0 - smoothstep(0.0, 0.35, r);" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord);" - " gl_FragColor = color * gl_Color;" - "}"; - const gchar *stretch_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -150,22 +123,6 @@ const gchar *stretch_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Light Tunnel effect */ -const gchar *tunnel_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - /* little trick with normalized coords to obtain a circle with - * rect textures */ - " normcoord = (texturecoord - 0.5);" - " float r = length(normcoord);" - " normcoord *= clamp (r, 0.0, 0.275) / r;" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord); " - " gl_FragColor = color;" - "}"; - const gchar *tunnel_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -184,20 +141,6 @@ const gchar *tunnel_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* FishEye effect */ -const gchar *fisheye_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - " normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - " normcoord *= r * sqrt(2.0);" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord);" - " gl_FragColor = color;" - "}"; - const gchar *fisheye_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -214,27 +157,6 @@ const gchar *fisheye_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Twirl effect */ -const gchar *twirl_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - " normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - /* calculate rotation angle: maximum (about pi/2) at the origin and - * gradually decrease it up to 0.6 of each quadrant */ - " float phi = (1.0 - smoothstep (0.0, 0.3, r)) * 1.6;" - /* precalculate sin phi and cos phi, save some alu */ - " float s = sin(phi);" - " float c = cos(phi);" - /* rotate */ - " normcoord *= mat2(c, s, -s, c);" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord); " - " gl_FragColor = color;" - "}"; - const gchar *twirl_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -258,20 +180,6 @@ const gchar *twirl_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Bulge effect */ -const gchar *bulge_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - " normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - " normcoord *= smoothstep (-0.05, 0.25, r);" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord);" - " gl_FragColor = color;" - "}"; - const gchar *bulge_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -288,21 +196,6 @@ const gchar *bulge_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -/* Square Effect */ -const gchar *square_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].xy;" - " vec2 normcoord;" - " normcoord = texturecoord - 0.5;" - " float r = length (normcoord);" - " normcoord *= 1.0 + smoothstep(0.125, 0.25, abs(normcoord));" - " normcoord /= 2.0; /* zoom amount */" - " texturecoord = normcoord + 0.5;" - " vec4 color = texture2D (tex, texturecoord);" - " gl_FragColor = color * gl_Color;" - "}"; - const gchar *square_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -320,15 +213,6 @@ const gchar *square_fragment_source_gles2 = " gl_FragColor = texture2D (tex, texturecoord);" "}"; -const gchar *luma_threshold_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].st;" - " vec4 color = texture2D(tex, texturecoord);" - " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));" /* BT.709 (from orange book) */ - " gl_FragColor = vec4 (vec3 (smoothstep (0.30, 0.50, luma)), color.a);" - "}"; - const gchar *luma_threshold_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -342,19 +226,6 @@ const gchar *luma_threshold_fragment_source_gles2 = " gl_FragColor = vec4 (vec3 (smoothstep (0.30, 0.50, luma)), color.a);" "}"; -const gchar *sep_sobel_length_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform bool invert;" - "void main () {" - " vec4 g = texture2D (tex, gl_TexCoord[0].st);" - /* restore black background with grey edges */ - " g -= vec4(0.5, 0.5, 0.0, 0.0);" - " float len = length (g);" - /* little trick to avoid IF operator */ - /* TODO: test if a standalone inverting pass is worth */ - " gl_FragColor = abs(vec4(vec3(float(invert) - len), 1.0));" - "}"; - const gchar *sep_sobel_length_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -372,14 +243,6 @@ const gchar *sep_sobel_length_fragment_source_gles2 = " gl_FragColor = abs(vec4(vec3(float(invert) - len), 1.0));" "}"; -const gchar *desaturate_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec4 color = texture2D (tex, gl_TexCoord[0].st);" - " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));" - " gl_FragColor = vec4(vec3(luma), color.a);" - "}"; - const gchar *desaturate_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -392,33 +255,6 @@ const gchar *desaturate_fragment_source_gles2 = " gl_FragColor = vec4(vec3(luma), color.a);" "}"; -const gchar *sep_sobel_hconv3_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform float width;" - "void main () {" - " float w = 1.0 / width;" - " vec2 texturecoord[3];" - " texturecoord[1] = gl_TexCoord[0].st;" - " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);" - " texturecoord[2] = texturecoord[1] + vec2(w, 0.0);" - " float grad_kern[3];" - " grad_kern[0] = 1.0;" - " grad_kern[1] = 0.0;" - " grad_kern[2] = -1.0;" - " float blur_kern[3];" - " blur_kern[0] = 0.25;" - " blur_kern[1] = 0.5;" - " blur_kern[2] = 0.25;" - " int i;" - " vec4 sum = vec4 (0.0);" - " for (i = 0; i < 3; i++) { " - " vec4 neighbor = texture2D(tex, texturecoord[i]); " - " sum.r = neighbor.r * blur_kern[i] + sum.r;" - " sum.g = neighbor.g * grad_kern[i] + sum.g;" - " }" - " gl_FragColor = sum + vec4(0.0, 0.5, 0.0, 0.0);" - "}"; - const gchar *sep_sobel_hconv3_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -450,33 +286,6 @@ const gchar *sep_sobel_hconv3_fragment_source_gles2 = " gl_FragColor = sum + vec4(0.0, 0.5, 0.0, 0.0);" "}"; -const gchar *sep_sobel_vconv3_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform float height;" - "void main () {" - " float h = 1.0 / height;" - " vec2 texturecoord[3];" - " texturecoord[1] = gl_TexCoord[0].st;" - " texturecoord[0] = texturecoord[1] - vec2(0.0, h);" - " texturecoord[2] = texturecoord[1] + vec2(0.0, h);" - " float grad_kern[3];" - " grad_kern[0] = 1.0;" - " grad_kern[1] = 0.0;" - " grad_kern[2] = -1.0;" - " float blur_kern[3];" - " blur_kern[0] = 0.25;" - " blur_kern[1] = 0.5;" - " blur_kern[2] = 0.25;" - " int i;" - " vec4 sum = vec4 (0.0);" - " for (i = 0; i < 3; i++) { " - " vec4 neighbor = texture2D(tex, texturecoord[i]); " - " sum.r = neighbor.r * grad_kern[i] + sum.r;" - " sum.g = neighbor.g * blur_kern[i] + sum.g;" - " }" - " gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);" - "}"; - const gchar *sep_sobel_vconv3_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -508,30 +317,6 @@ const gchar *sep_sobel_vconv3_fragment_source_gles2 = " gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);" "}"; -/* horizontal convolution 7x7 */ -const gchar *hconv7_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform float kernel[7];" - "uniform float gauss_width;" - "void main () {" - " float w = 1.0 / gauss_width;" - " vec2 texturecoord[7];" - " texturecoord[3] = gl_TexCoord[0].st;" - " texturecoord[2] = texturecoord[3] - vec2(w, 0.0);" - " texturecoord[1] = texturecoord[2] - vec2(w, 0.0);" - " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);" - " texturecoord[4] = texturecoord[3] + vec2(w, 0.0);" - " texturecoord[5] = texturecoord[4] + vec2(w, 0.0);" - " texturecoord[6] = texturecoord[5] + vec2(w, 0.0);" - " int i;" - " vec4 sum = vec4 (0.0);" - " for (i = 0; i < 7; i++) { " - " vec4 neighbor = texture2D(tex, texturecoord[i]); " - " sum += neighbor * kernel[i];" - " }" - " gl_FragColor = sum;" - "}"; - const gchar *hconv7_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -560,29 +345,6 @@ const gchar *hconv7_fragment_source_gles2 = "}"; /* vertical convolution 7x7 */ -const gchar *vconv7_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform float kernel[7];" - "uniform float gauss_height;" - "void main () {" - " float h = 1.0 / gauss_height;" - " vec2 texturecoord[7];" - " texturecoord[3] = gl_TexCoord[0].st;" - " texturecoord[2] = texturecoord[3] - vec2(0.0, h);" - " texturecoord[1] = texturecoord[2] - vec2(0.0, h);" - " texturecoord[0] = texturecoord[1] - vec2(0.0, h);" - " texturecoord[4] = texturecoord[3] + vec2(0.0, h);" - " texturecoord[5] = texturecoord[4] + vec2(0.0, h);" - " texturecoord[6] = texturecoord[5] + vec2(0.0, h);" - " int i;" - " vec4 sum = vec4 (0.0);" - " for (i = 0; i < 7; i++) { " - " vec4 neighbor = texture2D(tex, texturecoord[i]);" - " sum += neighbor * kernel[i];" - " }" - " gl_FragColor = sum;" - "}"; - const gchar *vconv7_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -611,17 +373,6 @@ const gchar *vconv7_fragment_source_gles2 = "}"; /* TODO: support several blend modes */ -const gchar *sum_fragment_source_opengl = - "uniform sampler2D base;" - "uniform sampler2D blend;" - "uniform float alpha;" - "uniform float beta;" - "void main () {" - " vec4 basecolor = texture2D (base, gl_TexCoord[0].st);" - " vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);" - " gl_FragColor = alpha * basecolor + beta * blendcolor;" - "}"; - const gchar *sum_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -637,16 +388,6 @@ const gchar *sum_fragment_source_gles2 = " gl_FragColor = alpha * basecolor + beta * blendcolor;" "}"; -const gchar *multiply_fragment_source_opengl = - "uniform sampler2D base;" - "uniform sampler2D blend;" - "uniform float alpha;" - "void main () {" - " vec4 basecolor = texture2D (base, gl_TexCoord[0].st);" - " vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);" - " gl_FragColor = (1.0 - alpha) * basecolor + alpha * basecolor * blendcolor;" - "}"; - const gchar *multiply_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -662,17 +403,6 @@ const gchar *multiply_fragment_source_gles2 = "}"; /* lut operations, map luma to tex1d, see orange book (chapter 19) */ -const gchar *luma_to_curve_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform sampler1D curve;" - "void main () {" - " vec2 texturecoord = gl_TexCoord[0].st;" - " vec4 color = texture2D (tex, texturecoord);" - " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));" - " color = texture1D(curve, luma);" - " gl_FragColor = color;" - "}"; - const gchar *luma_to_curve_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -689,19 +419,6 @@ const gchar *luma_to_curve_fragment_source_gles2 = "}"; /* lut operations, map rgb to tex1d, see orange book (chapter 19) */ -const gchar *rgb_to_curve_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform sampler1D curve;" - "void main () {" - " vec4 color = texture2D (tex, gl_TexCoord[0].st);" - " vec4 outcolor;" - " outcolor.r = texture1D(curve, color.r).r;" - " outcolor.g = texture1D(curve, color.g).g;" - " outcolor.b = texture1D(curve, color.b).b;" - " outcolor.a = color.a;" - " gl_FragColor = outcolor;" - "}"; - const gchar *rgb_to_curve_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -719,31 +436,6 @@ const gchar *rgb_to_curve_fragment_source_gles2 = " gl_FragColor = outcolor;" "}"; -const gchar *sin_fragment_source_opengl = - "uniform sampler2D tex;" - "void main () {" - " vec4 color = texture2D (tex, vec2(gl_TexCoord[0].st));" - " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));" -/* calculate hue with the Preucil formula */ - " float cosh = color.r - 0.5*(color.g + color.b);" -/* sqrt(3)/2 = 0.866 */ - " float sinh = 0.866*(color.g - color.b);" -/* hue = atan2 h */ - " float sch = (1.0-sinh)*cosh;" -/* ok this is a little trick I came up because I didn't find any - * detailed proof of the Preucil formula. The issue is that tan(h) is - * pi-periodic so the smoothstep thing gives both reds (h = 0) and - * cyans (h = 180). I don't want to use atan since it requires - * branching and doesn't work on i915. So take only the right half of - * the circle where cosine is positive */ -/* take a slightly purple color trying to get rid of human skin reds */ -/* tanh = +-1.0 for h = +-45, where yellow=60, magenta=-60 */ - " float a = smoothstep (0.3, 1.0, sch);" - " float b = smoothstep (-0.4, -0.1, sinh);" - " float mix = a * b;" - " gl_FragColor = color * mix + luma * (1.0 - mix);" - "}"; - const gchar *sin_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" @@ -808,33 +500,6 @@ const gchar *difference_fragment_source = when this shader will be used in production be careful to hard code kernel into the shader and remove unneeded zero multiplications in the convolution */ -const gchar *conv9_fragment_source_opengl = - "uniform sampler2D tex;" - "uniform float kernel[9];" - "uniform float width, height;" - "uniform bool invert;" - "void main () {" - " float w = 1.0 / width;" - " float h = 1.0 / height;" - " vec2 texturecoord[9];" - " texturecoord[4] = gl_TexCoord[0].st;" /* 0 0 */ - " texturecoord[5] = texturecoord[4] + vec2(w, 0.0);" /* 1 0 */ - " texturecoord[2] = texturecoord[5] - vec2(0.0, h);" /* 1 -1 */ - " texturecoord[1] = texturecoord[2] - vec2(w, 0.0);" /* 0 -1 */ - " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);" /* -1 -1 */ - " texturecoord[3] = texturecoord[0] + vec2(0.0, h);" /* -1 0 */ - " texturecoord[6] = texturecoord[3] + vec2(0.0, h);" /* -1 1 */ - " texturecoord[7] = texturecoord[6] + vec2(w, 0.0);" /* 0 1 */ - " texturecoord[8] = texturecoord[7] + vec2(w, 0.0);" /* 1 1 */ - " int i;" - " vec3 sum = vec3 (0.0);" - " for (i = 0; i < 9; i++) { " - " vec4 neighbor = texture2D (tex, texturecoord[i]);" - " sum += neighbor.xyz * kernel[i];" - " }" - " gl_FragColor = vec4 (abs(sum - vec3(float(invert))), 1.0);" - "}"; - const gchar *conv9_fragment_source_gles2 = "#ifdef GL_ES\n" "precision mediump float;\n" diff --git a/ext/gl/effects/gstgleffectssources.h b/ext/gl/effects/gstgleffectssources.h index 6e41c72..fcd5c93 100644 --- a/ext/gl/effects/gstgleffectssources.h +++ b/ext/gl/effects/gstgleffectssources.h @@ -21,28 +21,6 @@ #ifndef __GST_GL_EFFECTS_SOURCES_H__ #define __GST_GL_EFFECTS_SOURCES_H__ -extern const gchar *mirror_fragment_source_opengl; -extern const gchar *squeeze_fragment_source_opengl; -extern const gchar *stretch_fragment_source_opengl; -extern const gchar *fisheye_fragment_source_opengl; -extern const gchar *twirl_fragment_source_opengl; -extern const gchar *bulge_fragment_source_opengl; -extern const gchar *tunnel_fragment_source_opengl; -extern const gchar *square_fragment_source_opengl; -extern const gchar *luma_threshold_fragment_source_opengl; -extern const gchar *hconv7_fragment_source_opengl; -extern const gchar *vconv7_fragment_source_opengl; -extern const gchar *sum_fragment_source_opengl; -extern const gchar *luma_to_curve_fragment_source_opengl; -extern const gchar *rgb_to_curve_fragment_source_opengl; -extern const gchar *sin_fragment_source_opengl; -extern const gchar *desaturate_fragment_source_opengl; -extern const gchar *sep_sobel_hconv3_fragment_source_opengl; -extern const gchar *sep_sobel_vconv3_fragment_source_opengl; -extern const gchar *sep_sobel_length_fragment_source_opengl; -extern const gchar *multiply_fragment_source_opengl; -extern const gchar *conv9_fragment_source_opengl; - extern const gchar *mirror_fragment_source_gles2; extern const gchar *squeeze_fragment_source_gles2; extern const gchar *stretch_fragment_source_gles2; diff --git a/ext/gl/effects/gstgleffectstretch.c b/ext/gl/effects/gstgleffectstretch.c index 8c39636..d132bd0 100644 --- a/ext/gl/effects/gstgleffectstretch.c +++ b/ext/gl/effects/gstgleffectstretch.c @@ -34,7 +34,7 @@ gst_gl_effects_stretch_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "stretch", - stretch_fragment_source_gles2, stretch_fragment_source_opengl); + stretch_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffecttunnel.c b/ext/gl/effects/gstgleffecttunnel.c index e4c879f..5029c51 100644 --- a/ext/gl/effects/gstgleffecttunnel.c +++ b/ext/gl/effects/gstgleffecttunnel.c @@ -34,7 +34,7 @@ gst_gl_effects_tunnel_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "tunnel", - tunnel_fragment_source_gles2, tunnel_fragment_source_opengl); + tunnel_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffecttwirl.c b/ext/gl/effects/gstgleffecttwirl.c index 96dceea..6c73f19 100644 --- a/ext/gl/effects/gstgleffecttwirl.c +++ b/ext/gl/effects/gstgleffecttwirl.c @@ -34,7 +34,7 @@ gst_gl_effects_twirl_callback (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "twirl", - twirl_fragment_source_gles2, twirl_fragment_source_opengl); + twirl_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/effects/gstgleffectxray.c b/ext/gl/effects/gstgleffectxray.c index b25ecc1..c045cb6 100644 --- a/ext/gl/effects/gstgleffectxray.c +++ b/ext/gl/effects/gstgleffectxray.c @@ -49,7 +49,7 @@ gst_gl_effects_xray_step_two (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "hconv7", - hconv7_fragment_source_gles2, hconv7_fragment_source_opengl); + hconv7_fragment_source_gles2); if (!shader) return; @@ -88,7 +88,7 @@ gst_gl_effects_xray_step_three (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "vconv7", - vconv7_fragment_source_gles2, vconv7_fragment_source_opengl); + vconv7_fragment_source_gles2); if (!shader) return; @@ -124,7 +124,7 @@ gst_gl_effects_xray_desaturate (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "desaturate", - desaturate_fragment_source_gles2, desaturate_fragment_source_opengl); + desaturate_fragment_source_gles2); if (!shader) return; @@ -156,8 +156,7 @@ gst_gl_effects_xray_sobel_hconv (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3", - sep_sobel_hconv3_fragment_source_gles2, - sep_sobel_hconv3_fragment_source_opengl); + sep_sobel_hconv3_fragment_source_gles2); if (!shader) return; @@ -191,8 +190,7 @@ gst_gl_effects_xray_sobel_vconv (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3", - sep_sobel_vconv3_fragment_source_gles2, - sep_sobel_vconv3_fragment_source_opengl); + sep_sobel_vconv3_fragment_source_gles2); if (!shader) return; @@ -226,8 +224,7 @@ gst_gl_effects_xray_sobel_length (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length", - sep_sobel_length_fragment_source_gles2, - sep_sobel_length_fragment_source_opengl); + sep_sobel_length_fragment_source_gles2); if (!shader) return; @@ -262,7 +259,7 @@ gst_gl_effects_xray_step_five (gint width, gint height, guint texture, GstGLFuncs *gl = context->gl_vtable; shader = gst_gl_effects_get_fragment_shader (effects, "multiply", - multiply_fragment_source_gles2, multiply_fragment_source_opengl); + multiply_fragment_source_gles2); if (!shader) return; diff --git a/ext/gl/gstgldifferencematte.c b/ext/gl/gstgldifferencematte.c index fe9e246..b2b5fa5 100644 --- a/ext/gl/gstgldifferencematte.c +++ b/ext/gl/gstgldifferencematte.c @@ -96,39 +96,43 @@ gst_gl_differencematte_init_gl_resources (GstGLFilter * filter) gst_gl_shader_new (GST_GL_BASE_FILTER (filter)->context); } - if (!gst_gl_shader_compile_and_check (differencematte->shader[0], - difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) { + if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader + [0], difference_fragment_source, &filter->draw_attr_position_loc, + &filter->draw_attr_texture_loc)) { gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context, "Failed to initialize difference shader"); - GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, - ("%s", gst_gl_context_get_error ()), (NULL)); + GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s", + gst_gl_context_get_error ()), (NULL)); return; } - if (!gst_gl_shader_compile_and_check (differencematte->shader[1], - hconv7_fragment_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) { + if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader + [1], hconv7_fragment_source_gles2, &filter->draw_attr_position_loc, + &filter->draw_attr_texture_loc)) { gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context, "Failed to initialize hconv7 shader"); - GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, - ("%s", gst_gl_context_get_error ()), (NULL)); + GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s", + gst_gl_context_get_error ()), (NULL)); return; } - if (!gst_gl_shader_compile_and_check (differencematte->shader[2], - vconv7_fragment_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) { + if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader + [2], vconv7_fragment_source_gles2, &filter->draw_attr_position_loc, + &filter->draw_attr_texture_loc)) { gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context, "Failed to initialize vconv7 shader"); - GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, - ("%s", gst_gl_context_get_error ()), (NULL)); + GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s", + gst_gl_context_get_error ()), (NULL)); return; } - if (!gst_gl_shader_compile_and_check (differencematte->shader[3], - texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) { + if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader + [3], texture_interp_fragment_source, &filter->draw_attr_position_loc, + &filter->draw_attr_texture_loc)) { gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context, "Failed to initialize interp shader"); - GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, - ("%s", gst_gl_context_get_error ()), (NULL)); + GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s", + gst_gl_context_get_error ()), (NULL)); return; } } @@ -190,7 +194,8 @@ gst_gl_differencematte_class_init (GstGLDifferenceMatteClass * klass) "Saves a background frame and replace it with a pixbuf", "Filippo Argiolas "); - GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = GST_GL_API_OPENGL; + GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = + GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2; } static void diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c index 1ade04f..6cf5afc 100644 --- a/ext/gl/gstgleffects.c +++ b/ext/gl/gstgleffects.c @@ -536,8 +536,7 @@ gst_gl_effects_filter_texture (GstGLFilter * filter, guint in_tex, GstGLShader * gst_gl_effects_get_fragment_shader (GstGLEffects * effects, - const gchar * shader_name, const gchar * shader_source_gles2, - const gchar * shader_source_opengl) + const gchar * shader_name, const gchar * shader_source_gles2) { GstGLShader *shader = NULL; GstGLFilter *filter = GST_GL_FILTER (effects); @@ -546,39 +545,23 @@ gst_gl_effects_get_fragment_shader (GstGLEffects * effects, shader = g_hash_table_lookup (effects->shaderstable, shader_name); if (!shader) { - if (!shader && (USING_GLES2 (context) || USING_OPENGL3 (context))) { - shader = gst_gl_shader_new (context); - if (!gst_gl_shader_compile_with_default_v_and_check (shader, - shader_source_gles2, &filter->draw_attr_position_loc, - &filter->draw_attr_texture_loc)) { - /* gst gl context error is already set */ - GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, - ("Failed to initialize %s shader, %s", - shader_name, gst_gl_context_get_error ()), (NULL)); - gst_object_unref (shader); - shader = NULL; - } - } -#if GST_GL_HAVE_OPENGL - if (!shader && USING_OPENGL (context)) { - shader = gst_gl_shader_new (context); - if (!gst_gl_shader_compile_and_check (shader, - shader_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) { - gst_gl_context_set_error (context, "Failed to initialize %s shader", - shader_name); - GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, ("%s", - gst_gl_context_get_error ()), (NULL)); - gst_object_unref (shader); - shader = NULL; - } + shader = gst_gl_shader_new (context); + if (!gst_gl_shader_compile_with_default_v_and_check (shader, + shader_source_gles2, &filter->draw_attr_position_loc, + &filter->draw_attr_texture_loc)) { + /* gst gl context error is already set */ + GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, + ("Failed to initialize %s shader, %s", + shader_name, gst_gl_context_get_error ()), (NULL)); + gst_object_unref (shader); + shader = NULL; } -#endif + } - if (!shader) - return NULL; + if (!shader) + return NULL; - g_hash_table_insert (effects->shaderstable, (gchar *) shader_name, shader); - } + g_hash_table_insert (effects->shaderstable, (gchar *) shader_name, shader); return shader; } diff --git a/ext/gl/gstgleffects.h b/ext/gl/gstgleffects.h index 3d30067..82c33a9 100644 --- a/ext/gl/gstgleffects.h +++ b/ext/gl/gstgleffects.h @@ -89,7 +89,7 @@ struct _GstGLEffectsClass GType gst_gl_effects_get_type (void); gboolean gst_gl_effects_register_filters (GstPlugin *, GstRank); GstGLShader* gst_gl_effects_get_fragment_shader (GstGLEffects *effects, - const gchar * shader_name, const gchar * shader_source_gles2, const gchar * shader_source_opengl); + const gchar * shader_name, const gchar * shader_source_gles2); void gst_gl_effects_identity (GstGLEffects *effects); void gst_gl_effects_mirror (GstGLEffects *effects); diff --git a/gst-libs/gst/gl/gstglfilter.c b/gst-libs/gst/gl/gstglfilter.c index b2d3945..600b7c7 100644 --- a/gst-libs/gst/gl/gstglfilter.c +++ b/gst-libs/gst/gl/gstglfilter.c @@ -1124,37 +1124,7 @@ gst_gl_filter_draw_texture (GstGLFilter * filter, GLuint texture, GST_DEBUG ("drawing texture:%u dimensions:%ux%u", texture, width, height); -#if GST_GL_HAVE_OPENGL - if (gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) { - GLfloat verts[] = { -1.0f, -1.0f, - 1.0f, -1.0f, - 1.0f, 1.0f, - -1.0f, 1.0f - }; - GLfloat texcoords[] = { 0.0f, 0.0f, - 1.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 1.0f - }; - - gl->ActiveTexture (GL_TEXTURE0); - gl->BindTexture (GL_TEXTURE_2D, texture); - - gl->EnableClientState (GL_VERTEX_ARRAY); - gl->VertexPointer (2, GL_FLOAT, 0, &verts); - - gl->ClientActiveTexture (GL_TEXTURE0); - gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); - gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords); - - gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4); - - gl->DisableClientState (GL_VERTEX_ARRAY); - gl->DisableClientState (GL_TEXTURE_COORD_ARRAY); - } -#endif - if (gst_gl_context_get_gl_api (context) & (GST_GL_API_GLES2 | - GST_GL_API_OPENGL3)) { + { if (!filter->vertex_buffer) { if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &filter->vao); -- 2.7.4