1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2022 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker const struct {
11*61046927SAndroid Build Coastguard Worker float f;
12*61046927SAndroid Build Coastguard Worker uint16_t encoded;
13*61046927SAndroid Build Coastguard Worker bool inexact;
14*61046927SAndroid Build Coastguard Worker } lod_cases[] = {
15*61046927SAndroid Build Coastguard Worker /* Lower bound clamp */
16*61046927SAndroid Build Coastguard Worker {-INFINITY, 0x00, true},
17*61046927SAndroid Build Coastguard Worker {-0.1, 0x00, true},
18*61046927SAndroid Build Coastguard Worker {-0.0, 0x00, true},
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Worker /* Exact bounds */
21*61046927SAndroid Build Coastguard Worker {0.0, 0x00},
22*61046927SAndroid Build Coastguard Worker {14.0, 0x380},
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker /* Upper bound clamp */
25*61046927SAndroid Build Coastguard Worker {14.1, 0x380, true},
26*61046927SAndroid Build Coastguard Worker {18.1, 0x380, true},
27*61046927SAndroid Build Coastguard Worker {INFINITY, 0x380, true},
28*61046927SAndroid Build Coastguard Worker };
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker const struct {
31*61046927SAndroid Build Coastguard Worker uint32_t group_size;
32*61046927SAndroid Build Coastguard Worker uint32_t length;
33*61046927SAndroid Build Coastguard Worker uint32_t value;
34*61046927SAndroid Build Coastguard Worker uint32_t encoded;
35*61046927SAndroid Build Coastguard Worker } group_cases[] = {
36*61046927SAndroid Build Coastguard Worker /* Groups of 16 in a 4-bit word */
37*61046927SAndroid Build Coastguard Worker {16, 4, 0, 0x1}, {16, 4, 1, 0x1}, {16, 4, 16, 0x1}, {16, 4, 17, 0x2},
38*61046927SAndroid Build Coastguard Worker {16, 4, 31, 0x2}, {16, 4, 32, 0x2}, {16, 4, 33, 0x3}, {16, 4, 239, 0xF},
39*61046927SAndroid Build Coastguard Worker {16, 4, 240, 0xF}, {16, 4, 241, 0x0}, {16, 4, 255, 0x0}, {16, 4, 256, 0x0},
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker
TEST(LODClamp,Encode)42*61046927SAndroid Build Coastguard Worker TEST(LODClamp, Encode)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(lod_cases); ++i)
45*61046927SAndroid Build Coastguard Worker ASSERT_EQ(__gen_pack_lod(lod_cases[i].f, 0, 9), lod_cases[i].encoded);
46*61046927SAndroid Build Coastguard Worker }
47*61046927SAndroid Build Coastguard Worker
TEST(LODClamp,Decode)48*61046927SAndroid Build Coastguard Worker TEST(LODClamp, Decode)
49*61046927SAndroid Build Coastguard Worker {
50*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(lod_cases); ++i) {
51*61046927SAndroid Build Coastguard Worker if (lod_cases[i].inexact)
52*61046927SAndroid Build Coastguard Worker continue;
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker uint32_t cl;
55*61046927SAndroid Build Coastguard Worker memcpy(&cl, &lod_cases[i].encoded, sizeof(lod_cases[i].encoded));
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker ASSERT_EQ(__gen_unpack_lod(&cl, 0, 10), lod_cases[i].f);
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker
TEST(Groups,Encode)61*61046927SAndroid Build Coastguard Worker TEST(Groups, Encode)
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(group_cases); ++i) {
64*61046927SAndroid Build Coastguard Worker ASSERT_EQ(__gen_to_groups(group_cases[i].value, group_cases[i].group_size,
65*61046927SAndroid Build Coastguard Worker group_cases[i].length),
66*61046927SAndroid Build Coastguard Worker group_cases[i].encoded);
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker
TEST(Groups,Decode)70*61046927SAndroid Build Coastguard Worker TEST(Groups, Decode)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(group_cases); ++i) {
73*61046927SAndroid Build Coastguard Worker unsigned expected =
74*61046927SAndroid Build Coastguard Worker ALIGN_POT(group_cases[i].value, group_cases[i].group_size);
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker /* Clamp to minimum encodable */
77*61046927SAndroid Build Coastguard Worker if (group_cases[i].value == 0)
78*61046927SAndroid Build Coastguard Worker expected = group_cases[i].group_size;
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker ASSERT_EQ(
81*61046927SAndroid Build Coastguard Worker __gen_from_groups(group_cases[i].encoded, group_cases[i].group_size,
82*61046927SAndroid Build Coastguard Worker group_cases[i].length),
83*61046927SAndroid Build Coastguard Worker expected);
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker }
86