From 1034798969ff69bf6467941e1bc7b3b81bc92fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 11 Sep 2010 23:54:27 +0200 Subject: [PATCH] st-shadows: Use a template material when creating shadows To avoid recompiling shadows each time a new shadow is created, use a copy of a static template material. See http://bugzilla.clutter-project.org/show_bug.cgi?id=2280#c5. https://bugzilla.gnome.org/show_bug.cgi?id=629383 --- src/st/st-private.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/st/st-private.c b/src/st/st-private.c index 237635278..264ed727e 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -364,6 +364,8 @@ CoglHandle _st_create_shadow_material (StShadow *shadow_spec, CoglHandle src_texture) { + static CoglHandle shadow_material_template = COGL_INVALID_HANDLE; + CoglHandle material; CoglHandle texture; guchar *pixels_in, *pixels_out; @@ -483,18 +485,22 @@ _st_create_shadow_material (StShadow *shadow_spec, g_free (pixels_in); g_free (pixels_out); - material = cogl_material_new (); + if (G_UNLIKELY (shadow_material_template == COGL_INVALID_HANDLE)) + { + shadow_material_template = cogl_material_new (); + + /* We set up the material to blend the shadow texture with the combine + * constant, but defer setting the latter until painting, so that we can + * take the actor's overall opacity into account. */ + cogl_material_set_layer_combine (shadow_material_template, 0, + "RGBA = MODULATE (CONSTANT, TEXTURE[A])", + NULL); + } + + material = cogl_material_copy (shadow_material_template); cogl_material_set_layer (material, 0, texture); - /* We set up the material to blend the shadow texture with the combine - * constant, but defer setting the latter until painting, so that we can - * take the actor's overall opacity into account. */ - cogl_material_set_layer_combine (material, 0, - "RGBA = MODULATE (CONSTANT, TEXTURE[A])", - NULL); - - cogl_handle_unref (texture); return material;