[Cogl] [PATCH] Add unit test to verify that modifying uniforms doesn't create chain

Robert Bragg robert at sixbynine.org
Mon Sep 2 09:43:47 PDT 2013


This looks good to land to me:

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
Robert

On Mon, Sep 2, 2013 at 3:30 PM, Neil Roberts <neil at linux.intel.com> wrote:
> The recommended usage model for rendering pipelines with minor changes
> is to make a copy of a base pipeline just before rendering and then
> modify that. The new pipeline can then be used as the base pipeline
> for the next paint. Currently this has a known problem when modifying
> uniform values in that Cogl won't prune the redundant ancestry and
> instead it will end up with an ever-growing chain of pipelines. This
> is particularly bad for something like CoglGST where it could also end
> up leaking textures for the video frames if the pipelines are used to
> render video.
>
> The patch adds a test case for that situation so that we won't forget
> about the problem. The test is maked as a known failure. Additionally
> the patch adds a similar test for setting the blend constant to
> constrast the test with some state that does work correctly.
> ---
>  cogl/cogl-pipeline-state.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 71 insertions(+)
>
> diff --git a/cogl/cogl-pipeline-state.c b/cogl/cogl-pipeline-state.c
> index b5e391b..131a09a 100644
> --- a/cogl/cogl-pipeline-state.c
> +++ b/cogl/cogl-pipeline-state.c
> @@ -38,6 +38,8 @@
>  #include "cogl-snippet-private.h"
>  #include "cogl-error-private.h"
>
> +#include <test-fixtures/test-unit.h>
> +
>  #include "string.h"
>
>  #ifndef GL_FUNC_ADD
> @@ -1614,3 +1616,72 @@ _cogl_pipeline_hash_fragment_snippets_state (CoglPipeline *authority,
>    _cogl_pipeline_snippet_list_hash (&authority->big_state->fragment_snippets,
>                                      &state->hash);
>  }
> +
> +UNIT_TEST (check_blend_constant_ancestry,
> +           0 /* no requirements */,
> +           0 /* no known failures */)
> +{
> +  CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
> +  CoglNode *node;
> +  int pipeline_length = 0;
> +  int i;
> +
> +  /* Repeatedly making a copy of a pipeline and changing the same
> +   * state (in this case the blend constant) shouldn't cause a long
> +   * chain of pipelines to be created because the redundant ancestry
> +   * should be pruned. */
> +
> +  for (i = 0; i < 20; i++)
> +    {
> +      CoglColor color = { i / 20.0f, 0.0f, 0.0f, 1.0f };
> +      CoglPipeline *tmp_pipeline;
> +
> +      tmp_pipeline = cogl_pipeline_copy (pipeline);
> +      cogl_object_unref (pipeline);
> +      pipeline = tmp_pipeline;
> +
> +      cogl_pipeline_set_blend_constant (pipeline, &color);
> +    }
> +
> +  for (node = (CoglNode *) pipeline; node; node = node->parent)
> +    pipeline_length++;
> +
> +  g_assert_cmpint (pipeline_length, <=, 2);
> +
> +  cogl_object_unref (pipeline);
> +}
> +
> +UNIT_TEST (check_uniform_ancestry,
> +           0 /* no requirements */,
> +           TEST_KNOWN_FAILURE)
> +{
> +  CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
> +  CoglNode *node;
> +  int pipeline_length = 0;
> +  int i;
> +
> +  /* Repeatedly making a copy of a pipeline and changing a uniform
> +   * shouldn't cause a long chain of pipelines to be created */
> +
> +  for (i = 0; i < 20; i++)
> +    {
> +      CoglPipeline *tmp_pipeline;
> +      int uniform_location;
> +
> +      tmp_pipeline = cogl_pipeline_copy (pipeline);
> +      cogl_object_unref (pipeline);
> +      pipeline = tmp_pipeline;
> +
> +      uniform_location =
> +        cogl_pipeline_get_uniform_location (pipeline, "a_uniform");
> +
> +      cogl_pipeline_set_uniform_1i (pipeline, uniform_location, i);
> +    }
> +
> +  for (node = (CoglNode *) pipeline; node; node = node->parent)
> +    pipeline_length++;
> +
> +  g_assert_cmpint (pipeline_length, <=, 2);
> +
> +  cogl_object_unref (pipeline);
> +}
> --
> 1.8.3.1
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list