diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am index 63208b002..6b2d1ddc2 100644 --- a/tests/conform/Makefile.am +++ b/tests/conform/Makefile.am @@ -47,6 +47,7 @@ test_sources = \ test-offscreen.c \ test-primitive.c \ test-texture-3d.c \ + test-sparse-pipeline.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 f75f3eada..a732be688 100644 --- a/tests/conform/test-conform-main.c +++ b/tests/conform/test-conform-main.c @@ -142,6 +142,8 @@ main (int argc, char **argv) ADD_TEST ("/cogl", test_cogl_color_mask); ADD_TEST ("/cogl", test_cogl_backface_culling); + ADD_TEST ("/cogl/pipeline", test_cogl_sparse_pipeline); + UNPORTED_TEST ("/cogl/texture", test_cogl_npot_texture); UNPORTED_TEST ("/cogl/texture", test_cogl_multitexture); UNPORTED_TEST ("/cogl/texture", test_cogl_texture_mipmaps); diff --git a/tests/conform/test-sparse-pipeline.c b/tests/conform/test-sparse-pipeline.c new file mode 100644 index 000000000..433c0baa1 --- /dev/null +++ b/tests/conform/test-sparse-pipeline.c @@ -0,0 +1,89 @@ +#include +#include + +#include "test-utils.h" + +typedef struct _TestState +{ + CoglContext *context; + int fb_width; + int fb_height; + CoglFramebuffer *fb; +} TestState; + +static CoglTexture * +create_color_texture (CoglContext *context, + guint32 color) +{ + CoglTexture2D *tex_2d; + + color = GUINT32_TO_BE (color); + + tex_2d = cogl_texture_2d_new_from_data (context, + 1, 1, /* width/height */ + COGL_PIXEL_FORMAT_RGBA_8888_PRE, + COGL_PIXEL_FORMAT_RGBA_8888_PRE, + 4, /* rowstride */ + (guint8 *) &color, + NULL); + + return COGL_TEXTURE (tex_2d); +} + +static void +test_sparse_layer_combine (TestState *state) +{ + CoglPipeline *pipeline; + CoglTexture *tex1, *tex2; + + cogl_framebuffer_clear4f (state->fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1); + + /* This tests that the TEXTURE_* numbers used in the layer combine + string refer to the layer number rather than the unit numbers by + creating a pipeline with very large layer numbers. This should + end up being mapped to much smaller unit numbers */ + + tex1 = create_color_texture (state->context, 0xff0000ff); + tex2 = create_color_texture (state->context, 0x00ff00ff); + + pipeline = cogl_pipeline_new (); + + cogl_pipeline_set_layer_texture (pipeline, 50, tex1); + cogl_pipeline_set_layer_texture (pipeline, 100, tex2); + cogl_pipeline_set_layer_combine (pipeline, 200, + "RGBA = ADD(TEXTURE_50, TEXTURE_100)", + NULL); + + cogl_push_source (pipeline); + cogl_rectangle (-1, -1, 1, 1); + cogl_pop_source (); + + test_utils_check_pixel (2, 2, 0xffff00ff); + + cogl_object_unref (pipeline); + cogl_object_unref (tex1); + cogl_object_unref (tex2); +} + +void +test_cogl_sparse_pipeline (TestUtilsGTestFixture *fixture, + void *data) +{ + TestUtilsSharedState *shared_state = data; + TestState state; + + state.context = shared_state->ctx; + state.fb_width = cogl_framebuffer_get_width (shared_state->fb); + state.fb_height = cogl_framebuffer_get_height (shared_state->fb); + state.fb = shared_state->fb; + + test_sparse_layer_combine (&state); + + /* FIXME: This should have a lot more tests, for example testing + whether using an attribute with sparse texture coordinates will + work */ + + if (g_test_verbose ()) + g_print ("OK\n"); +} +