• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2020 Google LLC
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 DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #include "freedreno_layout.h"
25 #include "fd_layout_test.h"
26 #include "adreno_common.xml.h"
27 #include "adreno_pm4.xml.h"
28 #include "a6xx.xml.h"
29 
30 #include <stdio.h>
31 
32 static const struct testcase
33    testcases[] =
34       {
35          /* A straightforward first testcase, linear, with an obvious format. */
36          {
37             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
38             .layout =
39                {
40                   .width0 = 32,
41                   .height0 = 32,
42                   .slices =
43                      {
44                         {.offset = 0, .pitch = 256},
45                         {.offset = 8192, .pitch = 256},
46                         {.offset = 12288, .pitch = 256},
47                         {.offset = 14336, .pitch = 256},
48                         {.offset = 15360, .pitch = 256},
49                         {.offset = 15872, .pitch = 256},
50                      },
51                },
52          },
53 
54          /* A tiled/ubwc layout from the blob driver, at a size where the a630
55           * blob driver does something interesting for linear.
56           */
57          {
58             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
59             .layout =
60                {
61                   .tile_mode = TILE6_3,
62                   .ubwc = true,
63                   .width0 = 1024,
64                   .height0 = 1,
65                   .slices =
66                      {
67                         {.offset = 0, .pitch = 4096},
68                         {.offset = 65536, .pitch = 2048},
69                         {.offset = 98304, .pitch = 1024},
70                         {.offset = 114688, .pitch = 512},
71                         {.offset = 122880, .pitch = 256},
72                         {.offset = 126976, .pitch = 256},
73                         {.offset = 131072, .pitch = 256},
74                         {.offset = 135168, .pitch = 256},
75                         {.offset = 139264, .pitch = 256},
76                         {.offset = 143360, .pitch = 256},
77                         {.offset = 147456, .pitch = 256},
78                      },
79                   .ubwc_slices =
80                      {
81                         {.offset = 0, .pitch = 64},
82                         {.offset = 4096, .pitch = 64},
83                         {.offset = 8192, .pitch = 64},
84                         {.offset = 12288, .pitch = 64},
85                         {.offset = 16384, .pitch = 64},
86                         {.offset = 20480, .pitch = 64},
87                         {.offset = 24576, .pitch = 64},
88                         {.offset = 28672, .pitch = 64},
89                         {.offset = 32768, .pitch = 64},
90                         {.offset = 36864, .pitch = 64},
91                         {.offset = 40960, .pitch = 64},
92                      },
93                },
94          },
95 
96 /* An interesting layout from the blob driver on a630, showing that
97  * per-level pitch must be derived from level 0's pitch, not width0.  We
98  * don't do this level 0 pitch disalignment (we pick 4096), so disabled
99  * this test for now.
100  */
101 #if 0
102 	{
103 		.format = PIPE_FORMAT_R8G8B8A8_UNORM,
104 		.layout = {
105 			.width0 = 1024, .height0 = 1,
106 			.slices = {
107 				{ .offset = 0, .pitch = 5120 },
108 				{ .offset = 5120, .pitch = 2560 },
109 				{ .offset = 7680, .pitch = 1280 },
110 				{ .offset = 8960, .pitch = 768 },
111 				{ .offset = 9728, .pitch = 512 },
112 				{ .offset = 10240, .pitch = 256 },
113 				{ .offset = 10496, .pitch = 256 },
114 				{ .offset = 10752, .pitch = 256 },
115 				{ .offset = 11008, .pitch = 256 },
116 				{ .offset = 11264, .pitch = 256 },
117 				{ .offset = 11520, .pitch = 256 },
118 			},
119 		},
120 	},
121 #endif
122 
123          /* A layout that we failed on (129 wide has a surprise level 1 pitch
124           * increase), and the sizes bracketing it.
125           */
126          {
127             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
128             .layout =
129                {
130                   .width0 = 128,
131                   .height0 = 1,
132                   .slices =
133                      {
134                         {.offset = 0, .pitch = 512},
135                         {.offset = 512, .pitch = 256},
136                         {.offset = 768, .pitch = 256},
137                         {.offset = 1024, .pitch = 256},
138                         {.offset = 1280, .pitch = 256},
139                         {.offset = 1536, .pitch = 256},
140                         {.offset = 1792, .pitch = 256},
141                         {.offset = 2048, .pitch = 256},
142                      },
143                },
144          },
145          {
146             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
147             .layout =
148                {
149                   .width0 = 129,
150                   .height0 = 1,
151                   .slices =
152                      {
153                         {.offset = 0, .pitch = 768},
154                         {.offset = 768, .pitch = 512},
155                         {.offset = 1280, .pitch = 256},
156                         {.offset = 1536, .pitch = 256},
157                         {.offset = 1792, .pitch = 256},
158                         {.offset = 2048, .pitch = 256},
159                         {.offset = 2304, .pitch = 256},
160                         {.offset = 2560, .pitch = 256},
161                      },
162                },
163          },
164          {
165             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
166             .layout =
167                {
168                   .width0 = 130,
169                   .height0 = 1,
170                   .slices =
171                      {
172                         {.offset = 0, .pitch = 768},
173                         {.offset = 768, .pitch = 512},
174                         {.offset = 1280, .pitch = 256},
175                         {.offset = 1536, .pitch = 256},
176                         {.offset = 1792, .pitch = 256},
177                         {.offset = 2048, .pitch = 256},
178                         {.offset = 2304, .pitch = 256},
179                         {.offset = 2560, .pitch = 256},
180                      },
181                },
182          },
183 
184          /* The 129 failure seems to be across formats, let's test some cpps */
185          {
186             .format = PIPE_FORMAT_R8_UNORM,
187             .layout =
188                {
189                   .width0 = 129,
190                   .height0 = 1,
191                   .slices =
192                      {
193                         {.offset = 0, .pitch = 192},
194                         {.offset = 192, .pitch = 128},
195                         {.offset = 320, .pitch = 64},
196                         {.offset = 384, .pitch = 64},
197                         {.offset = 448, .pitch = 64},
198                         {.offset = 512, .pitch = 64},
199                         {.offset = 576, .pitch = 64},
200                         {.offset = 640, .pitch = 64},
201                      },
202                },
203          },
204          {
205             .format = PIPE_FORMAT_R16_UINT,
206             .layout =
207                {
208                   .width0 = 129,
209                   .height0 = 1,
210                   .slices =
211                      {
212                         {.offset = 0, .pitch = 384},
213                         {.offset = 384, .pitch = 256},
214                         {.offset = 640, .pitch = 128},
215                         {.offset = 768, .pitch = 128},
216                         {.offset = 896, .pitch = 128},
217                         {.offset = 1024, .pitch = 128},
218                         {.offset = 1152, .pitch = 128},
219                         {.offset = 1280, .pitch = 128},
220                      },
221                },
222          },
223          {
224             .format = PIPE_FORMAT_R32G32B32A32_FLOAT,
225             .layout =
226                {
227                   .width0 = 129,
228                   .height0 = 1,
229                   .slices =
230                      {
231                         {.offset = 0, .pitch = 3072},
232                         {.offset = 3072, .pitch = 2048},
233                         {.offset = 5120, .pitch = 1024},
234                         {.offset = 6144, .pitch = 1024},
235                         {.offset = 7168, .pitch = 1024},
236                         {.offset = 8192, .pitch = 1024},
237                         {.offset = 9216, .pitch = 1024},
238                         {.offset = 10240, .pitch = 1024},
239                      },
240                },
241          },
242 
243          /* The 129 failure replicated at every +256 pixels wide.  Pick one of
244           * them, and this time increase the height as a new variable as well.
245           */
246          {
247             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
248             .layout =
249                {
250                   .width0 = 385,
251                   .height0 = 128,
252                   .slices =
253                      {
254                         {.offset = 0, .pitch = 1792},
255                         {.offset = 229376, .pitch = 1024},
256                         {.offset = 294912, .pitch = 512},
257                         {.offset = 311296, .pitch = 256},
258                         {.offset = 315392, .pitch = 256},
259                         {.offset = 317440, .pitch = 256},
260                         {.offset = 318464, .pitch = 256},
261                         {.offset = 318976, .pitch = 256},
262                         {.offset = 319232, .pitch = 256},
263                      },
264                },
265          },
266 
267          /* At 257-259 (and replicated every +256 pixels) we had another
268             failure. */
269          {
270             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
271             .layout =
272                {
273                   .width0 = 257,
274                   .height0 = 1,
275                   .slices =
276                      {
277                         {.offset = 0, .pitch = 1280},
278                         {.offset = 1280, .pitch = 768},
279                         {.offset = 2048, .pitch = 512},
280                         {.offset = 2560, .pitch = 256},
281                         {.offset = 2816, .pitch = 256},
282                         {.offset = 3072, .pitch = 256},
283                         {.offset = 3328, .pitch = 256},
284                         {.offset = 3584, .pitch = 256},
285                         {.offset = 3840, .pitch = 256},
286                      },
287                },
288          },
289          {
290             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
291             .layout =
292                {
293                   .width0 = 258,
294                   .height0 = 1,
295                   .slices =
296                      {
297                         {.offset = 0, .pitch = 1280},
298                         {.offset = 1280, .pitch = 768},
299                         {.offset = 2048, .pitch = 512},
300                         {.offset = 2560, .pitch = 256},
301                         {.offset = 2816, .pitch = 256},
302                         {.offset = 3072, .pitch = 256},
303                         {.offset = 3328, .pitch = 256},
304                         {.offset = 3584, .pitch = 256},
305                         {.offset = 3840, .pitch = 256},
306                      },
307                },
308          },
309          {
310             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
311             .layout =
312                {
313                   .width0 = 259,
314                   .height0 = 1,
315                   .slices =
316                      {
317                         {.offset = 0, .pitch = 1280},
318                         {.offset = 1280, .pitch = 768},
319                         {.offset = 2048, .pitch = 512},
320                         {.offset = 2560, .pitch = 256},
321                         {.offset = 2816, .pitch = 256},
322                         {.offset = 3072, .pitch = 256},
323                         {.offset = 3328, .pitch = 256},
324                         {.offset = 3584, .pitch = 256},
325                         {.offset = 3840, .pitch = 256},
326                      },
327                },
328          },
329          {
330             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
331             .layout =
332                {
333                   .width0 = 260,
334                   .height0 = 1,
335                   .slices =
336                      {
337                         {.offset = 0, .pitch = 1280},
338                         {.offset = 1280, .pitch = 768},
339                         {.offset = 2048, .pitch = 512},
340                         {.offset = 2560, .pitch = 256},
341                         {.offset = 2816, .pitch = 256},
342                         {.offset = 3072, .pitch = 256},
343                         {.offset = 3328, .pitch = 256},
344                         {.offset = 3584, .pitch = 256},
345                         {.offset = 3840, .pitch = 256},
346                      },
347                },
348          },
349 
350          /* And, again for the 257-9 failure, test a replica with a larger size*/
351          {
352             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
353             .layout =
354                {
355                   .width0 = 513,
356                   .height0 = 32,
357                   .slices =
358                      {
359                         {.offset = 0, .pitch = 2304},
360                         {.offset = 73728, .pitch = 1280},
361                         {.offset = 94208, .pitch = 768},
362                         {.offset = 100352, .pitch = 512},
363                         {.offset = 102400, .pitch = 256},
364                         {.offset = 102912, .pitch = 256},
365                         {.offset = 103168, .pitch = 256},
366                         {.offset = 103424, .pitch = 256},
367                         {.offset = 103680, .pitch = 256},
368                         {.offset = 103936, .pitch = 256},
369                      },
370                },
371          },
372 
373          /* Oh, look.  The 513-517 failure extends up to 518 at the next texture
374           * level!
375           */
376          {
377             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
378             .layout =
379                {
380                   .width0 = 518,
381                   .height0 = 1,
382                   .slices =
383                      {
384                         {.offset = 0, .pitch = 2304},
385                         {.offset = 2304, .pitch = 1280},
386                         {.offset = 3584, .pitch = 768},
387                         {.offset = 4352, .pitch = 512},
388                         {.offset = 4864, .pitch = 256},
389                         {.offset = 5120, .pitch = 256},
390                         {.offset = 5376, .pitch = 256},
391                         {.offset = 5632, .pitch = 256},
392                         {.offset = 5888, .pitch = 256},
393                         {.offset = 6144, .pitch = 256},
394                      },
395                },
396          },
397 
398          /* Tiled mode testing of the unusual 1/2-bytes-per-pixel pitch
399             alignment */
400          {
401             .format = PIPE_FORMAT_R8_UNORM,
402             .layout =
403                {
404                   .tile_mode = TILE6_3,
405                   .width0 = 129,
406                   .height0 = 1,
407                   .slices =
408                      {
409                         {.offset = 0, .pitch = 256},
410                         {.offset = 8192, .pitch = 128},
411                         {.offset = 12288, .pitch = 128},
412                         {.offset = 16384, .pitch = 128},
413                         {.offset = 20480, .pitch = 128},
414                         {.offset = 20608, .pitch = 128},
415                         {.offset = 20736, .pitch = 128},
416                         {.offset = 20864, .pitch = 128},
417                      },
418                },
419          },
420 
421          /* Single-level RGBA8888 UBWC following UBWC alignment rules laid out
422           * in msm_media_info.h to verify that we don't break buffer sharing.
423           */
424          {
425             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
426             .layout =
427                {
428                   .tile_mode = TILE6_3,
429                   .ubwc = true,
430                   .width0 = 16384,
431                   .height0 = 129,
432                   .slices =
433                      {
434                         {.offset = 1024 * 48, .pitch = 16384 * 4},
435                      },
436                   .ubwc_slices =
437                      {
438                         {.offset = 0, .pitch = 1024},
439                      },
440                },
441          },
442 
443          /* UBWC: Pitch comes from POT-aligned level 0. */
444          /* Pitch fixed in this commit, but offsets broken.  Will be fixed in
445           * following commits.
446           */
447          {
448             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
449             .layout =
450                {
451                   .tile_mode = TILE6_3,
452                   .ubwc = true,
453                   .width0 = 2049,
454                   .height0 = 128,
455                   .slices =
456                      {
457                         {.offset = 0, .pitch = 8448},
458                         {.offset = 1081344, .pitch = 4352},
459                         {.offset = 1359872, .pitch = 2304},
460                         {.offset = 1433600, .pitch = 1280},
461                         {.offset = 1454080, .pitch = 768},
462                         {.offset = 1466368, .pitch = 512},
463                         {.offset = 1474560, .pitch = 256},
464                         {.offset = 1478656, .pitch = 256},
465                         {.offset = 1482752, .pitch = 256},
466                         {.offset = 1486848, .pitch = 256},
467                         {.offset = 1490944, .pitch = 256},
468                         {.offset = 1495040, .pitch = 256},
469                      },
470                   .ubwc_slices =
471                      {
472                         {.offset = 0, .pitch = 256},
473                         {.offset = 16384, .pitch = 128},
474                         {.offset = 24576, .pitch = 64},
475                         {.offset = 28672, .pitch = 64},
476                         {.offset = 32768, .pitch = 64},
477                         {.offset = 36864, .pitch = 64},
478                         {.offset = 40960, .pitch = 64},
479                         {.offset = 45056, .pitch = 64},
480                         {.offset = 49152, .pitch = 64},
481                         {.offset = 53248, .pitch = 64},
482                         {.offset = 57344, .pitch = 64},
483                         {.offset = 61440, .pitch = 64},
484                      },
485                },
486          },
487          /* UBWC: Height comes from POT-aligned level 0. */
488          {
489             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
490             .layout =
491                {
492                   .tile_mode = TILE6_3,
493                   .ubwc = true,
494                   .width0 = 1024,
495                   .height0 = 1025,
496                   .slices =
497                      {
498                         {.offset = 0, .pitch = 4096},
499                         {.offset = 4259840, .pitch = 2048},
500                         {.offset = 5308416, .pitch = 1024},
501                         {.offset = 5570560, .pitch = 512},
502                         {.offset = 5636096, .pitch = 256},
503                         {.offset = 5652480, .pitch = 256},
504                         {.offset = 5660672, .pitch = 256},
505                         {.offset = 5664768, .pitch = 256},
506                         {.offset = 5668864, .pitch = 256},
507                         {.offset = 5672960, .pitch = 256},
508                         {.offset = 5677056, .pitch = 256},
509                      },
510                   .ubwc_slices =
511                      {
512                         {.offset = 0, .pitch = 64},
513                         {.offset = 32768, .pitch = 64},
514                         {.offset = 49152, .pitch = 64},
515                         {.offset = 57344, .pitch = 64},
516                         {.offset = 61440, .pitch = 64},
517                         {.offset = 65536, .pitch = 64},
518                         {.offset = 69632, .pitch = 64},
519                         {.offset = 73728, .pitch = 64},
520                         {.offset = 77824, .pitch = 64},
521                         {.offset = 81920, .pitch = 64},
522                         {.offset = 86016, .pitch = 64},
523                      },
524                },
525          },
526 
527          /* UBWC: Get at minimum height of a level across cpps */
528          {
529             .format = PIPE_FORMAT_R16_UINT,
530             .layout =
531                {
532                   .tile_mode = TILE6_3,
533                   .ubwc = true,
534                   .width0 = 16384,
535                   .height0 = 1,
536                   .slices =
537                      {
538                         {.offset = 0, .pitch = 32768},
539                         {.offset = 524288, .pitch = 16384},
540                         {.offset = 786432, .pitch = 8192},
541                         {.offset = 917504, .pitch = 4096},
542                         {.offset = 983040, .pitch = 2048},
543                         {.offset = 1015808, .pitch = 1024},
544                         {.offset = 1032192, .pitch = 512},
545                         {.offset = 1040384, .pitch = 256},
546                         {.offset = 1044480, .pitch = 256},
547                         {.offset = 1048576, .pitch = 256},
548                         {.offset = 1052672, .pitch = 256},
549                         {.offset = 1056768, .pitch = 256},
550                         {.offset = 1060864, .pitch = 256},
551                         {.offset = 1064960, .pitch = 256},
552                         {.offset = 1069056, .pitch = 256},
553                      },
554                   .ubwc_slices =
555                      {
556                         {.offset = 0, .pitch = 1024},
557                         {.offset = 65536, .pitch = 512},
558                         {.offset = 98304, .pitch = 256},
559                         {.offset = 114688, .pitch = 128},
560                         {.offset = 122880, .pitch = 64},
561                         {.offset = 126976, .pitch = 64},
562                         {.offset = 131072, .pitch = 64},
563                         {.offset = 135168, .pitch = 64},
564                         {.offset = 139264, .pitch = 64},
565                         {.offset = 143360, .pitch = 64},
566                         {.offset = 147456, .pitch = 64},
567                         {.offset = 151552, .pitch = 64},
568                         {.offset = 155648, .pitch = 64},
569                         {.offset = 159744, .pitch = 64},
570                         {.offset = 163840, .pitch = 64},
571                      },
572                },
573          },
574          {
575             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
576             .layout =
577                {
578                   .tile_mode = TILE6_3,
579                   .ubwc = true,
580                   .width0 = 16384,
581                   .height0 = 1,
582                   .slices =
583                      {
584                         {.offset = 0, .pitch = 65536},
585                         {.offset = 1048576, .pitch = 32768},
586                         {.offset = 1572864, .pitch = 16384},
587                         {.offset = 1835008, .pitch = 8192},
588                         {.offset = 1966080, .pitch = 4096},
589                         {.offset = 2031616, .pitch = 2048},
590                         {.offset = 2064384, .pitch = 1024},
591                         {.offset = 2080768, .pitch = 512},
592                         {.offset = 2088960, .pitch = 256},
593                         {.offset = 2093056, .pitch = 256},
594                         {.offset = 2097152, .pitch = 256},
595                         {.offset = 2101248, .pitch = 256},
596                         {.offset = 2105344, .pitch = 256},
597                         {.offset = 2109440, .pitch = 256},
598                         {.offset = 2113536, .pitch = 256},
599                      },
600                   .ubwc_slices =
601                      {
602                         {.offset = 0, .pitch = 1024},
603                         {.offset = 65536, .pitch = 512},
604                         {.offset = 98304, .pitch = 256},
605                         {.offset = 114688, .pitch = 128},
606                         {.offset = 122880, .pitch = 64},
607                         {.offset = 126976, .pitch = 64},
608                         {.offset = 131072, .pitch = 64},
609                         {.offset = 135168, .pitch = 64},
610                         {.offset = 139264, .pitch = 64},
611                         {.offset = 143360, .pitch = 64},
612                         {.offset = 147456, .pitch = 64},
613                         {.offset = 151552, .pitch = 64},
614                         {.offset = 155648, .pitch = 64},
615                         {.offset = 159744, .pitch = 64},
616                         {.offset = 163840, .pitch = 64},
617                      },
618                },
619          },
620          {
621             .format = PIPE_FORMAT_R32G32B32A32_FLOAT,
622             .layout =
623                {
624                   .tile_mode = TILE6_3,
625                   .ubwc = true,
626                   .width0 = 16384,
627                   .height0 = 1,
628                   .slices =
629                      {
630                         {.offset = 0, .pitch = 262144},
631                         {.offset = 4194304, .pitch = 131072},
632                         {.offset = 6291456, .pitch = 65536},
633                         {.offset = 7340032, .pitch = 32768},
634                         {.offset = 7864320, .pitch = 16384},
635                         {.offset = 8126464, .pitch = 8192},
636                         {.offset = 8257536, .pitch = 4096},
637                         {.offset = 8323072, .pitch = 2048},
638                         {.offset = 8355840, .pitch = 1024},
639                         {.offset = 8372224, .pitch = 1024},
640                         {.offset = 8388608, .pitch = 1024},
641                         {.offset = 8404992, .pitch = 1024},
642                         {.offset = 8421376, .pitch = 1024},
643                         {.offset = 8437760, .pitch = 1024},
644                         {.offset = 8454144, .pitch = 1024},
645                      },
646                   .ubwc_slices =
647                      {
648                         {.offset = 0, .pitch = 4096},
649                         {.offset = 262144, .pitch = 2048},
650                         {.offset = 393216, .pitch = 1024},
651                         {.offset = 458752, .pitch = 512},
652                         {.offset = 491520, .pitch = 256},
653                         {.offset = 507904, .pitch = 128},
654                         {.offset = 516096, .pitch = 64},
655                         {.offset = 520192, .pitch = 64},
656                         {.offset = 524288, .pitch = 64},
657                         {.offset = 528384, .pitch = 64},
658                         {.offset = 532480, .pitch = 64},
659                         {.offset = 536576, .pitch = 64},
660                         {.offset = 540672, .pitch = 64},
661                         {.offset = 544768, .pitch = 64},
662                         {.offset = 548864, .pitch = 64},
663                      },
664                },
665          },
666 
667          {
668             .format = PIPE_FORMAT_R8G8B8A8_UNORM,
669             .layout =
670                {
671                   .tile_mode = TILE6_3,
672                   .ubwc = true,
673                   .nr_samples = 4,
674                   .width0 = 412,
675                   .height0 = 732,
676                   .slices =
677                      {
678                         {.offset = 0, .pitch = 7168},
679                      },
680                   .ubwc_slices =
681                      {
682                         {.offset = 0, .pitch = 128},
683                      },
684                },
685          },
686 
687          /* Easy 32x32x32 3d case */
688          {
689             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
690             .is_3d = true,
691             .layout =
692                {
693                   .tile_mode = TILE6_3,
694                   .ubwc = false,
695                   .width0 = 32,
696                   .height0 = 32,
697                   .depth0 = 32,
698                   .slices =
699                      {
700                         {.offset = 0, .pitch = 256, .size0 = 8192},
701                         {.offset = 262144, .pitch = 256, .size0 = 4096},
702                         {.offset = 327680, .pitch = 256, .size0 = 4096},
703                         {.offset = 360448, .pitch = 256, .size0 = 4096},
704                         {.offset = 376832, .pitch = 256, .size0 = 4096},
705                         {.offset = 385024, .pitch = 256},
706                      },
707                },
708          },
709 
710          /* Scale up a bit to 128x128x32 3d */
711          {
712             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
713             .is_3d = true,
714             .layout =
715                {
716                   .tile_mode = TILE6_3,
717                   .ubwc = false,
718                   .width0 = 128,
719                   .height0 = 128,
720                   .depth0 = 32,
721                   .slices =
722                      {
723                         {.offset = 0, .pitch = 512, .size0 = 65536},
724                         {.offset = 2097152, .pitch = 256, .size0 = 16384},
725                         {.offset = 2359296, .pitch = 256, .size0 = 8192},
726                         {.offset = 2424832, .pitch = 256, .size0 = 8192},
727                         {.offset = 2457600, .pitch = 256, .size0 = 8192},
728                         {.offset = 2473984, .pitch = 256},
729                         {.offset = 2482176, .pitch = 256},
730                         {.offset = 2490368, .pitch = 256},
731                      },
732                },
733          },
734 
735          /* Changing width to 1 changes where minimum layer size happens. */
736          {
737             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
738             .is_3d = true,
739             .layout =
740                {
741                   .tile_mode = TILE6_LINEAR,
742                   .ubwc = false,
743                   .width0 = 1,
744                   .height0 = 128,
745                   .depth0 = 32,
746                   .slices =
747                      {
748                         {.offset = 0, .pitch = 256, .size0 = 32768},
749                         {.offset = 1048576, .pitch = 256, .size0 = 16384},
750                         {.offset = 1310720, .pitch = 256, .size0 = 16384},
751                         {.offset = 1441792, .pitch = 256, .size0 = 16384},
752                         {.offset = 1507328, .pitch = 256, .size0 = 16384},
753                         {.offset = 1540096, .pitch = 256},
754                         {.offset = 1556480, .pitch = 256},
755                         {.offset = 1572864, .pitch = 256},
756                      },
757                },
758          },
759 
760          /* And increasing width makes it happen later. */
761          {
762             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
763             .is_3d = true,
764             .layout =
765                {
766                   .tile_mode = TILE6_3,
767                   .ubwc = false,
768                   .width0 = 1024,
769                   .height0 = 128,
770                   .depth0 = 32,
771                   .slices =
772                      {
773                         {.offset = 0, .pitch = 4096, .size0 = 524288},
774                         {.offset = 16777216, .pitch = 2048, .size0 = 131072},
775                         {.offset = 18874368, .pitch = 1024, .size0 = 32768},
776                         {.offset = 19136512, .pitch = 512, .size0 = 8192},
777                         {.offset = 19169280, .pitch = 256, .size0 = 4096},
778                         {.offset = 19177472, .pitch = 256},
779                         {.offset = 19181568, .pitch = 256},
780                         {.offset = 19185664, .pitch = 256},
781                         {.offset = 19189760, .pitch = 256},
782                         {.offset = 19193856, .pitch = 256},
783                         {.offset = 19197952, .pitch = 256},
784                      },
785                },
786          },
787 
788          /* NPOT height case that piglit was catching 3d texture failure in, we
789           * use a higher depth though to get more slice pitches detected from
790           * the blob.
791           */
792          {
793             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
794             .is_3d = true,
795             .layout =
796                {
797                   .tile_mode = TILE6_3,
798                   .ubwc = false,
799                   .width0 = 128,
800                   .height0 = 129,
801                   .depth0 = 16,
802                   .slices =
803                      {
804                         {.offset = 0, .pitch = 512, .size0 = 73728},
805                         {.offset = 1179648, .pitch = 256, .size0 = 20480},
806                         {.offset = 1343488, .pitch = 256, .size0 = 20480},
807                         {.offset = 1425408, .pitch = 256, .size0 = 20480},
808                         {.offset = 1466368, .pitch = 256},
809                         {.offset = 1486848, .pitch = 256},
810                         {.offset = 1507328, .pitch = 256},
811                         {.offset = 1527808, .pitch = 256},
812                      },
813                },
814          },
815 
816          /* NPOT height case that my first 3d layout ideas failed on. */
817          {
818             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
819             .is_3d = true,
820             .layout =
821                {
822                   .tile_mode = TILE6_3,
823                   .ubwc = false,
824                   .width0 = 128,
825                   .height0 = 132,
826                   .depth0 = 16,
827                   .slices =
828                      {
829                         {.offset = 0, .pitch = 512, .size0 = 73728},
830                         {.offset = 1179648, .pitch = 256, .size0 = 20480},
831                         {.offset = 1343488, .pitch = 256, .size0 = 20480},
832                         {.offset = 1425408, .pitch = 256, .size0 = 20480},
833                         {.offset = 1466368, .pitch = 256},
834                         {.offset = 1486848, .pitch = 256},
835                         {.offset = 1507328, .pitch = 256},
836                         {.offset = 1527808, .pitch = 256},
837                      },
838                },
839          },
840 
841          /* blob used MIN_LAYERSZ = 0x3000 here.
842           *
843           * This is an interesting case for 3d layout, since pitch stays NPOT for a while.
844           */
845          {
846             .format = PIPE_FORMAT_R9G9B9E5_FLOAT,
847             .is_3d = true,
848             .layout =
849                {
850                   .tile_mode = TILE6_3,
851                   .ubwc = false,
852                   .width0 = 768,
853                   .height0 = 32,
854                   .depth0 = 128,
855                   .slices =
856                      {
857                         {.offset = 0, .pitch = 3072, .size0 = 98304},
858                         {.offset = 12582912, .pitch = 1536, .size0 = 24576},
859                         {.offset = 14155776, .pitch = 768, .size0 = 12288},
860                         {.offset = 14548992, .pitch = 512, .size0 = 12288},
861                         {.offset = 14745600, .pitch = 256, .size0 = 12288},
862                         {.offset = 14843904, .pitch = 256, .size0 = 12288},
863                         {.offset = 14893056, .pitch = 256, .size0 = 12288},
864                         {.offset = 14917632, .pitch = 256},
865                         {.offset = 14929920, .pitch = 256},
866                         {.offset = 14942208, .pitch = 256},
867                      },
868                },
869          },
870 
871          /* dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.rgba32f_rg11_eac.texture3d_to_texture2d */
872 #if 0 /* XXX: We disagree with the blob about level 0 size0, but the testcase passes. */
873          {
874             .format = PIPE_FORMAT_R32G32B32A32_FLOAT,
875             .is_3d = true,
876             .layout =
877                {
878                   .tile_mode = TILE6_3,
879                   .ubwc = false,
880                   .width0 = 129,
881                   .height0 = 129,
882                   .depth0 = 17,
883                   .slices =
884                      {
885                         {.offset = 0, .pitch = 3072, .size0 = 524288},
886                         {.offset = 8912896, .pitch = 2048, .size0 = 131072},
887                         {.offset = 9961472, .pitch = 1024, .size0 = 32768},
888                         {.offset = 10092544, .pitch = 1024, .size0 = 16384},
889                         {.offset = 10125312, .pitch = 1024},
890                         {.offset = 10141696, .pitch = 1024},
891                         {.offset = 10158080, .pitch = 1024},
892                         {.offset = 10174464, .pitch = 1024},
893                      },
894                },
895          },
896 #endif
897 
898          /* Size minification issue found while looking at the above test. */
899          {
900             .format = PIPE_FORMAT_R32G32B32A32_FLOAT,
901             .is_3d = true,
902             .layout =
903                {
904                   .tile_mode = TILE6_3,
905                   .ubwc = false,
906                   .width0 = 129,
907                   .height0 = 9,
908                   .depth0 = 8,
909                   .slices =
910                      {
911                         {.offset = 0, .pitch = 3072, .size0 = 49152},
912                         {.offset = 393216, .pitch = 2048, .size0 = 32768},
913                         {.offset = 524288, .pitch = 1024, .size0 = 32768},
914                         {.offset = 589824, .pitch = 1024},
915                         {.offset = 622592, .pitch = 1024},
916                         {.offset = 655360, .pitch = 1024},
917                         {.offset = 688128, .pitch = 1024},
918                         {.offset = 720896, .pitch = 1024},
919                      },
920                },
921          },
922 
923 };
924 
925 int
main(int argc,char ** argv)926 main(int argc, char **argv)
927 {
928    int ret = 0;
929 
930    for (int i = 0; i < ARRAY_SIZE(testcases); i++) {
931       if (!fdl_test_layout(&testcases[i], 630))
932          ret = 1;
933    }
934 
935    return ret;
936 }
937