diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-05-09 23:02:30 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-05-09 23:02:30 -0400 |
commit | 5c10f2b4cda25d3c6897216856298cdeca66eb6a (patch) | |
tree | d26b0f3afc4967243c43d27fdd506305cb108d35 | |
parent | ba6a618d44720cfaca7d80cad77431ac756a8b2f (diff) | |
download | gtk+-5c10f2b4cda25d3c6897216856298cdeca66eb6a.tar.gz |
Improve coverage for half-float fallbacks
-rw-r--r-- | testsuite/gsk/half-float.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/testsuite/gsk/half-float.c b/testsuite/gsk/half-float.c index 5f74072a84..3b06d7df22 100644 --- a/testsuite/gsk/half-float.c +++ b/testsuite/gsk/half-float.c @@ -32,6 +32,36 @@ test_constants (void) } } +static void +test_constants_c (void) +{ + struct { + float f; + guint16 h; + } tests[] = { + { 0.0, FP16_ZERO }, + { 1.0, FP16_ONE }, + { -1.0, FP16_MINUS_ONE }, + }; + + for (int i = 0; i < G_N_ELEMENTS (tests); i++) + { + float f[4]; + guint16 h[4]; + + memset (f, 0, sizeof (f)); + f[0] = tests[i].f; + float_to_half4_c (f, h); + g_assert_cmpuint (h[0], ==, tests[i].h); + + + memset (h, 0, sizeof (h)); + h[0] = tests[i].h; + half_to_float4_c (h, f); + g_assert_cmpfloat (f[0], ==, tests[i].f); + } +} + static float random_representable_float (void) { @@ -69,6 +99,26 @@ test_roundtrip (void) } } +static void +test_roundtrip_c (void) +{ + for (int i = 0; i < 100; i++) + { + float f[4]; + float f2[4]; + guint16 h[4]; + + f2[0] = random_representable_float (); + memset (f, 0, sizeof (f)); + f[0] = f2[0]; + + float_to_half4_c (f, h); + half_to_float4_c (h, f2); + + g_assert_cmpfloat (f[0], ==, f2[0]); + } +} + /* Test that the array version work as expected, * in particular with unaligned boundaries. */ @@ -95,6 +145,29 @@ test_many (void) } } +static void +test_many_c (void) +{ + for (int i = 0; i < 100; i++) + { + int size = g_random_int_range (100, 200); + int offset = g_random_int_range (0, 20); + + guint16 *h = g_new0 (guint16, size); + float *f = g_new0 (float, size); + float *f2 = g_new0 (float, size); + + for (int j = offset; j < size; j++) + f[j] = random_representable_float (); + + float_to_half_c (f + offset, h + offset, size - offset); + half_to_float_c (h + offset, f2 + offset, size - offset); + + for (int j = offset; j < size; j++) + g_assert_cmpfloat (f[j], ==, f2[j]); + } +} + int main (int argc, char *argv[]) { @@ -103,6 +176,9 @@ main (int argc, char *argv[]) g_test_add_func ("/half-float/constants", test_constants); g_test_add_func ("/half-float/roundtrip", test_roundtrip); g_test_add_func ("/half-float/many", test_many); + g_test_add_func ("/half-float/constants/c", test_constants_c); + g_test_add_func ("/half-float/roundtrip/c", test_roundtrip_c); + g_test_add_func ("/half-float/many/c", test_many_c); return g_test_run (); } |