xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/tests/test-packing.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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