static void clutter_gst_video_sink_set_glsl_shader (ClutterGstVideoSink *sink, const gchar *shader_src) { ClutterGstVideoSinkPrivate *priv = sink->priv; if (priv->texture) clutter_actor_set_shader (CLUTTER_ACTOR (priv->texture), NULL); if (priv->program) { cogl_program_unref (priv->program); priv->program = NULL; } if (priv->shader) { cogl_shader_unref (priv->shader); priv->shader = NULL; } if (shader_src) { ClutterShader *shader; /* Set a dummy shader so we don't interfere with the shader stack */ shader = clutter_shader_new (); clutter_shader_set_fragment_source (shader, dummy_shader, -1); clutter_actor_set_shader (CLUTTER_ACTOR (priv->texture), shader); g_object_unref (shader); /* Create shader through COGL - necessary as we need to be able to set * integer uniform variables for multi-texturing. */ priv->shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT); cogl_shader_source (priv->shader, shader_src); cogl_shader_compile (priv->shader); priv->program = cogl_create_program (); cogl_program_attach_shader (priv->program, priv->shader); cogl_program_link (priv->program); } }
static void rb_cogl_program_free (void *ptr) { if (ptr) cogl_program_unref (ptr); }