Conformance test to check whether the pipeline cache holds textures
Currently when a unique pipeline is created and added to the pipeline cache that pipeline will live forever which includes keeping a reference to any large resources that the pipeline has such as textures. These textures don't actually need to be kept for the pipeline to be used as a key in the hash table so ideally we wouldn't do this. This test case tries rendering with a pipeline that has textures and then checks whether the textures are successfully destroyed after the pipeline is unreffed. The test is currently marked as a known failure because the pipeline cache will prevent them from being destroyed. Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit 0056f805dadd46b966d57f66b02890b8c29971ac)
This commit is contained in:
parent
3ba03feb7d
commit
e98960a685
@ -65,6 +65,7 @@ test_sources = \
|
||||
test-framebuffer-get-bits.c \
|
||||
test-primitive-and-journal.c \
|
||||
test-copy-replace-texture.c \
|
||||
test-pipeline-cache-unrefs-texture.c \
|
||||
$(NULL)
|
||||
|
||||
test_conformance_SOURCES = $(common_sources) $(test_sources)
|
||||
|
@ -120,6 +120,8 @@ main (int argc, char **argv)
|
||||
|
||||
ADD_TEST (test_copy_replace_texture, 0, 0);
|
||||
|
||||
ADD_TEST (test_pipeline_cache_unrefs_texture, 0, TEST_KNOWN_FAILURE);
|
||||
|
||||
UNPORTED_TEST (test_viewport);
|
||||
|
||||
ADD_TEST (test_gles2_context, TEST_REQUIREMENT_GLES2_CONTEXT, 0);
|
||||
|
92
tests/conform/test-pipeline-cache-unrefs-texture.c
Normal file
92
tests/conform/test-pipeline-cache-unrefs-texture.c
Normal file
@ -0,0 +1,92 @@
|
||||
#include <cogl/cogl.h>
|
||||
|
||||
#include "test-utils.h"
|
||||
|
||||
/* Keep track of the number of textures that we've created and are
|
||||
* still alive */
|
||||
static int destroyed_texture_count = 0;
|
||||
|
||||
#define N_TEXTURES 3
|
||||
|
||||
static void
|
||||
free_texture_cb (void *user_data)
|
||||
{
|
||||
destroyed_texture_count++;
|
||||
}
|
||||
|
||||
static CoglTexture *
|
||||
create_texture (void)
|
||||
{
|
||||
static const guint8 data[] =
|
||||
{ 0xff, 0xff, 0xff, 0xff };
|
||||
static CoglUserDataKey texture_data_key;
|
||||
CoglTexture2D *tex_2d;
|
||||
|
||||
tex_2d = cogl_texture_2d_new_from_data (test_ctx,
|
||||
1, 1, /* width / height */
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
4, /* rowstride */
|
||||
data,
|
||||
NULL);
|
||||
|
||||
/* Set some user data on the texture so we can track when it has
|
||||
* been destroyed */
|
||||
cogl_object_set_user_data (COGL_OBJECT (tex_2d),
|
||||
&texture_data_key,
|
||||
GINT_TO_POINTER (1),
|
||||
free_texture_cb);
|
||||
|
||||
return COGL_TEXTURE (tex_2d);
|
||||
}
|
||||
|
||||
void
|
||||
test_pipeline_cache_unrefs_texture (void)
|
||||
{
|
||||
CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
|
||||
CoglPipeline *simple_pipeline;
|
||||
int i;
|
||||
|
||||
/* Create a pipeline with three texture layers. That way we can be
|
||||
* pretty sure the pipeline will cause a unique shader to be
|
||||
* generated in the cache */
|
||||
for (i = 0; i < N_TEXTURES; i++)
|
||||
{
|
||||
CoglTexture *tex = create_texture ();
|
||||
cogl_pipeline_set_layer_texture (pipeline, i, tex);
|
||||
cogl_object_unref (tex);
|
||||
}
|
||||
|
||||
/* Draw something with the pipeline to ensure it gets into the
|
||||
* pipeline cache */
|
||||
cogl_framebuffer_draw_rectangle (test_fb,
|
||||
pipeline,
|
||||
0, 0, 10, 10);
|
||||
cogl_framebuffer_finish (test_fb);
|
||||
|
||||
/* Draw something else so that it is no longer the current flushed
|
||||
* pipeline, and the units have a different texture bound */
|
||||
simple_pipeline = cogl_pipeline_new (test_ctx);
|
||||
for (i = 0; i < N_TEXTURES; i++)
|
||||
{
|
||||
CoglColor combine_constant;
|
||||
cogl_color_init_from_4ub (&combine_constant, i, 0, 0, 255);
|
||||
cogl_pipeline_set_layer_combine_constant (simple_pipeline,
|
||||
i,
|
||||
&combine_constant);
|
||||
}
|
||||
cogl_framebuffer_draw_rectangle (test_fb, simple_pipeline, 0, 0, 10, 10);
|
||||
cogl_framebuffer_finish (test_fb);
|
||||
cogl_object_unref (simple_pipeline);
|
||||
|
||||
g_assert_cmpint (destroyed_texture_count, ==, 0);
|
||||
|
||||
/* Destroy the pipeline. This should immediately cause the textures
|
||||
* to be freed */
|
||||
cogl_object_unref (pipeline);
|
||||
|
||||
g_assert_cmpint (destroyed_texture_count, ==, N_TEXTURES);
|
||||
|
||||
if (cogl_test_verbose ())
|
||||
g_print ("OK\n");
|
||||
}
|
Loading…
Reference in New Issue
Block a user