C-WebGL: MS謹製のVulkan実装(Dozen)を使いたい
MesaにはMSがいくつかDirectX12上でMesaを使えるようなコントリビューションを入れているので、MesaのOpenGLやOpenCL、Vulkanがネイティブで動作するようになっている。
以前IntelのVulkanでは正常動作させられなかった自前のWebGL1実装(ただしシェーダコンパイラはglslang)を、この上で動かすことでデバッグしたい。
現状の戦績は:
実装 | 動作 |
---|---|
Intel | × 動作はするが描画しない |
Metal + MoltenVK | ○ 正常動作 |
SwiftShader | △ C-WebGL側のバグでClearが正常動作しない |
Dozen + Intel | × 内部でクラッシュ |
Dozen + Basic Renderer | × 内部でクラッシュ |
Lavapipe(LLVM) | × 内部でクラッシュ |
全然ダメじゃねぇか!もちろんこれらのバックエンドで他のVulkanアプリは正常に動作するので、C-WebGL側が何か(validationには当たらないけど)間違っていることは確定と言って良いのではないだろうか。
Dozenのインストール
DozenはMesaの1バックエンドなのでMesaを普通にビルドすれば良い。。が面倒なのでその辺にあるビルドを使う。
リリースを展開して適当なところに起き、 regedit
でjsonへのパスを設定するとVulkanCapsviewer(Vulkan SDKに収録されている)でGPUとして登録されていることが確認できる。
\HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers
以下に32bit DWORDのキーをjsonへのフルパス名で作成する。 C:\prog\mesa-dist-win\x64\dzn_icd.x86_64.json
のように、dzn_icd.x86_64.json
がDozen実装になっている。lvpの方はLavapipe (llvmpipeによるソフトウェアレンダラ)を表わす。
Vulkan上でGPUを指定する
vkCreateInstance
して vkEnumeratePhysicalDevices
すると、↑のようなVulkan Caps Viewerの順序通りに取れるので、その N 番目という形で指定する。
C-WebGLでは常にゼロ番目にしていたので、とりあえず、指定したければソースコードを一旦書き換える方式にした。CIとかで使うならソフトウェアレンダラに固定したいとか有りそうなので方式を考えないと。。
Vulkan1.0には deviceID
や vendorID
のような仕組みはあるものの、これはDozenとネイティブのVulkan実装を区別するのに使えない(DozenでもIntelのIDを返却する)。Vulkan 1.2では driverInfo
や driverName
がある ので、そこで区別はできる。