Open3

C-WebGL: MS謹製のVulkan実装(Dozen)を使いたい

okuokuokuoku

MesaにはMSがいくつかDirectX12上でMesaを使えるようなコントリビューションを入れているので、MesaのOpenGLやOpenCL、Vulkanがネイティブで動作するようになっている。

以前IntelのVulkanでは正常動作させられなかった自前のWebGL1実装(ただしシェーダコンパイラはglslang)を、この上で動かすことでデバッグしたい。

https://zenn.dev/okuoku/scraps/90fde30e989842

現状の戦績は:

実装 動作
Intel × 動作はするが描画しない
Metal + MoltenVK ○ 正常動作
SwiftShader △ C-WebGL側のバグでClearが正常動作しない
Dozen + Intel × 内部でクラッシュ
Dozen + Basic Renderer × 内部でクラッシュ
Lavapipe(LLVM) × 内部でクラッシュ

全然ダメじゃねぇか!もちろんこれらのバックエンドで他のVulkanアプリは正常に動作するので、C-WebGL側が何か(validationには当たらないけど)間違っていることは確定と言って良いのではないだろうか。

okuokuokuoku

Dozenのインストール

DozenはMesaの1バックエンドなのでMesaを普通にビルドすれば良い。。が面倒なのでその辺にあるビルドを使う。

https://github.com/pal1000/mesa-dist-win

リリースを展開して適当なところに起き、 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によるソフトウェアレンダラ)を表わす。

okuokuokuoku

Vulkan上でGPUを指定する

vkCreateInstance して vkEnumeratePhysicalDevices すると、↑のようなVulkan Caps Viewerの順序通りに取れるので、その N 番目という形で指定する。

https://github.com/okuoku/cwgl/commit/4904a5e7bc2bacb91f4f1d2ee9fdb311908c3e1a

C-WebGLでは常にゼロ番目にしていたので、とりあえず、指定したければソースコードを一旦書き換える方式にした。CIとかで使うならソフトウェアレンダラに固定したいとか有りそうなので方式を考えないと。。

Vulkan1.0には deviceIDvendorID のような仕組みはあるものの、これはDozenとネイティブのVulkan実装を区別するのに使えない(DozenでもIntelのIDを返却する)。Vulkan 1.2では driverInfodriverName がある ので、そこで区別はできる。