1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2022 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "pan_texture.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
27*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,Linear)28*61046927SAndroid Build Coastguard Worker TEST(BlockSize, Linear)
29*61046927SAndroid Build Coastguard Worker {
30*61046927SAndroid Build Coastguard Worker enum pipe_format format[] = {PIPE_FORMAT_R32G32B32_FLOAT,
31*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_R8G8B8_UNORM, PIPE_FORMAT_ETC2_RGB8,
32*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_ASTC_5x5};
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(format); ++i) {
35*61046927SAndroid Build Coastguard Worker struct pan_block_size blk =
36*61046927SAndroid Build Coastguard Worker panfrost_block_size(DRM_FORMAT_MOD_LINEAR, format[i]);
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.width, 1);
39*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.height, 1);
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker }
42*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,UInterleavedRegular)43*61046927SAndroid Build Coastguard Worker TEST(BlockSize, UInterleavedRegular)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker enum pipe_format format[] = {
46*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_R32G32B32_FLOAT,
47*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_R8G8B8_UNORM,
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(format); ++i) {
51*61046927SAndroid Build Coastguard Worker struct pan_block_size blk = panfrost_block_size(
52*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED, format[i]);
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.width, 16);
55*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.height, 16);
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker }
58*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,UInterleavedBlockCompressed)59*61046927SAndroid Build Coastguard Worker TEST(BlockSize, UInterleavedBlockCompressed)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker enum pipe_format format[] = {PIPE_FORMAT_ETC2_RGB8, PIPE_FORMAT_ASTC_5x5};
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(format); ++i) {
64*61046927SAndroid Build Coastguard Worker struct pan_block_size blk = panfrost_block_size(
65*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED, format[i]);
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.width, 4);
68*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.height, 4);
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,AFBCFormatInvariant16x16)72*61046927SAndroid Build Coastguard Worker TEST(BlockSize, AFBCFormatInvariant16x16)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker enum pipe_format format[] = {PIPE_FORMAT_R32G32B32_FLOAT,
75*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_R8G8B8_UNORM, PIPE_FORMAT_ETC2_RGB8,
76*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_ASTC_5x5};
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker uint64_t modifier =
79*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
80*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE | AFBC_FORMAT_MOD_YTR);
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(format); ++i) {
83*61046927SAndroid Build Coastguard Worker struct pan_block_size blk = panfrost_block_size(modifier, format[i]);
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.width, 16);
86*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.height, 16);
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,AFBCFormatInvariant32x8)90*61046927SAndroid Build Coastguard Worker TEST(BlockSize, AFBCFormatInvariant32x8)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker enum pipe_format format[] = {PIPE_FORMAT_R32G32B32_FLOAT,
93*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_R8G8B8_UNORM, PIPE_FORMAT_ETC2_RGB8,
94*61046927SAndroid Build Coastguard Worker PIPE_FORMAT_ASTC_5x5};
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker uint64_t modifier =
97*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 |
98*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE | AFBC_FORMAT_MOD_YTR);
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(format); ++i) {
101*61046927SAndroid Build Coastguard Worker struct pan_block_size blk = panfrost_block_size(modifier, format[i]);
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.width, 32);
104*61046927SAndroid Build Coastguard Worker EXPECT_EQ(blk.height, 8);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,AFBCSuperblock16x16)108*61046927SAndroid Build Coastguard Worker TEST(BlockSize, AFBCSuperblock16x16)
109*61046927SAndroid Build Coastguard Worker {
110*61046927SAndroid Build Coastguard Worker uint64_t modifier =
111*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
112*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE | AFBC_FORMAT_MOD_YTR);
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).width, 16);
115*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_width(modifier), 16);
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).height, 16);
118*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_height(modifier), 16);
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker EXPECT_FALSE(panfrost_afbc_is_wide(modifier));
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,AFBCSuperblock32x8)123*61046927SAndroid Build Coastguard Worker TEST(BlockSize, AFBCSuperblock32x8)
124*61046927SAndroid Build Coastguard Worker {
125*61046927SAndroid Build Coastguard Worker uint64_t modifier = DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 |
126*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE);
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).width, 32);
129*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_width(modifier), 32);
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).height, 8);
132*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_height(modifier), 8);
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(panfrost_afbc_is_wide(modifier));
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker
TEST(BlockSize,AFBCSuperblock64x4)137*61046927SAndroid Build Coastguard Worker TEST(BlockSize, AFBCSuperblock64x4)
138*61046927SAndroid Build Coastguard Worker {
139*61046927SAndroid Build Coastguard Worker uint64_t modifier = DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 |
140*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE);
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).width, 64);
143*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_width(modifier), 64);
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_size(modifier).height, 4);
146*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_afbc_superblock_height(modifier), 4);
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(panfrost_afbc_is_wide(modifier));
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker /* Calculate Bifrost line stride, since we have reference formulas for Bifrost
152*61046927SAndroid Build Coastguard Worker * stride calculations.
153*61046927SAndroid Build Coastguard Worker */
154*61046927SAndroid Build Coastguard Worker static uint32_t
pan_afbc_line_stride(uint64_t modifier,uint32_t width)155*61046927SAndroid Build Coastguard Worker pan_afbc_line_stride(uint64_t modifier, uint32_t width)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker return pan_afbc_stride_blocks(modifier,
158*61046927SAndroid Build Coastguard Worker pan_afbc_row_stride(modifier, width));
159*61046927SAndroid Build Coastguard Worker }
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker /* Which form of the stride we specify is hardware specific (row stride for
162*61046927SAndroid Build Coastguard Worker * Valhall, line stride for Bifrost). However, the layout code is hardware
163*61046927SAndroid Build Coastguard Worker * independent, so we test both row stride and line stride calculations.
164*61046927SAndroid Build Coastguard Worker */
TEST(AFBCStride,Linear)165*61046927SAndroid Build Coastguard Worker TEST(AFBCStride, Linear)
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker uint64_t modifiers[] = {
168*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
169*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE),
170*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 |
171*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE),
172*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 |
173*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE),
174*61046927SAndroid Build Coastguard Worker };
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker for (unsigned m = 0; m < ARRAY_SIZE(modifiers); ++m) {
177*61046927SAndroid Build Coastguard Worker uint64_t modifier = modifiers[m];
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker uint32_t sw = panfrost_afbc_superblock_width(modifier);
180*61046927SAndroid Build Coastguard Worker uint32_t cases[] = {1, 4, 17, 39};
181*61046927SAndroid Build Coastguard Worker
182*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(cases); ++i) {
183*61046927SAndroid Build Coastguard Worker uint32_t width = sw * cases[i];
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker EXPECT_EQ(pan_afbc_row_stride(modifier, width),
186*61046927SAndroid Build Coastguard Worker 16 * DIV_ROUND_UP(width, sw));
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker EXPECT_EQ(pan_afbc_line_stride(modifier, width),
189*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(width, sw));
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker }
193*61046927SAndroid Build Coastguard Worker
TEST(AFBCStride,Tiled)194*61046927SAndroid Build Coastguard Worker TEST(AFBCStride, Tiled)
195*61046927SAndroid Build Coastguard Worker {
196*61046927SAndroid Build Coastguard Worker uint64_t modifiers[] = {
197*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
198*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_TILED | AFBC_FORMAT_MOD_SPARSE),
199*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 |
200*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_TILED | AFBC_FORMAT_MOD_SPARSE),
201*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 |
202*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_TILED | AFBC_FORMAT_MOD_SPARSE),
203*61046927SAndroid Build Coastguard Worker };
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker for (unsigned m = 0; m < ARRAY_SIZE(modifiers); ++m) {
206*61046927SAndroid Build Coastguard Worker uint64_t modifier = modifiers[m];
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker uint32_t sw = panfrost_afbc_superblock_width(modifier);
209*61046927SAndroid Build Coastguard Worker uint32_t cases[] = {1, 4, 17, 39};
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(cases); ++i) {
212*61046927SAndroid Build Coastguard Worker uint32_t width = sw * 8 * cases[i];
213*61046927SAndroid Build Coastguard Worker
214*61046927SAndroid Build Coastguard Worker EXPECT_EQ(pan_afbc_row_stride(modifier, width),
215*61046927SAndroid Build Coastguard Worker 16 * DIV_ROUND_UP(width, (sw * 8)) * 8 * 8);
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker EXPECT_EQ(pan_afbc_line_stride(modifier, width),
218*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(width, sw * 8) * 8);
219*61046927SAndroid Build Coastguard Worker }
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker
TEST(LegacyStride,FromLegacyLinear)223*61046927SAndroid Build Coastguard Worker TEST(LegacyStride, FromLegacyLinear)
224*61046927SAndroid Build Coastguard Worker {
225*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_from_legacy_stride(1920 * 4, PIPE_FORMAT_R8G8B8A8_UINT,
226*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_LINEAR),
227*61046927SAndroid Build Coastguard Worker 1920 * 4);
228*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_from_legacy_stride(53, PIPE_FORMAT_R8_SNORM,
229*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_LINEAR),
230*61046927SAndroid Build Coastguard Worker 53);
231*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_from_legacy_stride(60, PIPE_FORMAT_ETC2_RGB8,
232*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_LINEAR),
233*61046927SAndroid Build Coastguard Worker 60);
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker
TEST(LegacyStride,FromLegacyInterleaved)236*61046927SAndroid Build Coastguard Worker TEST(LegacyStride, FromLegacyInterleaved)
237*61046927SAndroid Build Coastguard Worker {
238*61046927SAndroid Build Coastguard Worker EXPECT_EQ(
239*61046927SAndroid Build Coastguard Worker panfrost_from_legacy_stride(1920 * 4, PIPE_FORMAT_R8G8B8A8_UINT,
240*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED),
241*61046927SAndroid Build Coastguard Worker 1920 * 4 * 16);
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker EXPECT_EQ(
244*61046927SAndroid Build Coastguard Worker panfrost_from_legacy_stride(53, PIPE_FORMAT_R8_SNORM,
245*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED),
246*61046927SAndroid Build Coastguard Worker 53 * 16);
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker EXPECT_EQ(
249*61046927SAndroid Build Coastguard Worker panfrost_from_legacy_stride(60, PIPE_FORMAT_ETC2_RGB8,
250*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED),
251*61046927SAndroid Build Coastguard Worker 60 * 4);
252*61046927SAndroid Build Coastguard Worker }
253*61046927SAndroid Build Coastguard Worker
TEST(LegacyStride,FromLegacyAFBC)254*61046927SAndroid Build Coastguard Worker TEST(LegacyStride, FromLegacyAFBC)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker uint64_t modifier =
257*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 |
258*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_SPARSE | AFBC_FORMAT_MOD_YTR);
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_from_legacy_stride(1920 * 4, PIPE_FORMAT_R8G8B8A8_UINT,
261*61046927SAndroid Build Coastguard Worker modifier),
262*61046927SAndroid Build Coastguard Worker 60 * 16);
263*61046927SAndroid Build Coastguard Worker EXPECT_EQ(panfrost_from_legacy_stride(64, PIPE_FORMAT_R8_SNORM, modifier),
264*61046927SAndroid Build Coastguard Worker 2 * 16);
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker /* dEQP-GLES3.functional.texture.format.compressed.etc1_2d_pot */
TEST(Layout,ImplicitLayoutInterleavedETC2)268*61046927SAndroid Build Coastguard Worker TEST(Layout, ImplicitLayoutInterleavedETC2)
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {
271*61046927SAndroid Build Coastguard Worker .modifier = DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED,
272*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_ETC2_RGB8,
273*61046927SAndroid Build Coastguard Worker .width = 128,
274*61046927SAndroid Build Coastguard Worker .height = 128,
275*61046927SAndroid Build Coastguard Worker .depth = 1,
276*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
277*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
278*61046927SAndroid Build Coastguard Worker .nr_slices = 8};
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker unsigned offsets[9] = {0, 8192, 10240, 10752, 10880,
281*61046927SAndroid Build Coastguard Worker 11008, 11136, 11264, 11392};
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 8; ++i) {
286*61046927SAndroid Build Coastguard Worker unsigned size = (offsets[i + 1] - offsets[i]);
287*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[i].offset, offsets[i]);
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker if (size == 64)
290*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(l.slices[i].size < 64);
291*61046927SAndroid Build Coastguard Worker else
292*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[i].size, size);
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker }
295*61046927SAndroid Build Coastguard Worker
TEST(Layout,ImplicitLayoutInterleavedASTC5x5)296*61046927SAndroid Build Coastguard Worker TEST(Layout, ImplicitLayoutInterleavedASTC5x5)
297*61046927SAndroid Build Coastguard Worker {
298*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {
299*61046927SAndroid Build Coastguard Worker .modifier = DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED,
300*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_ASTC_5x5,
301*61046927SAndroid Build Coastguard Worker .width = 50,
302*61046927SAndroid Build Coastguard Worker .height = 50,
303*61046927SAndroid Build Coastguard Worker .depth = 1,
304*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
305*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
306*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
307*61046927SAndroid Build Coastguard Worker
308*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker /* The image is 50x50 pixels, with 5x5 blocks. So it is a 10x10 grid of ASTC
311*61046927SAndroid Build Coastguard Worker * blocks. 4x4 tiles of ASTC blocks are u-interleaved, so we have to round up
312*61046927SAndroid Build Coastguard Worker * to a 12x12 grid. So we need space for 144 ASTC blocks. Each ASTC block is
313*61046927SAndroid Build Coastguard Worker * 16 bytes (128-bits), so we require 2304 bytes, with a row stride of 12 *
314*61046927SAndroid Build Coastguard Worker * 16 * 4 = 192 bytes.
315*61046927SAndroid Build Coastguard Worker */
316*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
317*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 768);
318*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 2304);
319*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 2304);
320*61046927SAndroid Build Coastguard Worker }
321*61046927SAndroid Build Coastguard Worker
TEST(Layout,ImplicitLayoutLinearASTC5x5)322*61046927SAndroid Build Coastguard Worker TEST(Layout, ImplicitLayoutLinearASTC5x5)
323*61046927SAndroid Build Coastguard Worker {
324*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {.modifier = DRM_FORMAT_MOD_LINEAR,
325*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_ASTC_5x5,
326*61046927SAndroid Build Coastguard Worker .width = 50,
327*61046927SAndroid Build Coastguard Worker .height = 50,
328*61046927SAndroid Build Coastguard Worker .depth = 1,
329*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
330*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
331*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker /* The image is 50x50 pixels, with 5x5 blocks. So it is a 10x10 grid of ASTC
336*61046927SAndroid Build Coastguard Worker * blocks. Each ASTC block is 16 bytes, so the row stride is 160 bytes,
337*61046927SAndroid Build Coastguard Worker * rounded up to the cache line (192 bytes). There are 10 rows, so we have
338*61046927SAndroid Build Coastguard Worker * 1920 bytes total.
339*61046927SAndroid Build Coastguard Worker */
340*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
341*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 192);
342*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 1920);
343*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 1920);
344*61046927SAndroid Build Coastguard Worker }
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker /* dEQP-GLES3.functional.texture.format.unsized.rgba_unsigned_byte_3d_pot */
TEST(AFBCLayout,Linear3D)347*61046927SAndroid Build Coastguard Worker TEST(AFBCLayout, Linear3D)
348*61046927SAndroid Build Coastguard Worker {
349*61046927SAndroid Build Coastguard Worker uint64_t modifier = DRM_FORMAT_MOD_ARM_AFBC(
350*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE);
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {.modifier = modifier,
353*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_R8G8B8A8_UNORM,
354*61046927SAndroid Build Coastguard Worker .width = 8,
355*61046927SAndroid Build Coastguard Worker .height = 32,
356*61046927SAndroid Build Coastguard Worker .depth = 16,
357*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
358*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_3D,
359*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker /* AFBC Surface stride is bytes between consecutive surface headers, which is
364*61046927SAndroid Build Coastguard Worker * the header size since this is a 3D texture. At superblock size 16x16, the
365*61046927SAndroid Build Coastguard Worker * 8x32 layer has 1x2 superblocks, so the header size is 2 * 16 = 32 bytes,
366*61046927SAndroid Build Coastguard Worker * rounded up to cache line 64.
367*61046927SAndroid Build Coastguard Worker *
368*61046927SAndroid Build Coastguard Worker * There is only 1 superblock per row, so the row stride is the bytes per 1
369*61046927SAndroid Build Coastguard Worker * header block = 16.
370*61046927SAndroid Build Coastguard Worker *
371*61046927SAndroid Build Coastguard Worker * There are 16 layers of size 64 so afbc.header_size = 16 * 64 = 1024.
372*61046927SAndroid Build Coastguard Worker *
373*61046927SAndroid Build Coastguard Worker * Each 16x16 superblock consumes 16 * 16 * 4 = 1024 bytes. There are 2 * 1 *
374*61046927SAndroid Build Coastguard Worker * 16 superblocks in the image, so body size is 32768.
375*61046927SAndroid Build Coastguard Worker */
376*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
377*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 16);
378*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.header_size, 1024);
379*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.body_size, 32768);
380*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.surface_stride, 64);
381*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 2048); /* XXX: Not meaningful? */
382*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 32768); /* XXX: Not used by anything and wrong */
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker
TEST(AFBCLayout,Tiled16x16)385*61046927SAndroid Build Coastguard Worker TEST(AFBCLayout, Tiled16x16)
386*61046927SAndroid Build Coastguard Worker {
387*61046927SAndroid Build Coastguard Worker uint64_t modifier =
388*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
389*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_TILED | AFBC_FORMAT_MOD_SPARSE);
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {.modifier = modifier,
392*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_R8G8B8A8_UNORM,
393*61046927SAndroid Build Coastguard Worker .width = 917,
394*61046927SAndroid Build Coastguard Worker .height = 417,
395*61046927SAndroid Build Coastguard Worker .depth = 1,
396*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
397*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
398*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker /* The image is 917x417. Superblocks are 16x16, so there are 58x27
403*61046927SAndroid Build Coastguard Worker * superblocks. Superblocks are grouped into 8x8 tiles, so there are 8x4
404*61046927SAndroid Build Coastguard Worker * tiles of superblocks. So the row stride is 16 * 8 * 8 * 8 = 8192 bytes.
405*61046927SAndroid Build Coastguard Worker * There are 4 tiles vertically, so the header is 8192 * 4 = 32768 bytes.
406*61046927SAndroid Build Coastguard Worker * This is already 4096-byte aligned.
407*61046927SAndroid Build Coastguard Worker *
408*61046927SAndroid Build Coastguard Worker * Each tile of superblock contains 128x128 pixels and each pixel is 4 bytes,
409*61046927SAndroid Build Coastguard Worker * so tiles are 65536 bytes, meaning the payload is 8 * 4 * 65536 = 2097152
410*61046927SAndroid Build Coastguard Worker * bytes.
411*61046927SAndroid Build Coastguard Worker *
412*61046927SAndroid Build Coastguard Worker * In total, the AFBC surface is 32768 + 2097152 = 2129920 bytes.
413*61046927SAndroid Build Coastguard Worker */
414*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
415*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 8192);
416*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.header_size, 32768);
417*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.body_size, 2097152);
418*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 2129920);
419*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 2129920);
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker
TEST(AFBCLayout,Linear16x16Minimal)422*61046927SAndroid Build Coastguard Worker TEST(AFBCLayout, Linear16x16Minimal)
423*61046927SAndroid Build Coastguard Worker {
424*61046927SAndroid Build Coastguard Worker uint64_t modifier = DRM_FORMAT_MOD_ARM_AFBC(
425*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE);
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {.modifier = modifier,
428*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_R8_UNORM,
429*61046927SAndroid Build Coastguard Worker .width = 1,
430*61046927SAndroid Build Coastguard Worker .height = 1,
431*61046927SAndroid Build Coastguard Worker .depth = 1,
432*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
433*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
434*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker /* Image is 1x1 to test for correct alignment everywhere. */
439*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
440*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 16);
441*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.header_size, 64);
442*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.body_size, 32 * 8);
443*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 64 + (32 * 8));
444*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 64 + (32 * 8));
445*61046927SAndroid Build Coastguard Worker }
446*61046927SAndroid Build Coastguard Worker
TEST(AFBCLayout,Tiled16x16Minimal)447*61046927SAndroid Build Coastguard Worker TEST(AFBCLayout, Tiled16x16Minimal)
448*61046927SAndroid Build Coastguard Worker {
449*61046927SAndroid Build Coastguard Worker uint64_t modifier =
450*61046927SAndroid Build Coastguard Worker DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
451*61046927SAndroid Build Coastguard Worker AFBC_FORMAT_MOD_TILED | AFBC_FORMAT_MOD_SPARSE);
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker struct pan_image_layout l = {.modifier = modifier,
454*61046927SAndroid Build Coastguard Worker .format = PIPE_FORMAT_R8_UNORM,
455*61046927SAndroid Build Coastguard Worker .width = 1,
456*61046927SAndroid Build Coastguard Worker .height = 1,
457*61046927SAndroid Build Coastguard Worker .depth = 1,
458*61046927SAndroid Build Coastguard Worker .nr_samples = 1,
459*61046927SAndroid Build Coastguard Worker .dim = MALI_TEXTURE_DIMENSION_2D,
460*61046927SAndroid Build Coastguard Worker .nr_slices = 1};
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Worker ASSERT_TRUE(pan_image_layout_init(0, &l, NULL));
463*61046927SAndroid Build Coastguard Worker
464*61046927SAndroid Build Coastguard Worker /* Image is 1x1 to test for correct alignment everywhere. */
465*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].offset, 0);
466*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].row_stride, 16 * 8 * 8);
467*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.header_size, 4096);
468*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].afbc.body_size, 32 * 8 * 8 * 8);
469*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].surface_stride, 4096 + (32 * 8 * 8 * 8));
470*61046927SAndroid Build Coastguard Worker EXPECT_EQ(l.slices[0].size, 4096 + (32 * 8 * 8 * 8));
471*61046927SAndroid Build Coastguard Worker }
472