diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am index b0f2a8829..54ec2b32f 100644 --- a/tests/conform/Makefile.am +++ b/tests/conform/Makefile.am @@ -48,7 +48,7 @@ test_sources = \ test-primitive.c \ test-texture-3d.c \ test-sparse-pipeline.c \ - test-read-alpha-texture.c \ + test-read-texture-formats.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 85eb48960..b4e8d20f4 100644 --- a/tests/conform/test-conform-main.c +++ b/tests/conform/test-conform-main.c @@ -81,9 +81,7 @@ main (int argc, char **argv) UNPORTED_TEST (test_cogl_texture_pixmap_x11); UNPORTED_TEST (test_cogl_texture_get_set_data); UNPORTED_TEST (test_cogl_atlas_migration); - /* This doesn't currently work on GLES because there is no fallback - conversion to/from alpha-only */ - ADD_TEST (test_cogl_read_alpha_texture, TEST_REQUIREMENT_GL); + ADD_TEST (test_cogl_read_texture_formats, 0); UNPORTED_TEST (test_cogl_vertex_buffer_contiguous); UNPORTED_TEST (test_cogl_vertex_buffer_interleved); diff --git a/tests/conform/test-read-alpha-texture.c b/tests/conform/test-read-alpha-texture.c deleted file mode 100644 index 6b9ca5894..000000000 --- a/tests/conform/test-read-alpha-texture.c +++ /dev/null @@ -1,42 +0,0 @@ -#include - -#include "test-utils.h" - -/* - * This tests reading back an RGBA texture in alpha-only format. - * This test just exists because I accidentally broke it and - * gnome-shell is doing it. - * - * https://bugzilla.gnome.org/show_bug.cgi?id=671016 - */ - -static const guint8 tex_data[4] = { 0x12, 0x34, 0x56, 0x78 }; - -void -test_cogl_read_alpha_texture (TestUtilsGTestFixture *fixture, - void *data) -{ - TestUtilsSharedState *shared_state = data; - CoglTexture2D *tex_2d; - guint8 alpha_value; - - tex_2d = cogl_texture_2d_new_from_data (shared_state->ctx, - 1, 1, /* width / height */ - COGL_PIXEL_FORMAT_RGBA_8888_PRE, - COGL_PIXEL_FORMAT_RGBA_8888_PRE, - 4, /* rowstride */ - tex_data, - NULL); - - cogl_texture_get_data (COGL_TEXTURE (tex_2d), - COGL_PIXEL_FORMAT_A_8, - 1, /* rowstride */ - &alpha_value); - - cogl_object_unref (tex_2d); - - g_assert_cmpint (alpha_value, ==, 0x78); - - if (g_test_verbose ()) - g_print ("OK\n"); -} diff --git a/tests/conform/test-read-texture-formats.c b/tests/conform/test-read-texture-formats.c new file mode 100644 index 000000000..fe7c26295 --- /dev/null +++ b/tests/conform/test-read-texture-formats.c @@ -0,0 +1,203 @@ +#include +#include + +#include "test-utils.h" + +/* + * This tests reading back an RGBA texture in all of the available + * pixel formats + */ + +static const guint8 tex_data[4] = { 0x12, 0x34, 0x56, 0x78 }; + +static void +test_read_byte (CoglTexture2D *tex_2d, + CoglPixelFormat format, + guint8 expected_byte) +{ + guint8 received_byte; + + cogl_texture_get_data (COGL_TEXTURE (tex_2d), + format, + 1, /* rowstride */ + &received_byte); + + g_assert_cmpint (expected_byte, ==, received_byte); +} + +static void +test_read_short (CoglTexture2D *tex_2d, + CoglPixelFormat format, + ...) +{ + va_list ap; + int bits; + guint16 received_value; + guint16 expected_value = 0; + char *received_value_str; + char *expected_value_str; + int bits_sum = 0; + + cogl_texture_get_data (COGL_TEXTURE (tex_2d), + format, + 2, /* rowstride */ + (guint8 *) &received_value); + + va_start (ap, format); + + /* Convert the va args into a single 16-bit expected value */ + while ((bits = va_arg (ap, int)) != -1) + { + int value = (va_arg (ap, int) * ((1 << bits) - 1) + 128) / 255; + + bits_sum += bits; + + expected_value |= value << (16 - bits_sum); + } + + va_end (ap); + + received_value_str = g_strdup_printf ("0x%04x", received_value); + expected_value_str = g_strdup_printf ("0x%04x", expected_value); + g_assert_cmpstr (received_value_str, ==, expected_value_str); + g_free (received_value_str); + g_free (expected_value_str); +} + +static void +test_read_888 (CoglTexture2D *tex_2d, + CoglPixelFormat format, + guint32 expected_pixel) +{ + guint8 pixel[4]; + + cogl_texture_get_data (COGL_TEXTURE (tex_2d), + format, + 4, /* rowstride */ + pixel); + + test_utils_compare_pixel (pixel, expected_pixel); +} + +static void +test_read_8888 (CoglTexture2D *tex_2d, + CoglPixelFormat format, + guint32 expected_pixel) +{ + guint32 received_pixel; + char *received_value_str; + char *expected_value_str; + + cogl_texture_get_data (COGL_TEXTURE (tex_2d), + format, + 4, /* rowstride */ + (guint8 *) &received_pixel); + + received_pixel = GUINT32_FROM_BE (received_pixel); + + received_value_str = g_strdup_printf ("0x%08x", received_pixel); + expected_value_str = g_strdup_printf ("0x%08x", expected_pixel); + g_assert_cmpstr (received_value_str, ==, expected_value_str); + g_free (received_value_str); + g_free (expected_value_str); +} + +static void +test_read_int (CoglTexture2D *tex_2d, + CoglPixelFormat format, + ...) +{ + va_list ap; + int bits; + guint32 received_value; + guint32 expected_value = 0; + char *received_value_str; + char *expected_value_str; + int bits_sum = 0; + + cogl_texture_get_data (COGL_TEXTURE (tex_2d), + format, + 4, /* rowstride */ + (guint8 *) &received_value); + + va_start (ap, format); + + /* Convert the va args into a single 32-bit expected value */ + while ((bits = va_arg (ap, int)) != -1) + { + guint32 value = (va_arg (ap, int) * ((1 << bits) - 1) + 128) / 255; + + bits_sum += bits; + + expected_value |= value << (32 - bits_sum); + } + + va_end (ap); + + received_value_str = g_strdup_printf ("0x%08x", received_value); + expected_value_str = g_strdup_printf ("0x%08x", expected_value); + g_assert_cmpstr (received_value_str, ==, expected_value_str); + g_free (received_value_str); + g_free (expected_value_str); +} + +void +test_cogl_read_texture_formats (TestUtilsGTestFixture *fixture, + void *data) +{ + TestUtilsSharedState *shared_state = data; + CoglTexture2D *tex_2d; + + tex_2d = cogl_texture_2d_new_from_data (shared_state->ctx, + 1, 1, /* width / height */ + COGL_PIXEL_FORMAT_RGBA_8888_PRE, + COGL_PIXEL_FORMAT_RGBA_8888_PRE, + 4, /* rowstride */ + tex_data, + NULL); + + test_read_byte (tex_2d, COGL_PIXEL_FORMAT_A_8, 0x78); + +#if 0 + /* I'm not sure what's the right value to put here because Nvidia + and Mesa seem to behave differently so one of them must be + wrong. */ + test_read_byte (tex_2d, COGL_PIXEL_FORMAT_G_8, 0x9c); +#endif + + test_read_short (tex_2d, COGL_PIXEL_FORMAT_RGB_565, + 5, 0x12, 6, 0x34, 5, 0x56, + -1); + test_read_short (tex_2d, COGL_PIXEL_FORMAT_RGBA_4444_PRE, + 4, 0x12, 4, 0x34, 4, 0x56, 4, 0x78, + -1); + test_read_short (tex_2d, COGL_PIXEL_FORMAT_RGBA_5551_PRE, + 5, 0x12, 5, 0x34, 5, 0x56, 1, 0x78, + -1); + + test_read_888 (tex_2d, COGL_PIXEL_FORMAT_RGB_888, 0x123456ff); + test_read_888 (tex_2d, COGL_PIXEL_FORMAT_BGR_888, 0x563412ff); + + test_read_8888 (tex_2d, COGL_PIXEL_FORMAT_RGBA_8888_PRE, 0x12345678); + test_read_8888 (tex_2d, COGL_PIXEL_FORMAT_BGRA_8888_PRE, 0x56341278); + test_read_8888 (tex_2d, COGL_PIXEL_FORMAT_ARGB_8888_PRE, 0x78123456); + test_read_8888 (tex_2d, COGL_PIXEL_FORMAT_ABGR_8888_PRE, 0x78563412); + + test_read_int (tex_2d, COGL_PIXEL_FORMAT_RGBA_1010102_PRE, + 10, 0x12, 10, 0x34, 10, 0x56, 2, 0x78, + -1); + test_read_int (tex_2d, COGL_PIXEL_FORMAT_BGRA_1010102_PRE, + 10, 0x56, 10, 0x34, 10, 0x12, 2, 0x78, + -1); + test_read_int (tex_2d, COGL_PIXEL_FORMAT_ARGB_2101010_PRE, + 2, 0x78, 10, 0x12, 10, 0x34, 10, 0x56, + -1); + test_read_int (tex_2d, COGL_PIXEL_FORMAT_ABGR_2101010_PRE, + 2, 0x78, 10, 0x56, 10, 0x34, 10, 0x12, + -1); + + cogl_object_unref (tex_2d); + + if (g_test_verbose ()) + g_print ("OK\n"); +}