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的硬件上。

相关推荐
韦德斯20 小时前
嵌入式Linux的RTC读写操作应用
linux·运维·c语言·arm开发·实时音视频
byte轻骑兵20 小时前
嵌入式 ARM Linux 系统构成全解:从硬件到应用层层剖析
linux·arm开发·arm·嵌入式开发
思尔芯S2C1 天前
面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
arm开发·架构·汽车·iot·fpga原型验证·prototyping·智慧视觉
Eternal-Student2 天前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
不怕犯错,就怕不做2 天前
修复kernel编译栈帧大小异常问题error: the frame size of 1928 bytes is larger than 1024 bytes
linux·arm开发·驱动开发
憧憬一下3 天前
UART硬件介绍
arm开发·嵌入式硬件·串口·嵌入式·linux驱动开发
Petal9909124 天前
UEFI学习笔记(十八):ARM电源管理之PSCI和SCMI概述
arm开发·笔记·学习·uefi
古月居GYH4 天前
一文了解ARM内部架构
arm开发·架构
白书宇4 天前
13.100ASK_T113-PRO RTC实验
linux·arm开发·驱动开发·嵌入式硬件·物联网·硬件工程
简简单单一天吃六顿5 天前
rootfs根文件系统在Linux下制作动态库
linux·服务器·arm开发·iot