[cogl] Port the pipeline-user-matrix conformance test from Clutter



commit 3d75bd35ba7e1046ab1a429688af72ba1dcb5572
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Oct 1 11:04:32 2011 +0200

    Port the pipeline-user-matrix conformance test from Clutter
    
    Reviewed-by: Robert Bragg <robert linux intel com>

 tests/conform/Makefile.am                 |    2 +-
 tests/conform/test-conform-main.c         |    2 +-
 tests/conform/test-pipeline-user-matrix.c |  122 ++++++++++++++---------------
 3 files changed, 61 insertions(+), 65 deletions(-)
---
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 98fbc83..8ce8038 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -14,7 +14,6 @@ unported_test_sources = \
 	test-blend-strings.c \
 	test-fixed.c \
 	test-materials.c \
-	test-pipeline-user-matrix.c \
 	test-viewport.c \
 	test-multitexture.c \
 	test-npot-texture.c \
@@ -43,6 +42,7 @@ test_sources = \
 	test-color-mask.c \
 	test-backface-culling.c \
 	test-just-vertex-shader.c \
+	test-pipeline-user-matrix.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 8cc107f..4908a47 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -133,7 +133,7 @@ main (int argc, char **argv)
   UNPORTED_TEST ("/cogl", test_cogl_object);
   UNPORTED_TEST ("/cogl", test_cogl_fixed);
   UNPORTED_TEST ("/cogl", test_cogl_materials);
-  UNPORTED_TEST ("/cogl", test_cogl_pipeline_user_matrix);
+  ADD_TEST ("/cogl", test_cogl_pipeline_user_matrix);
   UNPORTED_TEST ("/cogl", test_cogl_blend_strings);
   UNPORTED_TEST ("/cogl", test_cogl_premult);
   UNPORTED_TEST ("/cogl", test_cogl_readpixels);
diff --git a/tests/conform/test-pipeline-user-matrix.c b/tests/conform/test-pipeline-user-matrix.c
index 8e48fd2..daf9aef 100644
--- a/tests/conform/test-pipeline-user-matrix.c
+++ b/tests/conform/test-pipeline-user-matrix.c
@@ -1,12 +1,42 @@
-#include <clutter/clutter.h>
+#include <cogl/cogl.h>
+
 #include <string.h>
 
-#include "test-conform-common.h"
+#include "test-utils.h"
 
-static const ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
+typedef struct _TestState
+{
+  int width;
+  int height;
+} TestState;
 
 static void
