WESL (WGSL の拡張) と Slang あたりの動向について調べてメモる
少し前に Khronos 社が Slang イニシアチブを発表したときに、WESL に言及してる人がちらほらいて、あまり両者の位置づけがよくわかっていなかったので勉強がてらメモります。
WESL
まずは WESL から見ていきましょう。
WESL は、WebGPU のためのシェーダー言語 WGSL の拡張です。
具体的には例えば、モジュール化されたコードを import
で読み込めるようにする、みたいな仕組みが検討されているようです。
こんな感じでインポートすると、
import my/geom/sphere/draw;
import bevy_ui/*;
こんな感じで使えるようになるよ、と。
fn main() {
bevy_ui.quad(vec2f(0.0, 1.0), 1.0);
let a = draw(3);
}
ロードマップ
import
以外にも、
- conditional compilation(モバイル向けとデスクトップ向けで実装を切り替える、とか)
- templating(Rust や JavaScript から値を挿入する)
- packaging(WGSL コードを NPM や crates.io にパブリッシュする)
といったことが議論されているようです。
WGSL との関係
「拡張」と聞いてまずよくわからないのは、WGSL(WebGPU)自体がまだ仕様策定中というステータスなのに、なんで拡張するの?、という点です。まずは正式に仕様に入れるかどうかの議論をすればよくない?と素朴に思ったりするんですが、なぜなんでしょう。たぶん、提案したけど仕様には入りそうにない、みたいな経緯があったのかな...?と思ったりしますが、歴史をうまく掘り起こすことができませんでした。
オフィシャルな説明としては、README に「Relationship to W3C WGSL and WebGPU」という項があり、以下のように書かれています。
WESL enhancements features are invisible to WebGPU engines like Dawn and wgpu. All WESL enhancements are translated to vanilla WGSL before being passed to WebGPU calls such as
createShaderModule()
.
実際の WebGPU エンジンは WESL のことは何も知らなくてオッケー。なぜなら WESL で書かれたコードは WebGPU エンジンに渡される前に WGSL に翻訳されるから、とのことです。
つまり、これはトランスパイラ + パッケージマネージャをつくるプロジェクト、みたいな理解でよさそうです。
で、この立ち位置が Slang とけっこうかぶってるのでは?という話になってきます。
Slang
Slang は、オープンソースで開発されている独自のシェーダー言語です。
Slang でシェーダーを書くと、それを様々なターゲットに変換してくれます。↑のウェブサイトに載っている図がわかりやすいので引用します。
もう少し詳しくは、レポジトリの README によると、こういうサポート状況らしいです。〇は「supported」、△ は「experimental」です。
ターゲット | サポート状況 | 出力フォーマット |
---|---|---|
Direct3D 11 | 〇 | HLSL |
Direct3D 12 | 〇 | HLSL |
Vulkan | 〇 | SPIRV, GLSL |
Metal | △ | Metal Shading Language |
WebGPU | △ | WGSL |
CUDA | 〇 | C++ (compute only) |
Optix | △ | C++ (WIP) |
CPU | △ | C++ (kernel), C++ (host), standalone executable, dynamic library |
具体的にどれくらいまでサポートされているのかはドキュメント にもう少し詳しく書かれていますが、WebGPU のサポートはまだこれからという状況のようです。ただ、もし WebGPU がサポートされたら...、
「WESL で書いても WGSL にしか変換できないけど、Slang で書けばもっといろいろ変換できるから Slang の方がよくない??」
みたいな話になってきそうです。
WESL vs Slang
機能
では、機能的には Slang は WESL と比べてどうなの?、というところですが、似たような機能は揃ってそうです。
- モジュールを定義したりインポートしたりできる(https://shader-slang.com/slang/user-guide/modules.html)。
- デバイスの機能に合わせて conditional compilation できる(https://shader-slang.com/slang/user-guide/capabilities.html)。ここは Slang の方が高機能そう。
これに加えて、
- interface や generics を使ってプログラミングできる(https://shader-slang.com/slang/user-guide/interfaces-generics.html)。
- reflection できる(https://shader-slang.com/slang/user-guide/reflection.html)。これはあまり理解できてない...
- 自動微分(https://shader-slang.com/slang/user-guide/autodiff.html)。ML 系で便利らしいです。
などといった機能もあります。templating はないですが、これも Link-time constants というやつで同じことができそうです。
そもそもこのあたりの機能が1対1で比較できるものなのかよくわかってないですが、Slang に軍配が上がりそうな雰囲気を感じます。
正統性
Slang は何と言っても、NVIDIA と Khronos がバックについているというのは強いです。
それも、Khronos が Slang イニシアチブをぶち上げたのは去年ですが、NVIDIA は 2017 年からずっとサポートしています。
採用実績もいろいろあります。↑の記事によると、Autodesk や Valve ではすでにプロダクションで使われているようです。
まあそんなわけで、もし Slang と WESL のユースケースががっつり衝突するのであれば、Slang を使う方に流れていきそうな気がします。
WebGPU vs Slang (?)
実は、Slang は、WebGPU 自体のライバルにもなりうるような面があります。
ここで「WebGPU」というのは、WebGPU 自体の仕様というより、実際の WebGPU 実装(WebGPU エンジン)のことです。
ブラウザ用途だけを想定するなら特に競合するところはないんですが、WebGPU はウェブだけのものではありません。特に Rust のグラフィックス界隈では、デスクトップ向けにも WebGPU を使っています。これはなぜかというと、WGSL で書くと WebGPU エンジンが各 OS のグラフィックス API(Metal、DirectX、Vulkan)に変換してくれるからです(参考: naga)。この変換が、Slang の役割とかぶることになります。
WebGPU を通すと、基本的には WebGPU の仕様に定義されているものしか変換してくれないので、直接そのシェーダー言語で書けば使えるはずの機能が使えない、といったことが起こりえます。
Rust で 2D グラフィックスと UI をやっているグループ linebender のチャットでも Slang が話題になっていました(これで知りました)が、これは、使いたいテクニックを実装するには WebGPU に用意されている API では足りない、みたいなことがあるからみたいです。
以下の linebender のリーダー・Raph Levien さんのコメントを読む感じ、compute shader を使う時に WebGPU の制限に引っ掛かることがあるみたいです。
あと、GPU がない(もしくはめちゃくちゃ貧弱)なデバイスでも動かしたい、という要求を考えると、Slang のターゲットに CPU があるというのも便利そうな感じがします。WebGPU エンジンは CPU へのフォールバック実装までは生成してくれないので。
もちろん、ウェブも重要なターゲットなので、Slang の WGSL サポートが十分な状態になるまでは様子見、ということになるとは思います。
あまりよくわかっていない点
そもそも、シェーダーの変換はできても、それに対応する C++ とか Rust のコードは書かないとだめだと思うんですが、そのあたりが実際どういう感じで対応されているのかいまいちイメージが付いていません。とりあえず手を動かして Slang を使ってみないとわからないことがいろいろありそうです。
あと、ちょうど「What's next for WebGPU」という記事を読んでたんですが、WebGPU では使えるようになっていない GPU の機能がまだまだあるんだなあと思いました。
来月11~13日にある Vulkan のイベントで「What's New in Slang 」というセッションがあるので、ここで何かしらの発表があったりなかったりするのかもしれません。
Discussion