VRChatをLinux (Fedora 43)で動作させるのに手こずった話

LinuxでVRChatを実行していたが、ホームワールドに設定していたkotatsumuriワールドのYamaPlayerが動作しないことが分かった。

これは軽く調べるとproton-ge-rtspを利用すれば良いということが分かったので、インストールしてみた。

proton-ge-rtspについては https://note.com/ced0180/n/n5e5c429ba674 や 本家リポジトリ https://github.com/SpookySkeletons/proton-ge-rtsp を参照のこと

https://github.com/SpookySkeletons/proton-ge-rtsp を利用してYamaPlayerに対応させようとしたら、今度はVRChat自体が起動しなくなった。

このためgithub copilotの支援をもらいトラブルシューティングを行った。


用語

DXVK

Windowsゲームが使うDirect3Dの命令をLinuxのVulkanで動くように変換するソフトウェア。

ICD

Installable Client Driverの略。vulkanが利用するGPUによって利用するドライバを差し替えることが可能になる仕組み。

VulkanはICDファイル(jsonファイル: /usr/share/vulkan/icd.d/nvidia_icd.x86_64.jsonなどに配置 )を読み込むことでドライバの実体をロードしている。


結論から書くと

Proton(DXVK/Vulkan)起動時に Intel iGPU の Vulkan ICD が"なぜか"選択され、Swapchain 作成が"なぜか"失敗してゲームが落ちるということだった。

この2つの"なぜか"の点については調べ途中。

まあ要するにNVIDIA ICDを指定することで解決したというつまらない話だった。

が、せっかくcopilotとやりとりして知見が深まったのでひとまず記録に残すためブログに記していく。


生じていた事象について

VRChatをデフォルトの設定(PROTON_LOG=1を起動オプション二追加)で起動すると、

Failed to create Vulkan swapchain: VK_ERROR_INITIALIZATION_FAILEDというエラーログが生じて画面が真っ白の状態になっていた。

Text

err:   Presenter: Failed to create Vulkan swapchain: VK_ERROR_INITIALIZATION_FAILED
info:  Presenter: Actual swapchain properties:
info:    Format:       VK_FORMAT_B8G8R8A8_UNORM
info:    Color space:  VK_COLOR_SPACE_SRGB_NONLINEAR_KHR
info:    Present mode: VK_PRESENT_MODE_IMMEDIATE_KHR (dynamic: yes)
info:    Buffer size:  1920x1080
info:    Image count:  4

ちなみに、ここで起動オプションにPROTON_USE_WINED3D=1 %command%を追加するとゲームは起動する。

単にゲームを動かす状態にしたいのであればこれで終了で構わないが、もう少し掘り下げることにした。


調査にあたり取得した情報

1) Proton / DXVK の詳細ログ取得

  • 追加した起動オプション:
    • PROTON_LOG=1 DXVK_LOG_LEVEL=info %command%
  • 目的:
    • 「どの Vulkan デバイスが選ばれているか」「どこで落ちるか」をログで確認
  • 得られた情報:
    • Found device: Intel... が出ており Intel iGPU が選ばれていた

2) NVIDIA ICD の強制(最初の試行)

  • 追加した起動オプション:
    • VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.x86_64.json PROTON_LOG=1 DXVK_LOG_LEVEL=info %command%
  • 目的:
    • Vulkan ICD を NVIDIA に固定して Intel を回避
  • 結果:
    • 逆に ゲームが即落ち、Found device: すら出ない(Vulkan 初期化のさらに手前で失敗)

3) Vulkan loader の挙動確認(原因特定の決め手)

  • 追加した起動オプション:
    • VK_LOADER_DEBUG=all ... %command%(上の ICD 固定と併用)
  • 目的:
    • Vulkan loader が「どのドライバ(ICD)を読み、なぜ無視/失敗しているか」を確定
  • 得られた決定的ログ:
    • VK_ICD_FILENAMES で指定した nvidia_icd.x86_64.json が VK_LOADER_DRIVERS_SELECT により “選択されていない” として無視され、
    • 結果的に vkCreateInstance: Found no drivers! になっていた

Text

[Vulkan Loader] WARNING | DRIVER: Driver "nvidia_icd.x86_64.json" ignored because not selected by env var 'VK_LOADER_DRIVERS_SELECT'
[Vulkan Loader] ERROR | DRIVER: vkCreateInstance: Found no drivers!

4) 解決策(Steam起動オプションでNVIDIAドライバを選択)

  • 追加した起動オプション(解決):
    • VK_LOADER_DRIVERS_SELECT=nvidia_icd.x86_64.json VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.x86_64.json PROTON_LOG=1 DXVK_LOG_LEVEL=info %command%
  • 結果:
    • ゲームが起動

YamaPlayerで動画が再生されることを確認


結論

  • Steam/Proton 実行環境では Vulkan loader 側で VK_LOADER_DRIVERS_SELECT によるドライバ選別が働いており、これにより NVIDIA の ICD が選ばれない状況が発生していた。
    • そのため DXVK は Intel iGPU を使ってしまいswapchain 作成に失敗して落ちた??

ここでIntel GPUだとなぜ落ちるのかはまだ腑に落ちていない。

が、おそらくモニター自体はNVIDIAグラボから出ているのに、Vulkanの描画ドライバとしてIntelのドライバが選ばれた結果モニター側に描画されず画面が真っ白という状態になっていたのだと思われる。


  • VK_LOADER_DRIVERS_SELECT と VK_ICD_FILENAMES を明示して NVIDIA ICD を選択させることで、Vulkan/DXVK 経路が正常化し起動できた。