[Cogl] [PATCH 1/5] Conformance test to check whether the pipeline cache holds textures
Robert Bragg
robert at sixbynine.org
Wed Apr 3 16:32:46 PDT 2013
This looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Tue, Mar 26, 2013 at 6:36 PM, Neil Roberts <neil at linux.intel.com> wrote:
> 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.
> ---
> tests/conform/Makefile.am | 1 +
> tests/conform/test-conform-main.c | 2 +
> tests/conform/test-pipeline-cache-unrefs-texture.c | 92 ++++++++++++++++++++++
> 3 files changed, 95 insertions(+)
> create mode 100644 tests/conform/test-pipeline-cache-unrefs-texture.c
>
> diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
> index 6650766..e810a0c 100644
> --- a/tests/conform/Makefile.am
> +++ b/tests/conform/Makefile.am
> @@ -64,6 +64,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)
> diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
> index 82d631e..2dd5655 100644
> --- a/tests/conform/test-conform-main.c
> +++ b/tests/conform/test-conform-main.c
> @@ -122,6 +122,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);
> diff --git a/tests/conform/test-pipeline-cache-unrefs-texture.c b/tests/conform/test-pipeline-cache-unrefs-texture.c
> new file mode 100644
> index 0000000..ccd02e7
> --- /dev/null
> +++ b/tests/conform/test-pipeline-cache-unrefs-texture.c
> @@ -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");
> +}
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list