[453/906] blur: give up some accuracy for speed

Settle with 7x7 gaussian convolution kernels, maybe slightly less
accurate than previous 9x9 but fast enough to be able to use it on i915.
About a 20% percent speed gain (again, roughly measured with
videotestsrc and glimagesink sync=false). No noticeable rendering
difference with current effects.
This commit is contained in:
Filippo Argiolas 2010-04-29 20:49:02 +02:00 committed by Matthew Waters
parent a9aa0ab2ee
commit 17a33cd19a
8 changed files with 38 additions and 44 deletions

View file

@ -21,7 +21,7 @@
#include <gstgleffects.h>
static gboolean kernel_ready = FALSE;
static float gauss_kernel[9];
static float gauss_kernel[7];
static void
gst_gl_effects_glow_step_one (gint width, gint height, guint texture,
@ -70,12 +70,12 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
}
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 9, 10.0);
fill_gaussian_kernel (gauss_kernel, 7, 10.0);
kernel_ready = TRUE;
}
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
@ -88,7 +88,7 @@ gst_gl_effects_glow_step_two (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
gst_gl_effects_draw_texture (effects, texture);
}
@ -108,7 +108,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
}
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
@ -121,7 +121,7 @@ gst_gl_effects_glow_step_three (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
gst_gl_shader_set_uniform_1i (shader, "tex", 1);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 9, gauss_kernel);
gst_gl_shader_set_uniform_1fv (shader, "kernel", 7, gauss_kernel);
gst_gl_effects_draw_texture (effects, texture);
}

View file

@ -348,50 +348,46 @@ const gchar *sep_sobel_vconv3_fragment_source =
" gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
"}";
/* horizontal convolution 9x9 */
const gchar *hconv9_fragment_source =
/* horizontal convolution 7x7 */
const gchar *hconv7_fragment_source =
"#extension GL_ARB_texture_rectangle : enable\n"
"uniform sampler2DRect tex;"
"uniform float kernel[9];"
"uniform float kernel[7];"
"void main () {"
" vec2 texturecoord[9];"
" texturecoord[4] = gl_TexCoord[0].st;"
" texturecoord[3] = texturecoord[4] - vec2(1.0, 0.0);"
" vec2 texturecoord[7];"
" texturecoord[3] = gl_TexCoord[0].st;"
" texturecoord[2] = texturecoord[3] - vec2(1.0, 0.0);"
" texturecoord[1] = texturecoord[2] - vec2(1.0, 0.0);"
" texturecoord[0] = texturecoord[1] - vec2(1.0, 0.0);"
" texturecoord[4] = texturecoord[3] + vec2(1.0, 0.0);"
" texturecoord[5] = texturecoord[4] + vec2(1.0, 0.0);"
" texturecoord[6] = texturecoord[5] + vec2(1.0, 0.0);"
" texturecoord[7] = texturecoord[6] + vec2(1.0, 0.0);"
" texturecoord[8] = texturecoord[7] + vec2(1.0, 0.0);"
" int i;"
" vec4 sum = vec4 (0.0);"
" for (i = 0; i < 9; i++) { "
" for (i = 0; i < 7; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord[i]); "
" sum += neighbor * kernel[i];"
" }"
" gl_FragColor = sum;"
"}";
/* vertical convolution 9x9 */
const gchar *vconv9_fragment_source =
/* vertical convolution 7x7 */
const gchar *vconv7_fragment_source =
"#extension GL_ARB_texture_rectangle : enable\n"
"uniform sampler2DRect tex;"
"uniform float kernel[9];"
"uniform float kernel[7];"
"void main () {"
" vec2 texturecoord[9];"
" texturecoord[4] = gl_TexCoord[0].st;"
" texturecoord[3] = texturecoord[4] - vec2(0.0, 1.0);"
" vec2 texturecoord[7];"
" texturecoord[3] = gl_TexCoord[0].st;"
" texturecoord[2] = texturecoord[3] - vec2(0.0, 1.0);"
" texturecoord[1] = texturecoord[2] - vec2(0.0, 1.0);"
" texturecoord[0] = texturecoord[1] - vec2(0.0, 1.0);"
" texturecoord[4] = texturecoord[3] + vec2(0.0, 1.0);"
" texturecoord[5] = texturecoord[4] + vec2(0.0, 1.0);"
" texturecoord[6] = texturecoord[5] + vec2(0.0, 1.0);"
" texturecoord[7] = texturecoord[6] + vec2(0.0, 1.0);"
" texturecoord[8] = texturecoord[7] + vec2(0.0, 1.0);"
" int i;"
" vec4 sum = vec4 (0.0);"
" for (i = 0; i < 9; i++) { "
" for (i = 0; i < 7; i++) { "
" vec4 neighbor = texture2DRect(tex, texturecoord[i]);"
" sum += neighbor * kernel[i];"
" }"

View file

@ -36,8 +36,8 @@ extern const gchar *sep_sobel_length_fragment_source;
extern const gchar *desaturate_fragment_source;
extern const gchar *sep_sobel_hconv3_fragment_source;
extern const gchar *sep_sobel_vconv3_fragment_source;
extern const gchar *hconv9_fragment_source;
extern const gchar *vconv9_fragment_source;
extern const gchar *hconv7_fragment_source;
extern const gchar *vconv7_fragment_source;
extern const gchar *sum_fragment_source;
extern const gchar *luma_to_curve_fragment_source;
extern const gchar *rgb_to_curve_fragment_source;

