xref: /aosp_15_r20/external/mesa3d/src/asahi/layout/tests/test-generated.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Asahi Lina
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
8*61046927SAndroid Build Coastguard Worker #include "layout.h"
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker /*
11*61046927SAndroid Build Coastguard Worker  * Test texture layouts with test cases extracted from texture structure dumps
12*61046927SAndroid Build Coastguard Worker  * produced by Metal.
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The extracted test cases are stored in separate files which do not get
15*61046927SAndroid Build Coastguard Worker  * clang-formatted. They do still get parsed as C code, though. They may be
16*61046927SAndroid Build Coastguard Worker  * sorted with `sort -t"," -k1,1 -k2,5n | uniq`.
17*61046927SAndroid Build Coastguard Worker  */
18*61046927SAndroid Build Coastguard Worker struct sizetest {
19*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
20*61046927SAndroid Build Coastguard Worker    uint32_t width, height, depth;
21*61046927SAndroid Build Coastguard Worker    uint8_t levels;
22*61046927SAndroid Build Coastguard Worker    uint32_t size;
23*61046927SAndroid Build Coastguard Worker };
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker struct miptest {
26*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
27*61046927SAndroid Build Coastguard Worker    uint32_t width, height;
28*61046927SAndroid Build Coastguard Worker    uint8_t levels;
29*61046927SAndroid Build Coastguard Worker    uint32_t offsets[16];
30*61046927SAndroid Build Coastguard Worker };
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker struct msaatest {
33*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
34*61046927SAndroid Build Coastguard Worker    uint32_t width, height, depth;
35*61046927SAndroid Build Coastguard Worker    uint8_t levels;
36*61046927SAndroid Build Coastguard Worker    uint8_t samples;
37*61046927SAndroid Build Coastguard Worker    bool is_compressed;
38*61046927SAndroid Build Coastguard Worker    uint32_t meta_offset;
39*61046927SAndroid Build Coastguard Worker    uint32_t size;
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker static struct sizetest comptests[] = {
43*61046927SAndroid Build Coastguard Worker #include "comp-twiddled.txt"
44*61046927SAndroid Build Coastguard Worker };
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker static struct sizetest sizetests[] = {
47*61046927SAndroid Build Coastguard Worker #include "uncomp-twiddled.txt"
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker static struct miptest miptests[] = {
51*61046927SAndroid Build Coastguard Worker #include "miptree.txt"
52*61046927SAndroid Build Coastguard Worker };
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker static struct msaatest msaatests[] = {
55*61046927SAndroid Build Coastguard Worker #include "msaa.txt"
56*61046927SAndroid Build Coastguard Worker };
57*61046927SAndroid Build Coastguard Worker 
TEST(Generated,CompTwiddled)58*61046927SAndroid Build Coastguard Worker TEST(Generated, CompTwiddled)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(comptests); ++i) {
61*61046927SAndroid Build Coastguard Worker       struct sizetest test = comptests[i];
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker       struct ail_layout layout = {
64*61046927SAndroid Build Coastguard Worker          .width_px = test.width,
65*61046927SAndroid Build Coastguard Worker          .height_px = test.height,
66*61046927SAndroid Build Coastguard Worker          .depth_px = test.depth,
67*61046927SAndroid Build Coastguard Worker          .sample_count_sa = 1,
68*61046927SAndroid Build Coastguard Worker          .levels = test.levels,
69*61046927SAndroid Build Coastguard Worker          .tiling = AIL_TILING_TWIDDLED_COMPRESSED,
70*61046927SAndroid Build Coastguard Worker          .format = test.format,
71*61046927SAndroid Build Coastguard Worker       };
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker       ail_make_miptree(&layout);
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker       EXPECT_EQ(layout.size_B, test.size)
76*61046927SAndroid Build Coastguard Worker          << test.width << "x" << test.height << "x" << test.depth << " "
77*61046927SAndroid Build Coastguard Worker          << (int)test.levels << "L " << util_format_short_name(test.format)
78*61046927SAndroid Build Coastguard Worker          << " compressed texture has wrong allocation size, off by "
79*61046927SAndroid Build Coastguard Worker          << ((int)layout.size_B - (int)test.size);
80*61046927SAndroid Build Coastguard Worker    }
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker 
TEST(Generated,UncompTwiddled)83*61046927SAndroid Build Coastguard Worker TEST(Generated, UncompTwiddled)
84*61046927SAndroid Build Coastguard Worker {
85*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(sizetests); ++i) {
86*61046927SAndroid Build Coastguard Worker       struct sizetest test = sizetests[i];
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker       struct ail_layout layout = {
89*61046927SAndroid Build Coastguard Worker          .width_px = test.width,
90*61046927SAndroid Build Coastguard Worker          .height_px = test.height,
91*61046927SAndroid Build Coastguard Worker          .depth_px = test.depth,
92*61046927SAndroid Build Coastguard Worker          .sample_count_sa = 1,
93*61046927SAndroid Build Coastguard Worker          .levels = test.levels,
94*61046927SAndroid Build Coastguard Worker          .tiling = AIL_TILING_TWIDDLED,
95*61046927SAndroid Build Coastguard Worker          .format = test.format,
96*61046927SAndroid Build Coastguard Worker       };
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker       ail_make_miptree(&layout);
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker       EXPECT_EQ(layout.size_B, test.size)
101*61046927SAndroid Build Coastguard Worker          << test.width << "x" << test.height << "x" << test.depth << " "
102*61046927SAndroid Build Coastguard Worker          << (int)test.levels << "L " << util_format_short_name(test.format)
103*61046927SAndroid Build Coastguard Worker          << " uncompressed texture has wrong allocation size, off by "
104*61046927SAndroid Build Coastguard Worker          << ((int)layout.size_B - (int)test.size);
105*61046927SAndroid Build Coastguard Worker    }
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
TEST(Generated,Miptree2D)108*61046927SAndroid Build Coastguard Worker TEST(Generated, Miptree2D)
109*61046927SAndroid Build Coastguard Worker {
110*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(miptests); ++i) {
111*61046927SAndroid Build Coastguard Worker       struct miptest test = miptests[i];
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker       struct ail_layout layout = {
114*61046927SAndroid Build Coastguard Worker          .width_px = test.width,
115*61046927SAndroid Build Coastguard Worker          .height_px = test.height,
116*61046927SAndroid Build Coastguard Worker          .depth_px = 1,
117*61046927SAndroid Build Coastguard Worker          .sample_count_sa = 1,
118*61046927SAndroid Build Coastguard Worker          .levels = test.levels,
119*61046927SAndroid Build Coastguard Worker          .tiling = AIL_TILING_TWIDDLED,
120*61046927SAndroid Build Coastguard Worker          .format = test.format,
121*61046927SAndroid Build Coastguard Worker       };
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker       ail_make_miptree(&layout);
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker       for (unsigned l = 0; l < test.levels; ++l) {
126*61046927SAndroid Build Coastguard Worker          EXPECT_EQ(ail_get_level_offset_B(&layout, l), test.offsets[l])
127*61046927SAndroid Build Coastguard Worker             << test.width << "x" << test.height << " "
128*61046927SAndroid Build Coastguard Worker             << util_format_short_name(test.format)
129*61046927SAndroid Build Coastguard Worker             << " texture has wrong offset at level " << l << ", off by "
130*61046927SAndroid Build Coastguard Worker             << test.offsets[l] - ail_get_level_offset_B(&layout, l);
131*61046927SAndroid Build Coastguard Worker       }
132*61046927SAndroid Build Coastguard Worker    }
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker 
TEST(Generated,MSAA)135*61046927SAndroid Build Coastguard Worker TEST(Generated, MSAA)
136*61046927SAndroid Build Coastguard Worker {
137*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(msaatests); ++i) {
138*61046927SAndroid Build Coastguard Worker       struct msaatest test = msaatests[i];
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker       struct ail_layout layout = {
141*61046927SAndroid Build Coastguard Worker          .width_px = test.width,
142*61046927SAndroid Build Coastguard Worker          .height_px = test.height,
143*61046927SAndroid Build Coastguard Worker          .depth_px = test.depth,
144*61046927SAndroid Build Coastguard Worker          .sample_count_sa = test.samples,
145*61046927SAndroid Build Coastguard Worker          .levels = test.levels,
146*61046927SAndroid Build Coastguard Worker          .tiling = test.is_compressed ? AIL_TILING_TWIDDLED_COMPRESSED
147*61046927SAndroid Build Coastguard Worker                                       : AIL_TILING_TWIDDLED,
148*61046927SAndroid Build Coastguard Worker          .format = test.format,
149*61046927SAndroid Build Coastguard Worker       };
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker       ail_make_miptree(&layout);
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker       EXPECT_EQ(layout.size_B, test.size)
154*61046927SAndroid Build Coastguard Worker          << test.width << "x" << test.height << "x" << test.depth << " "
155*61046927SAndroid Build Coastguard Worker          << (int)test.levels << "L " << (int)test.samples << "S "
156*61046927SAndroid Build Coastguard Worker          << util_format_short_name(test.format)
157*61046927SAndroid Build Coastguard Worker          << (test.is_compressed ? " " : " un")
158*61046927SAndroid Build Coastguard Worker          << "compressed texture has wrong allocation size, off by "
159*61046927SAndroid Build Coastguard Worker          << ((int)layout.size_B - (int)test.size);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker       if (test.is_compressed) {
162*61046927SAndroid Build Coastguard Worker          EXPECT_EQ(layout.metadata_offset_B, test.meta_offset)
163*61046927SAndroid Build Coastguard Worker             << test.width << "x" << test.height << "x" << test.depth << " "
164*61046927SAndroid Build Coastguard Worker             << (int)test.levels << "L " << (int)test.samples << "S "
165*61046927SAndroid Build Coastguard Worker             << util_format_short_name(test.format)
166*61046927SAndroid Build Coastguard Worker             << "compressed texture has wrong metadata offset size, off by "
167*61046927SAndroid Build Coastguard Worker             << ((int)layout.metadata_offset_B - (int)test.meta_offset);
168*61046927SAndroid Build Coastguard Worker       }
169*61046927SAndroid Build Coastguard Worker    }
170*61046927SAndroid Build Coastguard Worker }
171