-paint_cb (ClutterActor *stage)
+validate_result (TestState *state)
+{
+  guint32 *pixels, *p;
+  char *screen_pixel;
+  const char *intended_pixel = "#ffffff";
+
+  /* The textures are setup so that when added together with the
+     correct matrices then all of the pixels should be white. We can
+     verify this by reading back the entire stage */
+  pixels = g_malloc (state->width * state->height * 4);
+
+  cogl_read_pixels (0, 0, state->width, state->height,
+                    COGL_READ_PIXELS_COLOR_BUFFER,
+                    COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+                    (guint8 *)pixels);
+
+  for (p = pixels; p < pixels + state->width * state->height; p++)
+    {
+      screen_pixel = g_strdup_printf ("#%06x", GUINT32_FROM_BE (*p) >> 8);
+      g_assert_cmpstr (screen_pixel, ==, intended_pixel);
+      g_free (screen_pixel);
+    }
+}
+
+static void
+paint (TestState *state)
 {
   /* This texture is painted mirrored around the x-axis */
   guint8 data0[] = {
@@ -22,14 +52,21 @@ paint_cb (ClutterActor *stage)
     0xff, 0x00, 0xff, /* magenta -> becomes bottom right */
     0x00, 0xff, 0xff  /* cyan -> becomes bottom left */
   };
+  CoglColor bg;
   CoglHandle tex0, tex1;
   CoglPipeline *pipeline;
   CoglMatrix matrix;
-  int width, height;
-  guint8 *pixels, *p;
+  GError *error = NULL;
 
-  width = clutter_actor_get_width (stage);
-  height = clutter_actor_get_height (stage);
+  cogl_ortho (0, state->width, /* left, right */
+              state->height, 0, /* bottom, top */
+              -1, 100 /* z near, far */);
+
+  cogl_color_init_from_4ub (&bg, 0, 0, 0, 255);
+  cogl_clear (&bg, COGL_BUFFER_BIT_COLOR);
+
+  cogl_matrix_init_identity (&matrix);
+  cogl_set_modelview_matrix (&matrix);
 
   tex0 = cogl_texture_new_from_data (2, 2,
                                      COGL_TEXTURE_NO_ATLAS,
@@ -57,9 +94,13 @@ paint_cb (ClutterActor *stage)
                                    COGL_PIPELINE_FILTER_NEAREST);
 
   /* Set a combine mode so that the two textures get added together */
-  cogl_pipeline_set_layer_combine (pipeline, 1,
-                                   "RGBA=ADD(PREVIOUS, TEXTURE)",
-                                   NULL);
+  if (!cogl_pipeline_set_layer_combine (pipeline, 1,
+					"RGBA=ADD(PREVIOUS, TEXTURE)",
+					&error))
+    {
+      g_warning ("Error setting blend string: %s", error->message);
+      g_assert_not_reached ();
+    }
 
   /* Set a matrix on the first layer so that it will mirror about the y-axis */
   cogl_matrix_init_identity (&matrix);
@@ -74,70 +115,25 @@ paint_cb (ClutterActor *stage)
   cogl_pipeline_set_layer_matrix (pipeline, 1, &matrix);
 
   cogl_set_source (pipeline);
-  cogl_rectangle (0, 0, width, height);
+  cogl_rectangle (0, 0, state->width, state->height);
 
   cogl_handle_unref (tex1);
   cogl_handle_unref (tex0);
   cogl_object_unref (pipeline);
-
-  /* The textures are setup so that when added together with the
-     correct matrices then all of the pixels should be white. We can
-     verify this by reading back the entire stage */
-  pixels = g_malloc (width * height * 4);
-
-  cogl_read_pixels (0, 0, width, height,
-                    COGL_READ_PIXELS_COLOR_BUFFER,
-                    COGL_PIXEL_FORMAT_RGBA_8888_PRE,
-                    pixels);
-
-  for (p = pixels + width * height * 4; p > pixels;)
-    {
-      p -= 4;
-      g_assert_cmpint (p[0], ==, 0xff);
-      g_assert_cmpint (p[1], ==, 0xff);
-      g_assert_cmpint (p[2], ==, 0xff);
-    }
-
-  g_free (pixels);
-
-  clutter_main_quit ();
-}
-
-static gboolean
-queue_redraw (gpointer stage)
-{
-  clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
-
-  return TRUE;
 }
 
 void
 test_cogl_pipeline_user_matrix (TestUtilsGTestFixture *fixture,
                                 void *data)
 {
-  ClutterActor *stage;
-  unsigned int idle_source;
-  unsigned int paint_handler;
-
-  stage = clutter_stage_get_default ();
-
-  clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
-
-  /* We force continuous redrawing of the stage, since we need to skip
-   * the first few frames, and we wont be doing anything else that
-   * will trigger redrawing. */
-  idle_source = g_idle_add (queue_redraw, stage);
-
-  paint_handler = g_signal_connect_after (stage, "paint",
-                                          G_CALLBACK (paint_cb),
-                                          NULL);
-
-  clutter_actor_show (stage);
+  TestUtilsSharedState *shared_state = data;
+  TestState state;
 
-  clutter_main ();
+  state.width = cogl_framebuffer_get_width (shared_state->fb);
+  state.height = cogl_framebuffer_get_height (shared_state->fb);
 
-  g_source_remove (idle_source);
-  g_signal_handler_disconnect (stage, paint_handler);
+  paint (&state);
+  validate_result (&state);
 
   if (g_test_verbose ())
     g_print ("OK\n");



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