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