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

相关推荐
GilgameshJSS7 小时前
STM32H743-ARM例程33-TOUCH
c语言·arm开发·stm32·单片机·嵌入式硬件
wanhengidc10 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
陌上花开缓缓归以21 小时前
phy降速自愈到100M重试流程分析
arm开发
凉、介21 小时前
ARM 总线技术 —— APB
arm开发·笔记·学习
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
陌上花开缓缓归以2 天前
linux系统启动失败之flash异常分析
arm开发
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的井下AI故障诊断方案——让煤矿远程监控更智能、更精准
网络·arm开发·人工智能·算法·边缘计算
GilgameshJSS3 天前
STM32H743-ARM例程35-DHCP
c语言·arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS3 天前
STM32H743-ARM例程34-BootROM
c语言·arm开发·stm32·单片机·嵌入式硬件
robin8611093 天前
Keil(MDK-ARM)和 STM32CubeIDE对比
arm开发·stm32·嵌入式硬件