WebGPUのデータレイアウト不一致をFacetで自動検出する
Testing WebGPU data layouts with Facet
GPUコンピュートシェーダーでは、ホストとシェーダー間で設定データを共有する際に、RustとWGSLのレイアウト規則の微妙な違いが問題になる。例えばmat3x3はWGSLでは48バイトだがRustでは36バイトだ。筆者はFacetのランタイムリフレクションを使い、ユニットテストで自動的にオフセットとサイズを照合する仕組みを構築。既存の設定オブジェクトに問題は見つからなかったが、今後のシェーダー追加時の安全性が大きく向上した。
WGSLでは、mat3x3の各行に4バイトのパディングが入るため、各行は合計16バイトで行列全体は48バイトになる。Rustでは[[f32; 3]; 3]は密にパックされるため、わずか36バイトしか占めない。