[cogl] Add a test to check interleaving primitives and the journal



commit b703f9a1a98894a12021cbdd632e1d59214e612f
Author: Neil Roberts <neil linux intel com>
Date:   Mon Feb 18 18:13:01 2013 +0000

    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>

 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(+), 0 deletions(-)
---
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 432021c..7ccb028 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -62,6 +62,7 @@ test_sources = \
        test-texture-get-set-data.c \
        test-texture-mipmap-get-set.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 167a39d..607157d 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -118,6 +118,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 0000000..a69afe2
--- /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");
+}
+


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]