Open1
MiniShade: 型と定数の処理
実は シェーダのリンカ側に既にほぼ同じ処理がある が、非常に絶妙にセマンティクスが違うため再実装する必要がある。
幸い、SPIR-Vでは全ての定義が事前にソートされていることが保証されている。このため、単に定義を上から下に処理していけば必要な情報を収集できる。
2.4. Logical Layout of a Module
... All operands in all these instructions must be declared before being used. Otherwise, they can be in any order.
SPIR-V 自体は任意のサイズの行列やベクトルを定義できるが、ここではWebGL1が使用できる mat4
までの行列や vec4
までのベクタに対応できれば十分となる。(最適化の都合で bool 型には対応する)
今回は最適化によってローカル変数 (Function
) 、やグローバル変数 (Private
) は全て削除されていることが保証されているため、レジスタに割り当てられない変数は全て定数、読み取り専用のシェーダ入力か、読み書き可能なシェーダ出力 のいずれかということになる。
アセンブラはシェーダモジュール内部で定義された定数のリストをアセンブリと同時に出力する必要がある。この定数が微妙に曲者で、プログラムにロードされていない整数は削るといった最適化をアセンブラ側で行う必要がある。