From 806a2e5813b7367fbd74c57d266a20b139b7c675 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Mon, 18 Feb 2013 18:13:01 +0000 Subject: [PATCH] Add a test to check interleaving primitives and the journal This adds a conformance test which draws a rectangle using the journal in-between two rectangles drawn with primitives without changing any other state. Currently this is failing because the modelview matrix state is not correctly flushed. The journal also flushes in own clip state so the test additionally puts everything in a clip and verifies that that worked. This is not currently broken but we might as well test it. https://bugzilla.gnome.org/show_bug.cgi?id=693612 Reviewed-by: Robert Bragg (cherry picked from commit b703f9a1a98894a12021cbdd632e1d59214e612f) --- tests/conform/Makefile.am | 1 + tests/conform/test-conform-main.c | 2 + tests/conform/test-primitive-and-journal.c | 126 +++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 tests/conform/test-primitive-and-journal.c diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am index e6d267584..cb1f25ea3 100644 --- a/tests/conform/Makefile.am +++ b/tests/conform/Makefile.am @@ -63,6 +63,7 @@ test_sources = \ test-wrap-rectangle-textures.c \ test-texture-get-set-data.c \ test-framebuffer-get-bits.c \ + test-primitive-and-journal.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 c1000fd30..6acca93bd 100644 --- a/tests/conform/test-conform-main.c +++ b/tests/conform/test-conform-main.c @@ -116,6 +116,8 @@ main (int argc, char **argv) ADD_TEST (test_map_buffer_range, TEST_REQUIREMENT_MAP_WRITE, 0); + ADD_TEST (test_primitive_and_journal, 0, TEST_KNOWN_FAILURE); + UNPORTED_TEST (test_viewport); ADD_TEST (test_gles2_context, TEST_REQUIREMENT_GLES2_CONTEXT, 0); diff --git a/tests/conform/test-primitive-and-journal.c b/tests/conform/test-primitive-and-journal.c new file mode 100644 index 000000000..a69afe216 --- /dev/null +++ b/tests/conform/test-primitive-and-journal.c @@ -0,0 +1,126 @@ +#include + +#include "test-utils.h" + +typedef CoglVertexP2C4 Vertex; + +static void +setup_orthographic_modelview (void) +{ + CoglMatrix matrix; + int fb_width = cogl_framebuffer_get_width (test_fb); + int fb_height = cogl_framebuffer_get_height (test_fb); + + /* Set up a non-identity modelview matrix. When the journal is + * flushed it will usually flush the identity matrix. Using the + * non-default matrix ensures that we test that Cogl restores the + * matrix we asked for. The matrix sets up an orthographic transform + * in the modelview matrix */ + + cogl_matrix_init_identity (&matrix); + cogl_matrix_orthographic (&matrix, + 0.0f, 0.0f, /* x_1 y_1 */ + fb_width, + fb_height, + -1.0f, /* nearval */ + 1.0f /* farval */); + cogl_framebuffer_set_modelview_matrix (test_fb, &matrix); +} + +static void +create_primitives (CoglPrimitive *primitives[2]) +{ + static const Vertex vertex_data[8] = + { + /* triangle strip 1 */ + { 0, 0, 255, 0, 0, 255 }, + { 0, 100, 255, 0, 0, 255 }, + { 100, 0, 255, 0, 0, 255 }, + { 100, 100, 255, 0, 0, 255 }, + /* triangle strip 2 */ + { 200, 0, 0, 0, 255, 255 }, + { 200, 100, 0, 0, 255, 255 }, + { 300, 0, 0, 0, 255, 255 }, + { 300, 100, 0, 0, 255, 255 }, + }; + + primitives[0] = cogl_primitive_new_p2c4 (test_ctx, + COGL_VERTICES_MODE_TRIANGLE_STRIP, + G_N_ELEMENTS (vertex_data), + vertex_data); + cogl_primitive_set_n_vertices (primitives[0], 4); + + primitives[1] = cogl_primitive_copy (primitives[0]); + cogl_primitive_set_first_vertex (primitives[1], 4); + cogl_primitive_set_n_vertices (primitives[1], 4); +} + +static CoglPipeline * +create_pipeline (void) +{ + CoglPipeline *pipeline = cogl_pipeline_new (test_ctx); + + cogl_pipeline_set_color4ub (pipeline, 0, 255, 0, 255); + + return pipeline; +} + +void +test_primitive_and_journal (void) +{ + CoglPrimitive *primitives[2]; + CoglPipeline *pipeline; + + setup_orthographic_modelview (); + create_primitives (primitives); + pipeline = create_pipeline (); + + /* Set a clip to clip all three rectangles to just the bottom half. + * The journal flushes its own clip state so this verifies that the + * clip state is correctly restored for the second primitive. */ + cogl_framebuffer_push_rectangle_clip (test_fb, + 0, 50, 300, 100); + + cogl_framebuffer_draw_primitive (test_fb, + pipeline, + primitives[0]); + + /* Draw a rectangle using the journal in-between the two primitives. + * This should test that the journal gets flushed correctly and that + * the modelview matrix is restored. Half of the rectangle should be + * overriden by the second primitive */ + cogl_framebuffer_draw_rectangle (test_fb, + pipeline, + 100, 0, /* x1/y1 */ + 300, 100 /* x2/y2 */); + + cogl_framebuffer_draw_primitive (test_fb, + pipeline, + primitives[1]); + + /* Check the three rectangles */ + test_utils_check_region (test_fb, + 1, 51, + 98, 48, + 0xff0000ff); + test_utils_check_region (test_fb, + 101, 51, + 98, 48, + 0x00ff00ff); + test_utils_check_region (test_fb, + 201, 51, + 98, 48, + 0x0000ffff); + + /* Check that the top half of all of the rectangles was clipped */ + test_utils_check_region (test_fb, + 1, 1, + 298, 48, + 0x000000ff); + + cogl_framebuffer_pop_clip (test_fb); + + if (cogl_test_verbose ()) + g_print ("OK\n"); +} +