39 lines
2.0 KiB
ReStructuredText
39 lines
2.0 KiB
ReStructuredText
![]() |
|
||
|
U-interleaved tiling
|
||
|
====================
|
||
|
|
||
|
Panfrost supports u-interleaved tiling. U-interleaved tiling is
|
||
|
indicated by the ``DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED`` modifier.
|
||
|
|
||
|
The tiling reorders whole pixels (blocks). It does not compress or modify the
|
||
|
pixels themselves, so it can be used for any image format. Internally, images
|
||
|
are divided into tiles. Tiles occur in source order, but pixels (blocks) within
|
||
|
each tile are reordered according to a space-filling curve.
|
||
|
|
||
|
For regular formats, 16x16 tiles are used. This harmonizes with the default tile
|
||
|
size for binning and CRCs (transaction elimination). It also means a single line
|
||
|
(16 pixels) at 4 bytes per pixel equals a single 64-byte cache line.
|
||
|
|
||
|
For formats that are already block compressed (S3TC, RGTC, etc), 4x4 tiles are
|
||
|
used, where entire blocks are reorder. Most of these formats compress 4x4
|
||
|
blocks, so this gives an effective 16x16 tiling. This justifies the tile size
|
||
|
intuitively, though it's not a rule: ASTC may uses larger blocks.
|
||
|
|
||
|
Within a tile, the X and Y bits are interleaved (like Morton order), but with a
|
||
|
twist: adjacent bit pairs are XORed. The reason to add XORs is not obvious.
|
||
|
Visually, addresses take the form::
|
||
|
|
||
|
| y3 | (x3 ^ y3) | y2 | (y2 ^ x2) | y1 | (y1 ^ x1) | y0 | (y0 ^ x0) |
|
||
|
|
||
|
Reference routines to encode/decode u-interleaved images are available in
|
||
|
``src/panfrost/shared/test/test-tiling.cpp``, which documents the space-filling
|
||
|
curve. This reference implementation is used to unit test the optimized
|
||
|
implementation used in production. The optimized implementation is available in
|
||
|
``src/panfrost/shared/pan_tiling.c``.
|
||
|
|
||
|
Although these routines are part of Panfrost, they are also used by Lima, as Arm
|
||
|
introduced the format with Utgard. It is the only tiling supported on Utgard. On
|
||
|
Mali-T760 and newer, Arm Framebuffer Compression (AFBC) is more efficient and
|
||
|
should be used instead where possible. However, not all formats are
|
||
|
compressible, so u-interleaved tiling remains an important fallback on Panfrost.
|