summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2009-06-29 15:34:49 +0200
committerDamien Lespiau <damien.lespiau@intel.com>2009-06-29 15:34:49 +0200
commitac18739380183ff7212253e73467e49b75e58d91 (patch)
tree08543ff57959b0da0a7e05db519b7448cb823264
parentf3a826b9f4b24347f8bf23adbb6d6f57c34605b2 (diff)
downloadclutter-gst-ac18739380183ff7212253e73467e49b75e58d91.tar.gz
[videosink] Squash the two paint signal handlers into one
For each frames, two signal handlers were registered with the ClutterTexture::paint signal, one to bind the shader and one to bind two layers. Squash these two functions into one to avoid the overhead of an unneeded closure call.
-rw-r--r--clutter-gst/clutter-gst-video-sink.c77
1 files changed, 33 insertions, 44 deletions
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index 287cd8b..674655a 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -266,23 +266,11 @@ _renderer_connect_signals(ClutterGstVideoSink *sink,
#ifdef CLUTTER_COGL_HAS_GL
static void
-clutter_gst_video_sink_fp_paint (ClutterActor *actor,
- ClutterGstVideoSink *sink)
-{
- ClutterGstVideoSinkPrivate *priv = sink->priv;
-
- glEnable (GL_FRAGMENT_PROGRAM_ARB);
- priv->syms.glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->fp);
-
-}
-
-static void
clutter_gst_video_sink_set_fp_shader (ClutterGstVideoSink *sink,
const gchar *shader_src,
const int size)
{
ClutterGstVideoSinkPrivate *priv = sink->priv;
- gulong handler_id;
/* FIXME: implement freeing the shader */
if (!shader_src)
@@ -297,26 +285,10 @@ clutter_gst_video_sink_set_fp_shader (ClutterGstVideoSink *sink,
(const GLbyte *)shader_src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);
-
- /* Hook onto the pre-paint signal to bind the shader. */
- handler_id = g_signal_connect (priv->texture,
- "paint",
- G_CALLBACK (clutter_gst_video_sink_fp_paint),
- sink);
- g_array_append_val (priv->signal_handler_ids, handler_id);
}
#endif
static void
-clutter_gst_video_sink_paint (ClutterActor *actor,
- ClutterGstVideoSink *sink)
-{
- ClutterGstVideoSinkPrivate *priv = sink->priv;
- if (priv->program)
- cogl_program_use (priv->program);
-}
-
-static void
clutter_gst_video_sink_set_glsl_shader (ClutterGstVideoSink *sink,
const gchar *shader_src)
{
@@ -340,7 +312,6 @@ clutter_gst_video_sink_set_glsl_shader (ClutterGstVideoSink *sink,
if (shader_src)
{
ClutterShader *shader;
- gulong handler_id;
/* Set a dummy shader so we don't interfere with the shader stack */
shader = clutter_shader_new ();
@@ -358,15 +329,6 @@ clutter_gst_video_sink_set_glsl_shader (ClutterGstVideoSink *sink,
priv->program = cogl_create_program ();
cogl_program_attach_shader (priv->program, priv->shader);
cogl_program_link (priv->program);
-
- /* Hook onto the pre-paint signal to replace the dummy shader with
- * the real shader.
- */
- handler_id = g_signal_connect (priv->texture,
- "paint",
- G_CALLBACK (clutter_gst_video_sink_paint),
- sink);
- g_array_append_val (priv->signal_handler_ids, handler_id);
}
}
@@ -499,14 +461,17 @@ clutter_gst_yv12_upload (ClutterGstVideoSink *sink,
}
static void
-clutter_gst_yv12_paint (ClutterActor *actor,
- ClutterGstVideoSink *sink)
+clutter_gst_yv12_glsl_paint (ClutterActor *actor,
+ ClutterGstVideoSink *sink)
{
ClutterGstVideoSinkPrivate *priv = sink->priv;
CoglHandle material;
material = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (actor));
+ /* bind the shader */
+ cogl_program_use (priv->program);
+
/* Bind the U and V textures in layers 1 and 2 */
if (priv->u_tex)
cogl_material_set_layer (material, 1, priv->u_tex);
@@ -524,6 +489,9 @@ clutter_gst_yv12_glsl_post_paint (ClutterActor *actor,
material = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (actor));
cogl_material_remove_layer (material, 1);
cogl_material_remove_layer (material, 2);
+
+ /* disable the shader */
+ cogl_program_use (COGL_INVALID_HANDLE);
}
static void
@@ -545,7 +513,7 @@ clutter_gst_yv12_glsl_init (ClutterGstVideoSink *sink)
cogl_program_use (COGL_INVALID_HANDLE);
_renderer_connect_signals (sink,
- clutter_gst_yv12_paint,
+ clutter_gst_yv12_glsl_paint,
clutter_gst_yv12_glsl_post_paint);
}
@@ -575,6 +543,27 @@ static ClutterGstRenderer yv12_glsl_renderer =
#ifdef CLUTTER_COGL_HAS_GL
static void
+clutter_gst_yv12_fp_paint (ClutterActor *actor,
+ ClutterGstVideoSink *sink)
+{
+ ClutterGstVideoSinkPrivate *priv = sink->priv;
+ CoglHandle material;
+
+ material = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (actor));
+
+ /* Bind the U and V textures in layers 1 and 2 */
+ if (priv->u_tex)
+ cogl_material_set_layer (material, 1, priv->u_tex);
+ if (priv->v_tex)
+ cogl_material_set_layer (material, 2, priv->v_tex);
+
+ /* bind the shader */
+ glEnable (GL_FRAGMENT_PROGRAM_ARB);
+ priv->syms.glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->fp);
+
+}
+
+static void
clutter_gst_yv12_fp_post_paint (ClutterActor *actor,
ClutterGstVideoSink *sink)
{
@@ -603,7 +592,7 @@ clutter_gst_yv12_fp_init (ClutterGstVideoSink *sink)
g_free(shader);
_renderer_connect_signals (sink,
- clutter_gst_yv12_paint,
+ clutter_gst_yv12_fp_paint,
clutter_gst_yv12_fp_post_paint);
}
@@ -650,7 +639,7 @@ clutter_gst_i420_glsl_init (ClutterGstVideoSink *sink)
cogl_program_use (COGL_INVALID_HANDLE);
_renderer_connect_signals (sink,
- clutter_gst_yv12_paint,
+ clutter_gst_yv12_glsl_paint,
clutter_gst_yv12_glsl_post_paint);
}
@@ -687,7 +676,7 @@ clutter_gst_i420_fp_init (ClutterGstVideoSink *sink)
g_free(shader);
_renderer_connect_signals (sink,
- clutter_gst_yv12_paint,
+ clutter_gst_yv12_fp_paint,
clutter_gst_yv12_fp_post_paint);
}