2018/07/20

Mesa 18.1系のソースにIntel GPU用のVK_EXT_vertex_attribute_divisorの実装を取り込む

Vulkan APIでDirect3D 11を実装しているDXVKがバージョン0.60でVulkanのVK_EXT_vertex_attribute_divisorという拡張を要求するようになり、Mesaの開発版のソースでは2018年7月に実装が取り込まれているのだが、これが含まれるリリース版は本記事の公開時点ではまだ公開されていない。

本記事公開の数時間前に、DXVKの開発版において再度この拡張は(NVIDIAの最新のプロプライエタリドライバでもまだサポートされていない関係で)必須ではなくなったのだが、バージョン18.1系のMesaのソースにパッチを適用してバージョン0.60から0.62をIntel GPUで動かせるようにできないかを最近試してみたので、その記録をここで公開しておくことにする(近い将来また必須になる可能性があるため)。

  1. 必要なパッチ
  2. パッチの適用とビルド
  3. Ubuntu 18.04用の自作パッケージ (PPA)
  4. 使用結果

必要なパッチ

この拡張を実装する修正単位(コミット)は1つだが、Mesaのパッチを提出するメーリングリストでこれと一緒に送信された別の2つのコミットに依存しており、実装の本体部分のパッチを単独で適用することはできない。

適用順は上に並べたのと逆の順番となる。

パッチの適用とビルド

上記のパッチ群を18.1系のソースにそのままpatchコマンドで適用することはできない。幾つか18.1系のソースに合わせた修正が必要となる。

  • 本体のパッチ: Pythonスクリプトの中に1行のコードを挿入する部分のみ手動で行う(元のパッチと追加内容が同じなのでEXTENSIONSというリストの末尾にそれを挿入する形で貼り付ける)
  • 一番最後に挙げたパッチ: 周辺のコードの内容が少し変わっている関係で.BufferPitch = の行の修正を手動で行う

以下はビルド作業例。ビルドに必要なパッケージ群(開発パッケージ)はインストール済みであるものとする。

[mesa-18.1.x]$ rm src/intel/vulkan/anv_extensions.[ch]
[mesa-18.1.x]$ ./configure --disable-gbm --disable-shared-glapi --disable-dri --enable-dri3 --disable-egl --disable-glx --disable-opengl --disable-gles1 --disable-gles2 --with-gallium-drivers=no --with-dri-drivers=no --with-vulkan-drivers=intel
[mesa-18.1.x]$ make

x86_64版のOSではVulkanのドライバは32bit版と64bit版があるため、それぞれのビルド環境でビルドを行って既存のlibvulkan_intel.soをそれぞれsrc/intel/vulkan/.libs/libvulkan_intel.soで置き換える。

また、必要に応じてsrc/intel/vulkan/intel_icd.[i686 もしくは x86_64].json/usr/share/vulkan/icd.d/内のファイルに対して上書きする。

Ubuntu 18.04用の自作パッケージ (PPA)

Ubuntuの次期バージョン用のMesaのソースパッケージをもとにして上記のパッチをいじったものを適用したUbuntu 18.04向けのパッケージを作成し、ppa:kakurasan/backport-anv-vertex-attribute-divisorのPPAリポジトリで公開した。

パッチの影響を受けるのはmesa-vulkan-driversパッケージのみで、それ以外は単純にバージョンの上がったMesaのパッケージとして使うこともできる(18.04のMesaは古い18.0系のため)。

元のバージョンに戻したくなったらppa-purgeをインストールして同名のコマンドに先述のPPAリポジトリ文字列を指定する。

使用結果

修正の適用により、バージョン0.6x系のDXVKがIntel GPUで使えなくなった問題への対処には成功し、WOLF RPGエディターのサンプルゲームやUnigine Heaven 4.0でのDirect3D 11を用いたベンチマークが動作したのを確認したが、パッチにより追加された拡張が実際に使われて正常に動作していることを確認することまではできなかった。

下はWOLF RPGエディターのサンプルゲームの画像。

WOLF RPGエディターのサンプルゲーム

下はUnigine Heaven 4.0をDirect3D 11で動かした画像。実行を手動(wineコマンド)で行う場合はインストール先のbinディレクトリに移動してからwine browser_x86.exe -config ../data/launcher/launcher.xmlのようにして行う。

Unigine Heaven 4.0 (Direct3D 11)

使用したバージョン:
  • Wine 3.12
  • Mesa 18.1.4
  • DXVK 0.62
  • WOLF RPGエディター 2.24
  • Unigine Heaven 4.0