Hasty Briefsbeta

双语

Testing WebGPU data layouts with Facet

a day ago
  • GPU计算着色器通常需要在主机(Rust)和着色器(WGSL)结构体布局之间保持对齐,这可能会因填充而产生微妙的差异。
  • 一个常见的问题是,Rust的`[[f32; 3]; 3]`是紧密打包的(36字节),而WGSL的`mat3x3f`有每行填充,导致48字节,造成偏移不匹配。
  • 手动逐字段检查容易出错且缺乏诊断清晰度;使用运行时反射(通过`facet`库)的通用解决方案可以自动化比较。
  • `facet`库为结构体提供`#[derive(facet::Facet)]`,能够针对使用`naga`解析的WGSL结构体自动检查字段偏移和大小。
  • 通用检查函数验证整体结构体大小(处理运行时大小的数组)、字段偏移、字段大小,并确保WGSL中的所有成员在Rust中都存在。
  • 该方法有条件地编译用于测试(`#[cfg_attr(test, derive(facet::Facet))]`),便于轻松集成,且不会在生产构建中增加开销。
  • 这些测试有助于在添加新的计算着色器时主动捕获布局不匹配,提高数据加载正确性的信心。