Utgard风格的平铺和Arm FrameBuffer Compression(AFBC)

Utgard风格的平铺和Arm FrameBuffer Compression(AFBC)是两种不同的纹理和帧缓冲区压缩技术,它们在性能上有显著差异。

Utgard风格的平铺

Utgard风格的平铺是一种软件编码和解码的纹理和帧缓冲区平铺格式,旨在提高2D空间局部性,从而在水平和垂直方向上改善缓存局部性。这种平铺格式在Midgard GPU上也被支持,可以用于纹理和帧缓冲区。然而,在实践中,它通常作为备用布局使用;Midgard引入了Arm FrameBuffer Compression,这是比Utgard风格的平铺显著更高效的布局,并且在可能的情况下,它被优先用于纹理和帧缓冲区。对于不支持的纹理类型,例如sRGB纹理和帧缓冲区,这种平铺方案以性能损失为代价使用,因为AFBC不兼容。

也叫做:"Utgard风格的平铺"、"(Mali) 交换纹理"和"U-交错"(前两个名称在Lima/Panfrost驱动程序社区中使用,后者在Arm内部使用)。

实现原理:

图像尺寸必须沿每个轴对齐到16像素。一旦对齐,图像被划分为16x16的块。

每个16x16块中的位根据以下模式重新排序:

| y3 | (x3 ^ y3) | y2 | (y2 ^ x2) | y1 | (y1 ^ x1) | y0 | (y0 ^ x0) |

这基本上是交错X和Y位,每对相邻位之间插入XOR。

用途:

这种平铺格式旨在提高2D空间局部性,从而在水平和垂直方向上改善缓存局部性。

注意事项:

  1. 这种格式在Midgard GPU上也被支持,可以用于纹理和帧缓冲区。然而,在实践中,它通常作为备用布局使用;Midgard引入了Arm FrameBuffer Compression,这是比Utgard风格的平铺显著更高效的布局,并且在可能的情况下,它被优先用于纹理和帧缓冲区。对于不支持的纹理类型,例如sRGB纹理和帧缓冲区,这种平铺方案以性能损失为代价使用,因为AFBC不兼容。

  2. 软件实现需要一些技巧,将模式划分为两行:

| y3 | y3 | y2 | y2 | y1 | y1 | y0 | y0 |

^ | 0 | x3 | 0 | x2 | 0 | x1 | 0 | x0 |

其中,Y位的位重复,X位的位被分散。顶行仅取决于Y,因此可以每行计算一次并存储在寄存器中。底行只是分散的X。分散X可以通过查找表或通过减去+AND掩码模式(利用进位位)来实现。

Arm FrameBuffer Compression (AFBC)

AFBC是一种硬件加速的帧缓冲区压缩技术,旨在提高帧缓冲区的存储效率和传输效率。它通过将帧缓冲区数据压缩为更小的块,从而减少内存占用和带宽需求。AFBC支持多种压缩模式,包括4:2:0、4:2:2和4:4:4,并且可以处理各种纹理格式,包括sRGB纹理和帧缓冲区。

实现原理

AFBC的实现原理基于以下步骤:

  • 图像分割:将图像分割为多个块,每个块的大小取决于压缩模式。例如,对于4:2:0压缩模式,每个块的大小为16x16像素。
  • 颜色空间转换:将图像从RGB颜色空间转换为YUV颜色空间,以便更好地压缩颜色信息。
  • 颜色量化:将颜色信息量化为较小的值,以便更好地压缩。
  • 熵编码:使用熵编码算法(如Huffman编码)对颜色信息进行编码,以进一步减少数据量。
  • 压缩块:将编码后的颜色信息压缩为更小的块,以便更好地存储和传输。

注意事项

软件实现AFBC通常需要大量的计算资源和内存资源,因此通常需要使用高性能的处理器和足够的内存。此外,软件实现AFBC的压缩效率和解码速度通常比硬件加速的AFBC差,因此通常不推荐在生产环境中使用。

性能比较

  • 压缩效率:AFBC通常提供更高的压缩效率,这意味着在相同的内存占用下,可以存储更多的图像数据。Utgard风格的平铺的压缩效率相对较低,因为它是一种软件编码和解码的方案。
  • 解码速度:AFBC的解码速度通常比Utgard风格的平铺快,因为AFBC是硬件加速的。Utgard风格的平铺需要软件解码,这通常比硬件解码慢。
  • 兼容性:AFBC支持更多的纹理格式和帧缓冲区格式,包括sRGB纹理和帧缓冲区。Utgard风格的平铺可能不兼容某些特定的纹理格式和帧缓冲区格式。
  • 内存占用:AFBC的内存占用通常比Utgard风格的平铺小,因为AFBC使用更高效的压缩算法。Utgard风格的平铺的内存占用较大,因为它需要存储额外的解码数据。

综上所述,AFBC通常比Utgard风格的平铺在性能上有优势,特别是在压缩效率、解码速度和内存占用方面。然而,Utgard风格的平铺在某些情况下仍然有用,特别是在不支持AFBC的硬件上。

相关推荐
17(无规则自律)5 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞17 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发