xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/tests/test-tilebuffer.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 "util/format/u_format.h"
7*61046927SAndroid Build Coastguard Worker #include "agx_tilebuffer.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker struct test {
12*61046927SAndroid Build Coastguard Worker    const char *name;
13*61046927SAndroid Build Coastguard Worker    uint8_t nr_samples;
14*61046927SAndroid Build Coastguard Worker    enum pipe_format formats[8];
15*61046927SAndroid Build Coastguard Worker    struct agx_tilebuffer_layout layout;
16*61046927SAndroid Build Coastguard Worker    uint32_t total_size;
17*61046927SAndroid Build Coastguard Worker };
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker /* clang-format off */
20*61046927SAndroid Build Coastguard Worker struct test tests[] = {
21*61046927SAndroid Build Coastguard Worker    {
22*61046927SAndroid Build Coastguard Worker       "Simple test",
23*61046927SAndroid Build Coastguard Worker       1,
24*61046927SAndroid Build Coastguard Worker       { PIPE_FORMAT_R8G8B8A8_UNORM },
25*61046927SAndroid Build Coastguard Worker       {
26*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0 },
27*61046927SAndroid Build Coastguard Worker          .sample_size_B = 8,
28*61046927SAndroid Build Coastguard Worker          .nr_samples = 1,
29*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 32 },
30*61046927SAndroid Build Coastguard Worker       },
31*61046927SAndroid Build Coastguard Worker       8192
32*61046927SAndroid Build Coastguard Worker    },
33*61046927SAndroid Build Coastguard Worker    {
34*61046927SAndroid Build Coastguard Worker       "MSAA 2x",
35*61046927SAndroid Build Coastguard Worker       2,
36*61046927SAndroid Build Coastguard Worker       { PIPE_FORMAT_R8G8B8A8_UNORM },
37*61046927SAndroid Build Coastguard Worker       {
38*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0 },
39*61046927SAndroid Build Coastguard Worker          .sample_size_B = 8,
40*61046927SAndroid Build Coastguard Worker          .nr_samples = 2,
41*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 32 },
42*61046927SAndroid Build Coastguard Worker       },
43*61046927SAndroid Build Coastguard Worker       16384
44*61046927SAndroid Build Coastguard Worker    },
45*61046927SAndroid Build Coastguard Worker    {
46*61046927SAndroid Build Coastguard Worker       "MSAA 4x",
47*61046927SAndroid Build Coastguard Worker       4,
48*61046927SAndroid Build Coastguard Worker       { PIPE_FORMAT_R8G8B8A8_UNORM },
49*61046927SAndroid Build Coastguard Worker       {
50*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0 },
51*61046927SAndroid Build Coastguard Worker          .sample_size_B = 8,
52*61046927SAndroid Build Coastguard Worker          .nr_samples = 4,
53*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 16 },
54*61046927SAndroid Build Coastguard Worker       },
55*61046927SAndroid Build Coastguard Worker       16384
56*61046927SAndroid Build Coastguard Worker    },
57*61046927SAndroid Build Coastguard Worker    {
58*61046927SAndroid Build Coastguard Worker       "MRT",
59*61046927SAndroid Build Coastguard Worker       1,
60*61046927SAndroid Build Coastguard Worker       {
61*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SINT,
62*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FLOAT,
63*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SINT,
64*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SINT,
65*61046927SAndroid Build Coastguard Worker       },
66*61046927SAndroid Build Coastguard Worker       {
67*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 4, 12, 16 },
68*61046927SAndroid Build Coastguard Worker          .sample_size_B = 24,
69*61046927SAndroid Build Coastguard Worker          .nr_samples = 1,
70*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 32 },
71*61046927SAndroid Build Coastguard Worker       },
72*61046927SAndroid Build Coastguard Worker       24576
73*61046927SAndroid Build Coastguard Worker    },
74*61046927SAndroid Build Coastguard Worker    {
75*61046927SAndroid Build Coastguard Worker       "MRT with MSAA 2x",
76*61046927SAndroid Build Coastguard Worker       2,
77*61046927SAndroid Build Coastguard Worker       {
78*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SINT,
79*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FLOAT,
80*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SINT,
81*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SINT,
82*61046927SAndroid Build Coastguard Worker       },
83*61046927SAndroid Build Coastguard Worker       {
84*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 4, 12, 16 },
85*61046927SAndroid Build Coastguard Worker          .sample_size_B = 24,
86*61046927SAndroid Build Coastguard Worker          .nr_samples = 2,
87*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 16 },
88*61046927SAndroid Build Coastguard Worker       },
89*61046927SAndroid Build Coastguard Worker       24576
90*61046927SAndroid Build Coastguard Worker    },
91*61046927SAndroid Build Coastguard Worker    {
92*61046927SAndroid Build Coastguard Worker       "MRT with MSAA 4x",
93*61046927SAndroid Build Coastguard Worker       4,
94*61046927SAndroid Build Coastguard Worker       {
95*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SINT,
96*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FLOAT,
97*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SINT,
98*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SINT,
99*61046927SAndroid Build Coastguard Worker       },
100*61046927SAndroid Build Coastguard Worker       {
101*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 4, 12, 16 },
102*61046927SAndroid Build Coastguard Worker          .sample_size_B = 24,
103*61046927SAndroid Build Coastguard Worker          .nr_samples = 4,
104*61046927SAndroid Build Coastguard Worker          .tile_size = { 16, 16 },
105*61046927SAndroid Build Coastguard Worker       },
106*61046927SAndroid Build Coastguard Worker       24576
107*61046927SAndroid Build Coastguard Worker    },
108*61046927SAndroid Build Coastguard Worker    {
109*61046927SAndroid Build Coastguard Worker       "MRT test requiring 2 alignment on the second RT",
110*61046927SAndroid Build Coastguard Worker       1,
111*61046927SAndroid Build Coastguard Worker       { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R16G16_SNORM },
112*61046927SAndroid Build Coastguard Worker       {
113*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 2 },
114*61046927SAndroid Build Coastguard Worker          .sample_size_B = 8,
115*61046927SAndroid Build Coastguard Worker          .nr_samples = 1,
116*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 32 },
117*61046927SAndroid Build Coastguard Worker       },
118*61046927SAndroid Build Coastguard Worker       8192
119*61046927SAndroid Build Coastguard Worker    },
120*61046927SAndroid Build Coastguard Worker    {
121*61046927SAndroid Build Coastguard Worker       "Simple MRT test requiring 4 alignment on the second RT",
122*61046927SAndroid Build Coastguard Worker       1,
123*61046927SAndroid Build Coastguard Worker       { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R10G10B10A2_UNORM },
124*61046927SAndroid Build Coastguard Worker       {
125*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 4 },
126*61046927SAndroid Build Coastguard Worker          .sample_size_B = 8,
127*61046927SAndroid Build Coastguard Worker          .nr_samples = 1,
128*61046927SAndroid Build Coastguard Worker          .tile_size = { 32, 32 },
129*61046927SAndroid Build Coastguard Worker       },
130*61046927SAndroid Build Coastguard Worker       8192
131*61046927SAndroid Build Coastguard Worker    },
132*61046927SAndroid Build Coastguard Worker    {
133*61046927SAndroid Build Coastguard Worker       "MRT test that requires spilling to consider alignment requirements",
134*61046927SAndroid Build Coastguard Worker       4,
135*61046927SAndroid Build Coastguard Worker       {
136*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
137*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
138*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
139*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
140*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
141*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
142*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
143*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
144*61046927SAndroid Build Coastguard Worker       },
145*61046927SAndroid Build Coastguard Worker       {
146*61046927SAndroid Build Coastguard Worker          .spilled = { false, false, false, false, false, false, true, true },
147*61046927SAndroid Build Coastguard Worker          ._offset_B = { 0, 4, 8, 12, 16, 20, 0, 0},
148*61046927SAndroid Build Coastguard Worker          .sample_size_B = 24,
149*61046927SAndroid Build Coastguard Worker          .nr_samples = 4,
150*61046927SAndroid Build Coastguard Worker          .tile_size = { 16, 16 },
151*61046927SAndroid Build Coastguard Worker       },
152*61046927SAndroid Build Coastguard Worker       24576
153*61046927SAndroid Build Coastguard Worker    },
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker };
156*61046927SAndroid Build Coastguard Worker /* clang-format on */
157*61046927SAndroid Build Coastguard Worker 
TEST(Tilebuffer,Layouts)158*61046927SAndroid Build Coastguard Worker TEST(Tilebuffer, Layouts)
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(tests); ++i) {
161*61046927SAndroid Build Coastguard Worker       unsigned nr_cbufs;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker       for (nr_cbufs = 0; nr_cbufs < ARRAY_SIZE(tests[i].formats) &&
164*61046927SAndroid Build Coastguard Worker                          tests[i].formats[nr_cbufs] != PIPE_FORMAT_NONE;
165*61046927SAndroid Build Coastguard Worker            ++nr_cbufs)
166*61046927SAndroid Build Coastguard Worker          ;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker       struct agx_tilebuffer_layout actual = agx_build_tilebuffer_layout(
169*61046927SAndroid Build Coastguard Worker          tests[i].formats, nr_cbufs, tests[i].nr_samples, false);
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker       ASSERT_EQ(tests[i].layout.sample_size_B, actual.sample_size_B)
172*61046927SAndroid Build Coastguard Worker          << tests[i].name;
173*61046927SAndroid Build Coastguard Worker       ASSERT_EQ(tests[i].layout.nr_samples, actual.nr_samples) << tests[i].name;
174*61046927SAndroid Build Coastguard Worker       ASSERT_EQ(tests[i].layout.tile_size.width, actual.tile_size.width)
175*61046927SAndroid Build Coastguard Worker          << tests[i].name;
176*61046927SAndroid Build Coastguard Worker       ASSERT_EQ(tests[i].layout.tile_size.height, actual.tile_size.height)
177*61046927SAndroid Build Coastguard Worker          << tests[i].name;
178*61046927SAndroid Build Coastguard Worker       ASSERT_EQ(tests[i].total_size, agx_tilebuffer_total_size(&tests[i].layout))
179*61046927SAndroid Build Coastguard Worker          << tests[i].name;
180*61046927SAndroid Build Coastguard Worker    }
181*61046927SAndroid Build Coastguard Worker }
182