#纹理 #内存布局 #Wii #平铺 #缓存 #像素 #swizzling

不使用std wiiu_swizzle

Wii U纹理内存平铺

3个版本 (破坏性)

0.3.0 2024年6月13日
0.2.0 2024年5月17日
0.1.0 2024年4月27日

算法 中排名 729

每月下载 27
3 个crate中使用(通过 xc3_lib

MIT 协议

500KB
2K SLoC

wiiu_swizzle

Latest Version docs.rs

Wii U纹理内存平铺或“swizzling”的纯Rust安全且高效的实现。此库仍然是实验性的,缺少一些重要功能和错误修复。此crate有一个可选的"std"特性,可以禁用以用于支持allocno_std环境。

内存平铺

GPU纹理通常存储在平铺的内存布局中,以便使纹理访问更符合缓存友好性。标准线性或行主序内存排序仅在数据按行主序访问时才符合缓存友好性。对于模型图像纹理来说,这很少是情况。因此,表面的字节被重新排列,以使用某种形式的平铺算法来提高缓存未命中次数。

需要注意的是,平铺会影响内存寻址,因此表面应被视为字节二维或三维数组,而不是像素或4x4像素块。一些函数需要使用在addrlib代码中使用的每个像素的字节或位。对于压缩格式,“像素”通常是一个4x4像素块。对于平铺正确工作的表面维度,不需要是2的幂。

这个技术在模组社区中常被称为“swizzling”、“deswizzling”、“unswizzling”或“un-swizzling”。将平铺地址位描述为从线性地址位重新排列或“swizzled”是不准确的,对于所有纹理大小来说。幸运的是,模组社区中“swizzling”一词的常见用法几乎总是指特定的平铺内存布局算法。为了提高可发现性,术语“swizzling”保留在crate和函数名称中,因为这是大多数程序员可能搜索的内容。

致谢

这个项目的很大一部分是从Mesa驱动程序的开放源代码C++代码翻译过来的,由decaf-emu/addrlib许可协议)改编,并从Cemu许可协议)中获取了Wii U特定的常量。Cemu还被用来生成测试案例的数据,通过从RenderDoc提取“解压”的表面数据,并使用具有唯一索引的特殊纹理来分配每个4字节块。这提供了从线性到瓦片内存地址的映射。请参阅源代码以获取详细信息。

依赖项

~0.9–1.4MB
~29K SLoC