DRM format modifier
FourCC
FourCC format code是Linux内核DRM子系统用来描述framebuffer像素格式。它们被定义在内核源码include/uapi/drm/drm_fourcc.h. 基本上FourCC format code足以描述framebuffer中像素的内容了,但是随着GPU的更新,原来线性排列的buffers,为了获取更好的性能,可能会采取vendor specific的布局方式。另外,这些buffer也可能保存的是各种不同的压缩数据,这样一来,原来的FourCC format code就无法携带新的buffer
layout或compression format的信息,DRM format modifier就是用来解决这些问题的。
Modifier
Examples
DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED
How U-interleaved improves performance?
What is the block size?
对于 U-interleaved 布局的纹理, 有两种可能的 block size:
- 4x4 (压缩格式)
- 16x16 (非压缩格式)
What is the row stride?
row stride 通常指纹理图片中相邻两行之间的字节数。对于 Linear 布局的纹理, block size 是 1x1, 它的 row stride 即为
这也是所谓的逻辑 row stride, 而对于 U-interleaved 布局的纹理,由于它在内存中是按块存储的(块与块之间是线性的),所以 U-interleaved 布局的纹理的 row stride 已经不是通常意义的“行”了,而是由块组成的行。所以 U-interleaved 布局的纹理的 row stride 为
非压缩格式的 U-interleaved 布局的 row stride
压缩格式的 U-interleaved 布局的 row stride
以 BC1 压缩格式为例, BC1 是 S3TC 家族的一员(所有的 S3TC 家族都使用 4x4 的块大小),而 DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED 是 16x16 大小的,所以一个 U-interleaved 块中包含 4x4 个 BC1 压缩块。