1
0
Fork 0

Add a conformance test for removing a pipeline layer

The test creates a pipeline with two layers which add two different
color constants together and then tries various combinations of
removing the layers and checks that it gets the right color.

Currently this is failing if a pipeline is copied and then a layer is
removed from the copy.

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

(cherry picked from commit 844440a5cee5907c4d61e995804534ac0613bb0f)
This commit is contained in:
Neil Roberts 2012-05-24 12:54:43 +01:00 committed by Robert Bragg
parent 17c818a9a7
commit 2e50693821
3 changed files with 147 additions and 0 deletions

View file

@ -56,6 +56,7 @@ test_sources = \
test-version.c \
test-gles2-context.c \
test-euler-quaternion.c \
test-layer-remove.c \
$(NULL)
test_conformance_SOURCES = $(common_sources) $(test_sources)

View file

@ -59,6 +59,7 @@ main (int argc, char **argv)
ADD_TEST (test_depth_test, 0);
ADD_TEST (test_color_mask, 0);
ADD_TEST (test_backface_culling, TEST_REQUIREMENT_NPOT);
ADD_TEST (test_layer_remove, TEST_KNOWN_FAILURE);
ADD_TEST (test_sparse_pipeline, 0);

View file

@ -0,0 +1,145 @@
#include <cogl/cogl.h>
#include "test-utils.h"
#define TEST_SQUARE_SIZE 10
static CoglPipeline *
create_two_layer_pipeline (void)
{
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
CoglColor color;
/* The pipeline is initially black */
cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);
/* The first layer adds a full red component */
cogl_color_init_from_4ub (&color, 255, 0, 0, 255);
cogl_pipeline_set_layer_combine_constant (pipeline, 0, &color);
cogl_pipeline_set_layer_combine (pipeline,
0, /* layer_num */
"RGBA=ADD(PREVIOUS,CONSTANT)",
NULL);
/* The second layer adds a full green component */
cogl_color_init_from_4ub (&color, 0, 255, 0, 255);
cogl_pipeline_set_layer_combine_constant (pipeline, 1, &color);
cogl_pipeline_set_layer_combine (pipeline,
1, /* layer_num */
"RGBA=ADD(PREVIOUS,CONSTANT)",
NULL);
return pipeline;
}
static void
test_color (CoglPipeline *pipeline,
uint32_t color,
int pos)
{
cogl_framebuffer_draw_rectangle (fb,
pipeline,
pos * TEST_SQUARE_SIZE,
0,
pos * TEST_SQUARE_SIZE + TEST_SQUARE_SIZE,
TEST_SQUARE_SIZE);
test_utils_check_pixel (fb,
pos * TEST_SQUARE_SIZE + TEST_SQUARE_SIZE / 2,
TEST_SQUARE_SIZE / 2,
color);
}
void
test_layer_remove (void)
{
CoglPipeline *pipeline0, *pipeline1;
CoglColor color;
int pos = 0;
cogl_framebuffer_orthographic (fb,
0, 0,
cogl_framebuffer_get_width (fb),
cogl_framebuffer_get_height (fb),
-1,
100);
/** TEST 1 **/
/* Basic sanity check that the pipeline combines the two colors
* together properly */
pipeline0 = create_two_layer_pipeline ();
test_color (pipeline0, 0xffff00ff, pos++);
cogl_object_unref (pipeline0);
/** TEST 2 **/
/* Check that we can remove the second layer */
pipeline0 = create_two_layer_pipeline ();
cogl_pipeline_remove_layer (pipeline0, 1);
test_color (pipeline0, 0xff0000ff, pos++);
cogl_object_unref (pipeline0);
/** TEST 3 **/
/* Check that we can remove the first layer */
pipeline0 = create_two_layer_pipeline ();
cogl_pipeline_remove_layer (pipeline0, 0);
test_color (pipeline0, 0x00ff00ff, pos++);
cogl_object_unref (pipeline0);
/** TEST 4 **/
/* Check that we can make a copy and remove a layer from the
* original pipeline */
pipeline0 = create_two_layer_pipeline ();
pipeline1 = cogl_pipeline_copy (pipeline0);
cogl_pipeline_remove_layer (pipeline0, 1);
test_color (pipeline0, 0xff0000ff, pos++);
test_color (pipeline1, 0xffff00ff, pos++);
cogl_object_unref (pipeline0);
cogl_object_unref (pipeline1);
/** TEST 5 **/
/* Check that we can make a copy and remove the second layer from the
* new pipeline */
pipeline0 = create_two_layer_pipeline ();
pipeline1 = cogl_pipeline_copy (pipeline0);
cogl_pipeline_remove_layer (pipeline1, 1);
test_color (pipeline0, 0xffff00ff, pos++);
test_color (pipeline1, 0xff0000ff, pos++);
cogl_object_unref (pipeline0);
cogl_object_unref (pipeline1);
/** TEST 6 **/
/* Check that we can make a copy and remove the first layer from the
* new pipeline */
pipeline0 = create_two_layer_pipeline ();
pipeline1 = cogl_pipeline_copy (pipeline0);
cogl_pipeline_remove_layer (pipeline1, 0);
test_color (pipeline0, 0xffff00ff, pos++);
test_color (pipeline1, 0x00ff00ff, pos++);
cogl_object_unref (pipeline0);
cogl_object_unref (pipeline1);
/** TEST 7 **/
/* Check that we can modify a layer in a child pipeline */
pipeline0 = create_two_layer_pipeline ();
pipeline1 = cogl_pipeline_copy (pipeline0);
cogl_color_init_from_4ub (&color, 0, 0, 255, 255);
cogl_pipeline_set_layer_combine_constant (pipeline1, 0, &color);
test_color (pipeline0, 0xffff00ff, pos++);
test_color (pipeline1, 0x00ffffff, pos++);
cogl_object_unref (pipeline0);
cogl_object_unref (pipeline1);
/** TEST 8 **/
/* Check that we can modify a layer in a child pipeline but then remove it */
pipeline0 = create_two_layer_pipeline ();
pipeline1 = cogl_pipeline_copy (pipeline0);
cogl_color_init_from_4ub (&color, 0, 0, 255, 255);
cogl_pipeline_set_layer_combine_constant (pipeline1, 0, &color);
cogl_pipeline_remove_layer (pipeline1, 0);
test_color (pipeline0, 0xffff00ff, pos++);
test_color (pipeline1, 0x00ff00ff, pos++);
cogl_object_unref (pipeline0);
cogl_object_unref (pipeline1);
if (cogl_test_verbose ())
g_print ("OK\n");
}