Mesa on D3D12 を試す
概要
Mesa 3D (以下 Mesa) は FLOSS の OpenGL 実装です。
FLOSS であることから、他の FLOSS のグラフィックドライバとの連携、ソフトウェアでのレンダリング、仮想環境での高性能グラフィックスなど、様々な目的に用いられます。
今回は Microsoft と Collabora が共同開発している OpenGL on Direct3D 12 ドライバを試してみます。
必要なもの
- Git
- Meson
- Visual Studio 2019 (または Build Tools for Visual Studio 2019)
- 最新の Windows 10 SDK
- dxcompiler.dll、dxil.dll (後述)
ビルドの準備
公式の解説を見ましょう。
解説等飛ばしたい方はコマンドまとめに記しています。
まず、Visual Studio のビルドツールにパスが通った状態にします。 x64 Native Tools Command Prompt が便利なので、この中から作業します。
git clone https://gitlab.freedesktop.org/kusma/mesa.git cd mesa git checkout msclc-d3d12
でクローン & チェックアウトします。
Mesa には様々なビルド方法があります。
.vcxproj、.ninja などのプロジェクトファイルは、そのままでは存在しません。
そのため、ビルドは CMake、SCons、Meson などの構成 (メタビルド) ツールを介して行います。
2020 年現在、Mesa のビルドに使う構成ツールは Meson がメインです。この記事でも Meson を使用してビルドを行います。
Meson の出力には ninja、MSBuild (Visual Studio)、Makefile などから選べますが、今回は ninja を使用します。
ninja が気に食わないなら --backend
オプションで変更できます。(Visual Studio は vs)
Meson の使い方
基本的に
meson <オプション> <プロジェクトファイルが保存されるディレクトリ>
とすれば良いです。
今回は build-d3d12
というディレクトリでビルドをします。
ただ、このままビルドしても GDI ドライバを使用することになるので、次のセクションで解説する設定が必要です。
ビルドの環境変数
Meson は -D オプションで環境変数の設定ができます。
- dri-drivers: Mesa に組み込みたい DRI ドライバを指定します。今回は Windows なので、何も指定しません。
- gallium-drivers: Mesa に組み込みたい Gallium ドライバを指定します。今回は
d3d12
を指定します。その他にも、Zink をビルドしたい場合は、zink
を指定します。Windows でのデフォルトはgdi
です。 - buildtype: ビルド構成 (デバッグ/リリース) の指定をします。デフォルトは debugoptimized、今回は release を指定します。
コマンドまとめ
今回の構成を考えると、
meson -Dgallium-drivers=d3d12 -Dbuildtype=release build-d3d12
となります。
ビルド
ninja -C build-d3d12
とかすれば、勝手にビルドされます。
実験
glxgears の Windows 版である wglgears で実験します。 オリジナルのソースは使用しません。
この際に
build-d3d12\src\gallium\targets\libgl-gdi\opengl32.dll
build-d3d12\subprojects\zlib-1.2.11\z.dll
(ただの zlib)- Windows SDK にある dxcompiler.dll、dxil.dll (Windows 10 SDK に付属しています。私の場合は
C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64
の中にありました)
が必要です。wglgears.exe と同じディレクトリに置きます。
実際に使用するには、Direct3D 12 に対応したビデオカードが必要になります。
wglgears のビルド
を同じディレクトリに置き、x64 Native Tools Command Prompt から
cl /o wglgears.exe /MD wglgears.c kernel32.lib user32.lib gdi32.lib opengl32.lib winmm.lib
とかやればビルドできると思います。
マルチ GPU の場合
マルチ GPU 構成の場合はよくわかっていないと起動できません。
設定 → ディスプレイ → グラフィックの設定
から、wglgears.exe を追加します。(同じように、Minecraft 等で使用する場合は、Minecraft で使用する javaw.exe を指定します。)- 高パフォーマンスか省電力か選択して、 Direct3D 12 に対応したビデオカードに割り当てます。たとえば、省電力 (Intel HD Graphics 4600) は非対応で、高パフォーマンス (Radeon RX 470) は Direct3D 12 に対応しています。
実行
コマンドラインから wglgears.exe -info
を実行し、GL_RENDERER = D3D12 (Radeon (TM) RX 470 Graphics)
などの表示があれば OK です。
5月頃に試したときにはパフォーマンスが悪かったり、OpenGL のフレームバッファが初期化できなかったりしたのですが、現在は高速かつほぼ安定しています。
- WSL 2 環境下での OpenGL のハードウェア アクセラレーション
- ドライバ実装の簡略化
- GDI に由来する Windows での OpenGL の制約の回避 (画面出力のないビデオカードを使うなど)
などに使えるかもしれませんね。
テスト
あああ