MaterialNodes are used for the sparse graph of material state and layer
state. In the case of materials there is the idea of weak materials that
don't take a reference on their parent and in that case we need to be
careful not to unref our parent during
_cogl_material_node_unparent_real. This adds a has_parent_reference
member to the CoglMaterialNode struct so we now know when to skip the
unref.
/* The parent material/layer */
CoglMaterialNode *parent;
+ /* TRUE if the node took a strong reference on its parent. Weak
+ * materials for instance don't take a reference on their parent. */
+ gboolean has_parent_reference;
+
/* As an optimization for creating leaf node materials/layers (the
* most common) we don't require any list node allocations to link
* to a single descendant. */
}
node->parent = parent;
+ node->has_parent_reference = take_strong_reference;
/* Now that there is a consistent parent->child link we can remove
* the parent reference if no reference was requested. If it turns
else
parent->children = g_list_remove (parent->children, node);
- cogl_object_unref (parent);
+ if (node->has_parent_reference)
+ cogl_object_unref (parent);
node->parent = NULL;
}