From 6ddb8397110f6e6998e0262e5d3dd604cd93d670 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Thu, 25 Nov 2010 10:56:50 +0000 Subject: [PATCH] clutter-offscreen-effect: Don't recreate the material when FBO changes Previously whenever the size of the FBO changes it would create a new material and attach the texture to it. This is not good for Cogl because it throws away any cached state for the material. In test-rotate the size of the FBO changes constantly so it effectively uses a new material every paint. For shader effects this also ends up relinking the shader every paint because the linked programs are part of the material state. --- clutter/clutter-offscreen-effect.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/clutter/clutter-offscreen-effect.c b/clutter/clutter-offscreen-effect.c index 21b30350f..f034cfd2b 100644 --- a/clutter/clutter-offscreen-effect.c +++ b/clutter/clutter-offscreen-effect.c @@ -152,13 +152,8 @@ update_fbo (ClutterEffect *effect, int fbo_width, int fbo_height) priv->target_height == fbo_height) return TRUE; - if (priv->target != COGL_INVALID_HANDLE) - { - cogl_handle_unref (priv->target); - cogl_handle_unref (priv->offscreen); - } - - priv->target = cogl_material_new (); + if (priv->target == COGL_INVALID_HANDLE) + priv->target = cogl_material_new (); texture = clutter_offscreen_effect_create_texture (self, fbo_width, fbo_height); @@ -175,6 +170,9 @@ update_fbo (ClutterEffect *effect, int fbo_width, int fbo_height) priv->target_width = cogl_texture_get_width (texture); priv->target_height = cogl_texture_get_height (texture); + if (priv->offscreen != COGL_INVALID_HANDLE) + cogl_handle_unref (priv->offscreen); + priv->offscreen = cogl_offscreen_new_to_texture (texture); if (priv->offscreen == COGL_INVALID_HANDLE) {