summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2013-02-18 18:13:01 +0000
committerNeil Roberts <neil@linux.intel.com>2013-02-19 11:06:59 +0000
commit806a2e5813b7367fbd74c57d266a20b139b7c675 (patch)
tree34da0aa16b9ecc7fcc25ec70b37d10350e57346f /tests
parent217d13537cb3fbf85871f6290e297982fc5f6bae (diff)
downloadcogl-806a2e5813b7367fbd74c57d266a20b139b7c675.tar.gz
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 <robert@linux.intel.com> (cherry picked from commit b703f9a1a98894a12021cbdd632e1d59214e612f)
Diffstat (limited to 'tests')
-rw-r--r--tests/conform/Makefile.am1
-rw-r--r--tests/conform/test-conform-main.c2
-rw-r--r--tests/conform/test-primitive-and-journal.c126
3 files changed, 129 insertions, 0 deletions
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index e6d26758..cb1f25ea 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 c1000fd3..6acca93b 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 00000000..a69afe21
--- /dev/null
+++ b/tests/conform/test-primitive-and-journal.c
@@ -0,0 +1,126 @@
+#include <cogl/cogl.h>
+
+#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");
+}
+