[Cogl] [PATCH] tests: Adds journal micro benchmark
Robert Bragg
robert at sixbynine.org
Thu Apr 19 03:44:43 PDT 2012
From: Robert Bragg <robert at linux.intel.com>
This makes the test-cogl-perf test from clutter into a standalone Cogl
benchmark.
---
configure.ac | 1 +
tests/Makefile.am | 2 +-
tests/micro-perf/Makefile.am | 19 ++++
tests/micro-perf/test-journal.c | 203 +++++++++++++++++++++++++++++++++++++++
4 files changed, 224 insertions(+), 1 deletions(-)
create mode 100644 tests/micro-perf/Makefile.am
create mode 100644 tests/micro-perf/test-journal.c
diff --git a/configure.ac b/configure.ac
index aaba17e..8984351 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1137,6 +1137,7 @@ tests/Makefile
tests/conform/Makefile
tests/conform/config.env
tests/conform/test-launcher.sh
+tests/micro-perf/Makefile
tests/data/Makefile
po/Makefile.in
)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0eea904..82cde7b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = conform data
+SUBDIRS = conform micro-perf data
DIST_SUBDIRS = conform data
diff --git a/tests/micro-perf/Makefile.am b/tests/micro-perf/Makefile.am
new file mode 100644
index 0000000..90cd273
--- /dev/null
+++ b/tests/micro-perf/Makefile.am
@@ -0,0 +1,19 @@
+include $(top_srcdir)/build/autotools/Makefile.am.silent
+
+NULL =
+
+INCLUDES = \
+ -I$(top_srcdir)
+
+test_conformance_CPPFLAGS = \
+ -DCOGL_ENABLE_EXPERIMENTAL_API \
+ -DCOGL_DISABLE_DEPRECATED \
+ -DTESTS_DATADIR=\""$(top_srcdir)/tests/data"\"
+
+
+noinst_PROGRAMS = test-journal
+
+AM_CFLAGS = -g3 -O0 $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS)
+
+test_journal_SOURCES = test-journal.c
+test_journal_LDADD = $(COGL_DEP_LIBS) $(top_builddir)/cogl/libcogl2.la
diff --git a/tests/micro-perf/test-journal.c b/tests/micro-perf/test-journal.c
new file mode 100644
index 0000000..aaee9b5
--- /dev/null
+++ b/tests/micro-perf/test-journal.c
@@ -0,0 +1,203 @@
+#include <glib.h>
+#include <cogl/cogl.h>
+#include <math.h>
+
+#define FRAMEBUFFER_WIDTH 800
+#define FRAMEBUFFER_HEIGHT 600
+
+gboolean run_all = FALSE;
+
+typedef struct _Data
+{
+ CoglContext *ctx;
+ CoglFramebuffer *fb;
+ CoglPipeline *pipeline;
+ CoglPipeline *alpha_pipeline;
+ int current_test;
+ GTimer *timer;
+ int frame;
+} Data;
+
+static GOptionEntry entries[] = {
+ {
+ "run-all", 'a',
+ 0,
+ G_OPTION_ARG_NONE, &run_all,
+ "Run all tests", ""
+ },
+ { NULL }
+};
+
+typedef void (*TestCallback) (Data *data);
+
+static void
+test_rectangles (Data *data)
+{
+#define RECT_WIDTH 5
+#define RECT_HEIGHT 5
+ int x;
+ int y;
+
+ cogl_framebuffer_clear4f (data->fb, COGL_BUFFER_BIT_COLOR, 1, 1, 1, 1);
+
+ cogl_framebuffer_push_rectangle_clip (data->fb,
+ 10,
+ 10,
+ FRAMEBUFFER_WIDTH - 10,
+ FRAMEBUFFER_HEIGHT - 10);
+
+ /* Should the rectangles be randomly positioned/colored/rotated?
+ *
+ * It could be good to develop equivalent GL and Cairo tests so we can
+ * have a sanity check for our Cogl performance.
+ *
+ * The color should vary to check that we correctly batch color changes
+ * The use of alpha should vary so we have a variation of which rectangles
+ * require blending.
+ * Should this be a random variation?
+ * It could be good to experiment with focibly enabling blending for
+ * rectangles that don't technically need it for the sake of extending
+ * batching. E.g. if you a long run of interleved rectangles with every
+ * other rectangle needing blending then it may be worth enabling blending
+ * for all the rectangles to avoid the state changes.
+ * The modelview should change between rectangles to check the software
+ * transform codepath.
+ * Should we group some rectangles under the same modelview? Potentially
+ * we could avoid software transform for long runs of rectangles with the
+ * same modelview.
+ *
+ */
+ for (y = 0; y < FRAMEBUFFER_HEIGHT; y += RECT_HEIGHT)
+ {
+ for (x = 0; x < FRAMEBUFFER_WIDTH; x += RECT_WIDTH)
+ {
+ cogl_framebuffer_push_matrix (data->fb);
+ cogl_framebuffer_translate (data->fb, x, y, 0);
+ cogl_framebuffer_rotate (data->fb, 45, 0, 0, 1);
+
+ cogl_pipeline_set_color4f (data->pipeline,
+ 1,
+ (1.0f/FRAMEBUFFER_WIDTH)*y,
+ (1.0f/FRAMEBUFFER_HEIGHT)*x,
+ 1);
+ cogl_framebuffer_draw_rectangle (data->fb,
+ data->pipeline,
+ 0, 0, RECT_WIDTH, RECT_HEIGHT);
+
+ cogl_framebuffer_pop_matrix (data->fb);
+ }
+ }
+
+ for (y = 0; y < FRAMEBUFFER_HEIGHT; y += RECT_HEIGHT)
+ {
+ for (x = 0; x < FRAMEBUFFER_WIDTH; x += RECT_WIDTH)
+ {
+ cogl_framebuffer_push_matrix (data->fb);
+ cogl_framebuffer_translate (data->fb, x, y, 0);
+
+ cogl_pipeline_set_color4f (data->alpha_pipeline,
+ 1,
+ (1.0f/FRAMEBUFFER_WIDTH)*x,
+ (1.0f/FRAMEBUFFER_HEIGHT)*y,
+ (1.0f/FRAMEBUFFER_WIDTH)*x);
+ cogl_framebuffer_draw_rectangle (data->fb,
+ data->alpha_pipeline,
+ 0, 0, RECT_WIDTH, RECT_HEIGHT);
+
+ cogl_framebuffer_pop_matrix (data->fb);
+ }
+ }
+
+ cogl_framebuffer_pop_clip (data->fb);
+}
+
+static TestCallback tests[] =
+{
+ test_rectangles
+};
+
+static gboolean
+paint_cb (void *user_data)
+{
+ Data *data = user_data;
+ double elapsed;
+
+ data->frame++;
+
+ tests[data->current_test] (data);
+
+ cogl_onscreen_swap_buffers (COGL_ONSCREEN (data->fb));
+
+ elapsed = g_timer_elapsed (data->timer, NULL);
+ if (elapsed > 1.0)
+ {
+ g_print ("fps = %f\n", data->frame / elapsed);
+ g_timer_start (data->timer);
+ data->frame = 0;
+ }
+
+ /* If the driver can deliver swap complete events then we can remove
+ * the idle paint callback until we next get a swap complete event
+ * otherwise we keep the idle paint callback installed and simply
+ * paint as fast as the driver will allow... */
+ if (cogl_has_feature (data->ctx, COGL_FEATURE_ID_SWAP_BUFFERS_EVENT))
+ return FALSE; /* remove the callback */
+ else
+ return TRUE;
+}
+
+static void
+swap_complete_cb (CoglFramebuffer *framebuffer, void *user_data)
+{
+ g_idle_add (paint_cb, user_data);
+}
+
+int
+main (int argc, char **argv)
+{
+ Data data;
+ CoglOnscreen *onscreen;
+ GSource *cogl_source;
+ GMainLoop *loop;
+
+ data.ctx = cogl_context_new (NULL, NULL);
+
+ onscreen = cogl_onscreen_new (data.ctx,
+ FRAMEBUFFER_WIDTH, FRAMEBUFFER_HEIGHT);
+ cogl_onscreen_set_swap_throttled (onscreen, FALSE);
+ cogl_onscreen_show (onscreen);
+
+ data.fb = COGL_FRAMEBUFFER (onscreen);
+ cogl_framebuffer_orthographic (data.fb,
+ 0, 0,
+ FRAMEBUFFER_WIDTH, FRAMEBUFFER_HEIGHT,
+ -1,
+ 100);
+
+ data.pipeline = cogl_pipeline_new (data.ctx);
+ cogl_pipeline_set_color4f (data.pipeline, 1, 1, 1, 1);
+ data.alpha_pipeline = cogl_pipeline_new (data.ctx);
+ cogl_pipeline_set_color4f (data.alpha_pipeline, 1, 1, 1, 0.5);
+
+ cogl_source = cogl_glib_source_new (data.ctx, G_PRIORITY_DEFAULT);
+
+ g_source_attach (cogl_source, NULL);
+
+ if (cogl_has_feature (data.ctx, COGL_FEATURE_ID_SWAP_BUFFERS_EVENT))
+ cogl_onscreen_add_swap_buffers_callback (COGL_ONSCREEN (data.fb),
+ swap_complete_cb, &data);
+
+ g_idle_add (paint_cb, &data);
+
+ data.current_test = 0;
+
+ data.frame = 0;
+ data.timer = g_timer_new ();
+ g_timer_start (data.timer);
+
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
+
+ return 0;
+}
+
--
1.7.7.6
More information about the Cogl
mailing list