summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-05-09 23:02:30 -0400
committerMatthias Clasen <mclasen@redhat.com>2023-05-09 23:02:30 -0400
commit5c10f2b4cda25d3c6897216856298cdeca66eb6a (patch)
treed26b0f3afc4967243c43d27fdd506305cb108d35
parentba6a618d44720cfaca7d80cad77431ac756a8b2f (diff)
downloadgtk+-5c10f2b4cda25d3c6897216856298cdeca66eb6a.tar.gz
Improve coverage for half-float fallbacks
-rw-r--r--testsuite/gsk/half-float.c76
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 ();
}