xref: /aosp_15_r20/external/mesa3d/src/intel/isl/tests/isl_tile_std_y_test.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2018 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 #include <assert.h>
25 #include <stdbool.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 
29 #include "isl/isl.h"
30 
31 // An asssert that works regardless of NDEBUG.
32 #define t_assert(cond) \
33    do { \
34       if (!(cond)) { \
35          fprintf(stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
36          abort(); \
37       } \
38    } while (0)
39 
40 static void
assert_tile_size(enum isl_tiling tiling,enum isl_surf_dim dim,enum isl_msaa_layout msaa_layout,uint32_t bpb,uint32_t samples,uint32_t w,uint32_t h,uint32_t d,uint32_t a)41 assert_tile_size(enum isl_tiling tiling, enum isl_surf_dim dim,
42                  enum isl_msaa_layout msaa_layout,
43                  uint32_t bpb, uint32_t samples,
44                  uint32_t w, uint32_t h, uint32_t d, uint32_t a)
45 {
46    struct isl_tile_info tile_info;
47    isl_tiling_get_info(tiling, dim, msaa_layout, bpb, samples, &tile_info);
48 
49    /* Sanity */
50    t_assert(tile_info.tiling == tiling);
51    t_assert(tile_info.format_bpb == bpb);
52 
53    t_assert(tile_info.logical_extent_el.w == w);
54    t_assert(tile_info.logical_extent_el.h == h);
55    t_assert(tile_info.logical_extent_el.d == d);
56    t_assert(tile_info.logical_extent_el.a == a);
57 
58    bool is_Ys = tiling == ISL_TILING_SKL_Ys ||
59                 tiling == ISL_TILING_ICL_Ys;
60    uint32_t tile_size = is_Ys ? 64 * 1024 : 4 * 1024;
61 
62    assert(tile_size == tile_info.phys_extent_B.w *
63                        tile_info.phys_extent_B.h);
64 
65    assert(tile_size == tile_info.logical_extent_el.w *
66                        tile_info.logical_extent_el.h *
67                        tile_info.logical_extent_el.d *
68                        tile_info.logical_extent_el.a *
69                        bpb / 8);
70 }
71 
72 static void
assert_2d_tile_size(enum isl_tiling tiling,uint32_t bpb,uint32_t halign,uint32_t valign)73 assert_2d_tile_size(enum isl_tiling tiling, uint32_t bpb,
74                     uint32_t halign, uint32_t valign)
75 {
76 #define ASSERT_2D(tiling, bpb, samples, w, h, a) \
77    assert_tile_size(tiling, ISL_SURF_DIM_2D, ISL_MSAA_LAYOUT_ARRAY, \
78                     bpb, samples, w, h, 1, a)
79 
80    /* Single sampled */
81    ASSERT_2D(tiling, bpb, 1, halign, valign, 1);
82 
83    /* Multisampled */
84    if (tiling == ISL_TILING_SKL_Yf) {
85       ASSERT_2D(tiling, bpb,  2, halign, valign, 1);
86       ASSERT_2D(tiling, bpb,  4, halign, valign, 1);
87       ASSERT_2D(tiling, bpb,  8, halign, valign, 1);
88       ASSERT_2D(tiling, bpb, 16, halign, valign, 1);
89    } else {
90       /* For gfx9 Ys and for both Yf and Ys on gfx11, we have to divide the
91        * size by the number of samples.
92        */
93       ASSERT_2D(tiling, bpb,  2, halign / 2, valign / 1,  2);
94       ASSERT_2D(tiling, bpb,  4, halign / 2, valign / 2,  4);
95       ASSERT_2D(tiling, bpb,  8, halign / 4, valign / 2,  8);
96       ASSERT_2D(tiling, bpb, 16, halign / 4, valign / 4, 16);
97    }
98 
99 #undef ASSERT_2D
100 }
101 
102 static void
test_2d_tile_dimensions()103 test_2d_tile_dimensions()
104 {
105    assert_2d_tile_size(ISL_TILING_SKL_Ys,  128,  64,  64);
106    assert_2d_tile_size(ISL_TILING_SKL_Ys,   64, 128,  64);
107    assert_2d_tile_size(ISL_TILING_SKL_Ys,   32, 128, 128);
108    assert_2d_tile_size(ISL_TILING_SKL_Ys,   16, 256, 128);
109    assert_2d_tile_size(ISL_TILING_SKL_Ys,    8, 256, 256);
110 
111    assert_2d_tile_size(ISL_TILING_SKL_Yf,  128,  16,  16);
112    assert_2d_tile_size(ISL_TILING_SKL_Yf,   64,  32,  16);
113    assert_2d_tile_size(ISL_TILING_SKL_Yf,   32,  32,  32);
114    assert_2d_tile_size(ISL_TILING_SKL_Yf,   16,  64,  32);
115    assert_2d_tile_size(ISL_TILING_SKL_Yf,    8,  64,  64);
116 
117    assert_2d_tile_size(ISL_TILING_ICL_Ys, 128,  64,  64);
118    assert_2d_tile_size(ISL_TILING_ICL_Ys,  64, 128,  64);
119    assert_2d_tile_size(ISL_TILING_ICL_Ys,  32, 128, 128);
120    assert_2d_tile_size(ISL_TILING_ICL_Ys,  16, 256, 128);
121    assert_2d_tile_size(ISL_TILING_ICL_Ys,   8, 256, 256);
122 
123    assert_2d_tile_size(ISL_TILING_ICL_Yf, 128,  16,  16);
124    assert_2d_tile_size(ISL_TILING_ICL_Yf,  64,  32,  16);
125    assert_2d_tile_size(ISL_TILING_ICL_Yf,  32,  32,  32);
126    assert_2d_tile_size(ISL_TILING_ICL_Yf,  16,  64,  32);
127    assert_2d_tile_size(ISL_TILING_ICL_Yf,   8,  64,  64);
128 }
129 
130 static void
test_3d_tile_dimensions()131 test_3d_tile_dimensions()
132 {
133 #define ASSERT_3D(tiling, bpb, halign, valign, dalign) \
134    assert_tile_size(tiling, ISL_SURF_DIM_3D, ISL_MSAA_LAYOUT_ARRAY, \
135                     bpb, 1, halign, valign, dalign, 1)
136 
137    ASSERT_3D(ISL_TILING_SKL_Ys, 128, 16, 16, 16);
138    ASSERT_3D(ISL_TILING_SKL_Ys,  64, 32, 16, 16);
139    ASSERT_3D(ISL_TILING_SKL_Ys,  32, 32, 32, 16);
140    ASSERT_3D(ISL_TILING_SKL_Ys,  16, 32, 32, 32);
141    ASSERT_3D(ISL_TILING_SKL_Ys,   8, 64, 32, 32);
142 
143    ASSERT_3D(ISL_TILING_SKL_Yf, 128,  4,  8,  8);
144    ASSERT_3D(ISL_TILING_SKL_Yf,  64,  8,  8,  8);
145    ASSERT_3D(ISL_TILING_SKL_Yf,  32,  8, 16,  8);
146    ASSERT_3D(ISL_TILING_SKL_Yf,  16,  8, 16, 16);
147    ASSERT_3D(ISL_TILING_SKL_Yf,   8, 16, 16, 16);
148 
149    ASSERT_3D(ISL_TILING_ICL_Ys, 128, 16, 16, 16);
150    ASSERT_3D(ISL_TILING_ICL_Ys,  64, 32, 16, 16);
151    ASSERT_3D(ISL_TILING_ICL_Ys,  32, 32, 32, 16);
152    ASSERT_3D(ISL_TILING_ICL_Ys,  16, 32, 32, 32);
153    ASSERT_3D(ISL_TILING_ICL_Ys,   8, 64, 32, 32);
154 
155    ASSERT_3D(ISL_TILING_ICL_Yf, 128,  4,  8,  8);
156    ASSERT_3D(ISL_TILING_ICL_Yf,  64,  8,  8,  8);
157    ASSERT_3D(ISL_TILING_ICL_Yf,  32,  8, 16,  8);
158    ASSERT_3D(ISL_TILING_ICL_Yf,  16,  8, 16, 16);
159    ASSERT_3D(ISL_TILING_ICL_Yf,   8, 16, 16, 16);
160 
161 #undef ASSERT_3D
162 }
163 
main(void)164 int main(void)
165 {
166    test_2d_tile_dimensions();
167    test_3d_tile_dimensions();
168 
169    return 0;
170 }
171