mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
[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:
parent
a9aa0ab2ee
commit
17a33cd19a
8 changed files with 38 additions and 44 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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];"
|
||||
" }"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -48,7 +48,7 @@ struct _GstGLDifferenceMatte
|
|||
GLuint newbgtexture;
|
||||
GLuint midtexture[4];
|
||||
GLuint intexture;
|
||||
float kernel[9];
|
||||
float kernel[7];
|
||||
};
|
||||
|
||||
struct _GstGLDifferenceMatteClass
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -40,7 +40,7 @@ struct _GstGLFilterBlur
|
|||
GstGLShader *shader1;
|
||||
|
||||
GLuint midtexture;
|
||||
float gauss_kernel[9];
|
||||
float gauss_kernel[7];
|
||||
};
|
||||
|
||||
struct _GstGLFilterBlurClass
|
||||
|
|
Loading…
Reference in a new issue