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
This commit is contained in:
Florian Müllner 2010-09-11 23:54:27 +02:00
parent 862f1ea18c
commit 1034798969

View File

@ -364,6 +364,8 @@ CoglHandle
_st_create_shadow_material (StShadow *shadow_spec, _st_create_shadow_material (StShadow *shadow_spec,
CoglHandle src_texture) CoglHandle src_texture)
{ {
static CoglHandle shadow_material_template = COGL_INVALID_HANDLE;
CoglHandle material; CoglHandle material;
CoglHandle texture; CoglHandle texture;
guchar *pixels_in, *pixels_out; guchar *pixels_in, *pixels_out;
@ -483,17 +485,21 @@ _st_create_shadow_material (StShadow *shadow_spec,
g_free (pixels_in); g_free (pixels_in);
g_free (pixels_out); g_free (pixels_out);
material = cogl_material_new (); if (G_UNLIKELY (shadow_material_template == COGL_INVALID_HANDLE))
{
cogl_material_set_layer (material, 0, texture); shadow_material_template = cogl_material_new ();
/* We set up the material to blend the shadow texture with the combine /* 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 * constant, but defer setting the latter until painting, so that we can
* take the actor's overall opacity into account. */ * take the actor's overall opacity into account. */
cogl_material_set_layer_combine (material, 0, cogl_material_set_layer_combine (shadow_material_template, 0,
"RGBA = MODULATE (CONSTANT, TEXTURE[A])", "RGBA = MODULATE (CONSTANT, TEXTURE[A])",
NULL); NULL);
}
material = cogl_material_copy (shadow_material_template);
cogl_material_set_layer (material, 0, texture);
cogl_handle_unref (texture); cogl_handle_unref (texture);