From 9689ec5aadc4fafdb5f12d3329dc5b87b51177b1 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 27 May 2010 15:19:15 +0100 Subject: [PATCH] material: Adds a simple material age getter When we add support for weak materials it's expected that Clutter will want to attach them as private data to other materials and it needs a mechanism to determine when a weak material should be re-created because its parent has changed somehow. This adds the concept of a material age (internal only currently) which increments whenever a material is modified. Clutter can then save the age of the material which its weak materials are derived from and later determine when the weak material may be invalid. --- cogl/cogl-material-private.h | 10 ++++++++++ cogl/cogl-material.c | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/cogl/cogl-material-private.h b/cogl/cogl-material-private.h index f98bdb387..796ea5511 100644 --- a/cogl/cogl-material-private.h +++ b/cogl/cogl-material-private.h @@ -472,6 +472,13 @@ struct _CoglMaterial * bitfield can associate private data with a material. */ void *backend_priv; + /* Whenever a material is modified we increment the age. There's no + * guarantee that it won't wrap but it can nevertheless be a + * convenient mechanism to determine when a material has been + * changed to you can invalidate some some associated cache that + * depends on the old state. */ + unsigned long age; + /* This is the primary color of the material. * * This is a sparse property, ref COGL_MATERIAL_STATE_COLOR */ @@ -761,5 +768,8 @@ void _cogl_material_set_static_breadcrumb (CoglHandle handle, const char *breadcrumb); +unsigned long +_cogl_material_get_age (CoglHandle handle); + #endif /* __COGL_MATERIAL_PRIVATE_H */ diff --git a/cogl/cogl-material.c b/cogl/cogl-material.c index 1706d6ca2..2c10eddd4 100644 --- a/cogl/cogl-material.c +++ b/cogl/cogl-material.c @@ -368,6 +368,8 @@ _cogl_material_init_default_material (void) material->static_breadcrumb = "default material"; material->has_static_breadcrumb = TRUE; + material->age = 0; + /* Use the same defaults as the GL spec... */ cogl_color_init_from_4ub (&material->color, 0xff, 0xff, 0xff, 0xff); @@ -469,6 +471,8 @@ cogl_material_copy (CoglHandle handle) material->has_static_breadcrumb = FALSE; + material->age = 0; + return _cogl_material_handle_new (material); } @@ -1184,6 +1188,8 @@ _cogl_material_pre_change_notify (CoglMaterial *material, * are now free to modify the material. */ g_assert (!material->has_children); + material->age++; + /* If the material isn't already an authority for the state group * being modified then we need to initialize the corresponding * state. */ @@ -1561,6 +1567,9 @@ _cogl_material_layer_pre_change_notify (CoglMaterial *required_owner, init_layer_state: + if (required_owner) + required_owner->age++; + /* If the material isn't already an authority for the state group * being modified then we need to initialize the corresponding * state. */ @@ -4109,6 +4118,16 @@ cogl_material_get_depth_range (CoglHandle handle, *far = authority->big_state->depth_state.depth_range_far; } +unsigned long +_cogl_material_get_age (CoglHandle handle) +{ + CoglMaterial *material = COGL_MATERIAL (handle); + + g_return_val_if_fail (cogl_is_material (handle), 0); + + return material->age; +} + static CoglMaterialLayer * _cogl_material_layer_copy (CoglMaterialLayer *src) {