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