diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am index 4c9d17e33..3e1bfbb97 100644 --- a/tests/conform/Makefile.am +++ b/tests/conform/Makefile.am @@ -57,6 +57,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 000000000..7779ae0df --- /dev/null +++ b/tests/conform/test-alpha-test.c @@ -0,0 +1,74 @@ +#include +#include + +#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 (ctx)); + CoglPipeline *pipeline = cogl_pipeline_new (ctx); + int fb_width = cogl_framebuffer_get_width (fb); + int fb_height = cogl_framebuffer_get_height (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 (fb, + COGL_BUFFER_BIT_COLOR, + &clear_color); + + cogl_framebuffer_draw_rectangle (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 (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 (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 747568503..df9d2a5ad 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);