[Cogl] [PATCH] Adds test-texture-mipmap-get-set test
Robert Bragg
robert at sixbynine.org
Mon Nov 26 15:47:22 PST 2012
From: Robert Bragg <robert at linux.intel.com>
This adds a conformance test to check that cogl_texture_set_region()
works when uploading to mipmap levels greater than 0.
---
tests/conform/Makefile.am | 1 +
tests/conform/test-conform-main.c | 1 +
tests/conform/test-texture-mipmap-get-set.c | 176 +++++++++++++++++++++++++++
3 files changed, 178 insertions(+), 0 deletions(-)
create mode 100644 tests/conform/test-texture-mipmap-get-set.c
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 2463d7d..d8536d0 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -59,6 +59,7 @@ test_sources = \
test-npot-texture.c \
test-alpha-textures.c \
test-texture-get-set-data.c \
+ test-texture-mipmap-get-set.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 1137683..87bc46c 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -73,6 +73,7 @@ main (int argc, char **argv)
ADD_TEST (test_wrap_modes, 0, 0);
UNPORTED_TEST (test_texture_pixmap_x11);
ADD_TEST (test_texture_get_set_data, 0, 0);
+ ADD_TEST (test_texture_mipmap_get_set, 0, 0);
ADD_TEST (test_atlas_migration, 0, 0);
ADD_TEST (test_read_texture_formats, 0, 0);
ADD_TEST (test_write_texture_formats, 0, 0);
diff --git a/tests/conform/test-texture-mipmap-get-set.c b/tests/conform/test-texture-mipmap-get-set.c
new file mode 100644
index 0000000..12d0f6b
--- /dev/null
+++ b/tests/conform/test-texture-mipmap-get-set.c
@@ -0,0 +1,176 @@
+#include <cogl/cogl.h>
+
+#include <string.h>
+
+#include "test-utils.h"
+
+#define TEXTURE_SIZE 128
+
+static CoglTexture *
+make_texture (void)
+{
+ uint8_t *p, *tex_data;
+ CoglTexture *tex;
+ int x, y;
+
+ p = tex_data = g_malloc (TEXTURE_SIZE * TEXTURE_SIZE * 4);
+ for (y = 0; y < TEXTURE_SIZE; y++)
+ {
+ for (x = 0; x < TEXTURE_SIZE; x++)
+ {
+ p[0] = 0xff;
+ p[1] = 0;
+ p[2] = 0;
+ p[3] = 0xff;
+ p += 4;
+ }
+ }
+
+ tex = cogl_texture_new_from_data (test_ctx,
+ TEXTURE_SIZE,
+ TEXTURE_SIZE,
+ COGL_TEXTURE_NO_ATLAS,
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+ COGL_PIXEL_FORMAT_ANY,
+ TEXTURE_SIZE * 4,
+ tex_data,
+ NULL); /* ignore errors */
+
+ cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (tex), FALSE);
+
+ g_free (tex_data);
+
+ return tex;
+}
+
+static void
+update_mipmap_levels (CoglTexture *tex)
+{
+ uint8_t *p, *tex_data;
+ int x, y;
+
+ p = tex_data = g_malloc ((TEXTURE_SIZE / 2) * (TEXTURE_SIZE / 2) * 4);
+
+ for (y = 0; y < TEXTURE_SIZE / 2; y++)
+ {
+ for (x = 0; x < TEXTURE_SIZE / 2; x++)
+ {
+ p[0] = 0;
+ p[1] = 0xff;
+ p[2] = 0;
+ p[3] = 0xff;
+ p += 4;
+ }
+ }
+
+ cogl_texture_set_region (tex,
+ TEXTURE_SIZE / 2,
+ TEXTURE_SIZE / 2,
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+ 0, /* auto rowstride */
+ tex_data,
+ 0, /* dest x */
+ 0, /* dest y */
+ 1, /* mipmap level */
+ NULL);
+ p = tex_data;
+ for (y = 0; y < TEXTURE_SIZE / 4; y++)
+ {
+ for (x = 0; x < TEXTURE_SIZE / 4; x++)
+ {
+ p[0] = 0;
+ p[1] = 0;
+ p[2] = 0xff;
+ p[3] = 0xff;
+ p += 4;
+ }
+ }
+
+ cogl_texture_set_region (tex,
+ TEXTURE_SIZE / 4,
+ TEXTURE_SIZE / 4,
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+ 0, /* auto rowstride */
+ tex_data,
+ 0, /* dest x */
+ 0, /* dest y */
+ 2, /* mipmap level */
+ NULL);
+ g_free (tex_data);
+}
+
+static void
+validate_results (void)
+{
+ test_utils_check_pixel (test_fb,
+ TEXTURE_SIZE / 2,
+ TEXTURE_SIZE / 2,
+ 0xff0000ff);
+ test_utils_check_pixel (test_fb,
+ TEXTURE_SIZE + TEXTURE_SIZE / 4,
+ TEXTURE_SIZE / 4,
+ 0x00ff00ff);
+ test_utils_check_pixel (test_fb,
+ TEXTURE_SIZE + TEXTURE_SIZE / 2 + TEXTURE_SIZE / 8,
+ TEXTURE_SIZE / 8,
+ 0x0000ffff);
+}
+
+static void
+paint (CoglTexture *texture)
+{
+ CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
+ int x = 0, y = 0, size = TEXTURE_SIZE;
+
+ cogl_pipeline_set_layer_texture (pipeline, 0, texture);
+ cogl_pipeline_set_layer_filters (pipeline, 0,
+ COGL_PIPELINE_FILTER_NEAREST_MIPMAP_NEAREST,
+ COGL_PIPELINE_FILTER_NEAREST);
+
+ cogl_framebuffer_draw_rectangle (test_fb,
+ pipeline,
+ x, y,
+ x + size,
+ y + size);
+
+ x += size;
+ size /= 2;
+ cogl_framebuffer_draw_rectangle (test_fb,
+ pipeline,
+ x, y,
+ x + size,
+ y + size);
+
+ x += size;
+ size /= 2;
+ cogl_framebuffer_draw_rectangle (test_fb,
+ pipeline,
+ x, y,
+ x + size,
+ y + size);
+
+ cogl_object_unref (pipeline);
+ cogl_object_unref (texture);
+}
+
+void
+test_texture_mipmap_get_set (void)
+{
+ CoglTexture *texture = make_texture ();
+
+ cogl_framebuffer_orthographic (test_fb,
+ 0, 0,
+ cogl_framebuffer_get_width (test_fb),
+ cogl_framebuffer_get_height (test_fb),
+ -1,
+ 100);
+
+ update_mipmap_levels (texture);
+ paint (texture);
+
+ validate_results ();
+
+ if (cogl_test_verbose ())
+ g_print ("OK\n");
+}
+
--
1.7.7.6
More information about the Cogl
mailing list