summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2012-10-01 14:46:24 +0100
committerNeil Roberts <neil@linux.intel.com>2012-10-01 14:46:24 +0100
commit4ec04507bfaf2d61707dccfb59ac7326962ee741 (patch)
tree6b2eee79a5a7ae25fde9243c5443cbe21e7ccf95
parent3653c5b10058a3f79900eb2644cb30f4cf1ca47e (diff)
downloadcogl-4ec04507bfaf2d61707dccfb59ac7326962ee741.tar.gz
Add a simple conformance test for alpha testing
This adds a simple test which sets an alpha test on a pipeline and then renders a texture. It then verifies that the transparent parts of the texture aren't drawn. This is currently failing with the GL3 driver because GL3 requires the alpha test to be implemented in GLSL but the generated alpha test uniform is only updated for the GLES2 driver. Reviewed-by: Robert Bragg <robert@linux.intel.com>
-rw-r--r--tests/conform/Makefile.am1
-rw-r--r--tests/conform/test-alpha-test.c74
-rw-r--r--tests/conform/test-conform-main.c2
3 files changed, 77 insertions, 0 deletions
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 8eeffd0b..eab0b94e 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -56,6 +56,7 @@ test_sources = \
test-gles2-context.c \
test-euler-quaternion.c \
test-layer-remove.c \
+ test-alpha-test.c \
$(NULL)
test_conformance_SOURCES = $(common_sources) $(test_sources)
diff --git a/tests/conform/test-alpha-test.c b/tests/conform/test-alpha-test.c
new file mode 100644
index 00000000..285118b0
--- /dev/null
+++ b/tests/conform/test-alpha-test.c
@@ -0,0 +1,74 @@
+#include <cogl/cogl.h>
+#include <string.h>
+
+#include "test-utils.h"
+
+static CoglTexture2D *
+create_texture (CoglContext *context)
+{
+ static const uint8_t data[] =
+ {
+ 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xfa, 0x00, 0xfa
+ };
+
+ return cogl_texture_2d_new_from_data (context,
+ 2, 1, /* width/height */
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+ COGL_PIXEL_FORMAT_ANY,
+ 4, /* rowstride */
+ data,
+ NULL /* error */);
+}
+
+void
+test_alpha_test (void)
+{
+ CoglTexture *tex = COGL_TEXTURE (create_texture (test_ctx));
+ CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
+ int fb_width = cogl_framebuffer_get_width (test_fb);
+ int fb_height = cogl_framebuffer_get_height (test_fb);
+ CoglColor clear_color;
+
+ cogl_pipeline_set_layer_texture (pipeline, 0, tex);
+ cogl_pipeline_set_layer_filters (pipeline, 0,
+ COGL_PIPELINE_FILTER_NEAREST,
+ COGL_PIPELINE_FILTER_NEAREST);
+ cogl_pipeline_set_alpha_test_function (pipeline,
+ COGL_PIPELINE_ALPHA_FUNC_GEQUAL,
+ 254 / 255.0f /* alpha reference */);
+
+ cogl_color_init_from_4ub (&clear_color, 0x00, 0x00, 0xff, 0xff);
+ cogl_framebuffer_clear (test_fb,
+ COGL_BUFFER_BIT_COLOR,
+ &clear_color);
+
+ cogl_framebuffer_draw_rectangle (test_fb,
+ pipeline,
+ -1, -1,
+ 1, 1);
+
+ cogl_object_unref (pipeline);
+ cogl_object_unref (tex);
+
+ /* The left side of the framebuffer should use the first pixel from
+ * the texture which is red */
+ test_utils_check_region (test_fb,
+ 2, 2,
+ fb_width / 2 - 4,
+ fb_height - 4,
+ 0xff0000ff);
+ /* The right side of the framebuffer should use the clear color
+ * because the second pixel from the texture is clipped from the
+ * alpha test */
+ test_utils_check_region (test_fb,
+ fb_width / 2 + 2,
+ 2,
+ fb_width / 2 - 4,
+ fb_height - 4,
+ 0x0000ffff);
+
+ if (cogl_test_verbose ())
+ g_print ("OK\n");
+}
+
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index 74756850..df9d2a5a 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -100,6 +100,8 @@ main (int argc, char **argv)
ADD_TEST (test_version, 0);
+ ADD_TEST (test_alpha_test, 0);
+
UNPORTED_TEST (test_viewport);
ADD_TEST (test_gles2_context, TEST_REQUIREMENT_GLES2_CONTEXT);