test-cogl-materials: Add a simple test for ref-counting copies
This adds a simple test which creates a material and a copy of it. Both materials are then immediately unref'd. The test checks whether the materials were actually freed by registering some user data with a destroy callback. This should catch a bug that Cogl had where it add an extra reference to the parent when a pipeline is copied. Signed-off-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
parent
eb28d16300
commit
7115c54fda
@ -222,6 +222,51 @@ test_invalid_texture_layers_with_constant_colors (TestState *state,
|
|||||||
test_material_with_primitives (state, x, y, 0x0000ffff);
|
test_material_with_primitives (state, x, y, 0x0000ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
basic_ref_counting_destroy_cb (void *user_data)
|
||||||
|
{
|
||||||
|
gboolean *destroyed_flag = user_data;
|
||||||
|
|
||||||
|
g_assert (*destroyed_flag == FALSE);
|
||||||
|
|
||||||
|
*destroyed_flag = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_basic_ref_counting (void)
|
||||||
|
{
|
||||||
|
CoglMaterial *material_parent;
|
||||||
|
gboolean parent_destroyed = FALSE;
|
||||||
|
CoglMaterial *material_child;
|
||||||
|
gboolean child_destroyed = FALSE;
|
||||||
|
static CoglUserDataKey user_data_key;
|
||||||
|
|
||||||
|
/* This creates a material with a copy and then just unrefs them
|
||||||
|
both without setting them as a source. They should immediately be
|
||||||
|
freed. We can test whether they were freed or not by registering
|
||||||
|
a destroy callback with some user data */
|
||||||
|
|
||||||
|
material_parent = cogl_material_new ();
|
||||||
|
/* Set some user data so we can detect when the material is
|
||||||
|
destroyed */
|
||||||
|
cogl_object_set_user_data (COGL_OBJECT (material_parent),
|
||||||
|
&user_data_key,
|
||||||
|
&parent_destroyed,
|
||||||
|
basic_ref_counting_destroy_cb);
|
||||||
|
|
||||||
|
material_child = cogl_material_copy (material_parent);
|
||||||
|
cogl_object_set_user_data (COGL_OBJECT (material_child),
|
||||||
|
&user_data_key,
|
||||||
|
&child_destroyed,
|
||||||
|
basic_ref_counting_destroy_cb);
|
||||||
|
|
||||||
|
cogl_object_unref (material_child);
|
||||||
|
cogl_object_unref (material_parent);
|
||||||
|
|
||||||
|
g_assert (parent_destroyed);
|
||||||
|
g_assert (child_destroyed);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_paint (ClutterActor *actor, TestState *state)
|
on_paint (ClutterActor *actor, TestState *state)
|
||||||
{
|
{
|
||||||
@ -235,6 +280,8 @@ on_paint (ClutterActor *actor, TestState *state)
|
|||||||
2, 0 /* position */
|
2, 0 /* position */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test_basic_ref_counting ();
|
||||||
|
|
||||||
/* Comment this out if you want visual feedback for what this test paints */
|
/* Comment this out if you want visual feedback for what this test paints */
|
||||||
#if 1
|
#if 1
|
||||||
clutter_main_quit ();
|
clutter_main_quit ();
|
||||||
|
Loading…
Reference in New Issue
Block a user