View file

@ -23,9 +23,7 @@
#include <gstgleffectlumatocurve.h>
static gboolean kernel_ready = FALSE;
static float gauss_kernel[9];
/* Normalization Constant = 0.999885 */
static float gauss_kernel[7];
static void
gst_gl_effects_xray_step_one (gint width, gint height, guint texture,
@ -52,12 +50,12 @@ gst_gl_effects_xray_step_two (gint width, gint height, guint texture,
}
if (!kernel_ready) {
fill_gaussian_kernel (gauss_kernel, 9, 1.5);
fill_gaussian_kernel (gauss_kernel, 7, 1.5);
kernel_ready = TRUE;
}
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
@ -90,7 +88,7 @@ gst_gl_effects_xray_step_three (gint width, gint height, guint texture,
}
g_return_if_fail (gst_gl_shader_compile_and_check (shader,
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();

View file

@ -101,10 +101,10 @@ gst_gl_differencematte_init_gl_resources (GstGLFilter * filter)
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[0],
difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[1],
hconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
hconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[2],
vconv9_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
vconv7_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
g_return_if_fail (gst_gl_shader_compile_and_check (differencematte->shader[3],
texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE));
@ -204,7 +204,7 @@ gst_gl_differencematte_init (GstGLDifferenceMatte * differencematte,
differencematte->newbgtexture = 0;
differencematte->bg_has_changed = FALSE;
fill_gaussian_kernel (differencematte->kernel, 9, 3.0);
fill_gaussian_kernel (differencematte->kernel, 7, 30.0);
}
static void
@ -341,7 +341,7 @@ gst_gl_differencematte_hblur (gint width, gint height, guint texture,
gst_gl_shader_set_uniform_1i (differencematte->shader[1], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 9,
gst_gl_shader_set_uniform_1fv (differencematte->shader[1], "kernel", 7,
differencematte->kernel);
gst_gl_differencematte_draw_texture (differencematte, texture);
@ -365,7 +365,7 @@ gst_gl_differencematte_vblur (gint width, gint height, guint texture,
gst_gl_shader_set_uniform_1i (differencematte->shader[2], "tex", 0);
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 9,
gst_gl_shader_set_uniform_1fv (differencematte->shader[2], "kernel", 7,
differencematte->kernel);
gst_gl_differencematte_draw_texture (differencematte, texture);

View file

@ -48,7 +48,7 @@ struct _GstGLDifferenceMatte
GLuint newbgtexture;
GLuint midtexture[4];
GLuint intexture;
float kernel[9];
float kernel[7];
};
struct _GstGLDifferenceMatteClass

View file

@ -126,7 +126,7 @@ gst_gl_filterblur_init (GstGLFilterBlur * filterblur,
/* gaussian kernel (well, actually vector), size 9, standard
* deviation 3.0 */
/* FIXME: eventually make this a runtime property */
fill_gaussian_kernel (filterblur->gauss_kernel, 9, 3.0);
fill_gaussian_kernel (filterblur->gauss_kernel, 7, 3.0);
}
static void
@ -173,11 +173,11 @@ gst_gl_filterblur_init_shader (GstGLFilter * filter)
GstGLFilterBlur *blur_filter = GST_GL_FILTERBLUR (filter);
//blocking call, wait the opengl thread has compiled the shader
gst_gl_display_gen_shader (filter->display, 0, hconv9_fragment_source,
gst_gl_display_gen_shader (filter->display, 0, hconv7_fragment_source,
&blur_filter->shader0);
//blocking call, wait the opengl thread has compiled the shader
gst_gl_display_gen_shader (filter->display, 0, vconv9_fragment_source,
gst_gl_display_gen_shader (filter->display, 0, vconv7_fragment_source,
&blur_filter->shader1);
}
@ -214,7 +214,7 @@ gst_gl_filterblur_hcallback (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
gst_gl_shader_set_uniform_1i (filterblur->shader0, "tex", 1);
gst_gl_shader_set_uniform_1fv (filterblur->shader0, "kernel", 9,
gst_gl_shader_set_uniform_1fv (filterblur->shader0, "kernel", 7,
filterblur->gauss_kernel);
gst_gl_filter_draw_texture (filter, texture);
@ -239,7 +239,7 @@ gst_gl_filterblur_vcallback (gint width, gint height, guint texture,
glDisable (GL_TEXTURE_RECTANGLE_ARB);
gst_gl_shader_set_uniform_1i (filterblur->shader1, "tex", 1);
gst_gl_shader_set_uniform_1fv (filterblur->shader1, "kernel", 9,
gst_gl_shader_set_uniform_1fv (filterblur->shader1, "kernel", 7,
filterblur->gauss_kernel);
gst_gl_filter_draw_texture (filter, texture);

View file

@ -40,7 +40,7 @@ struct _GstGLFilterBlur
GstGLShader *shader1;
GLuint midtexture;
float gauss_kernel[9];
float gauss_kernel[7];
};
struct _GstGLFilterBlurClass