Mesa on D3D12 を試す

概要

Mesa 3D (以下 Mesa) は FLOSS の OpenGL 実装です。
FLOSS であることから、他の FLOSS のグラフィックドライバとの連携、ソフトウェアでのレンダリング、仮想環境での高性能グラフィックスなど、様々な目的に用いられます。
今回は Microsoft と Collabora が共同開発している OpenGL on Direct3D 12 ドライバを試してみます。

必要なもの

ビルドの準備

公式の解説を見ましょう。
解説等飛ばしたい方はコマンドまとめに記しています。

まず、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 構成の場合はよくわかっていないと起動できません。

  1. 設定 → ディスプレイ → グラフィックの設定 から、wglgears.exe を追加します。(同じように、Minecraft 等で使用する場合は、Minecraft で使用する javaw.exe を指定します。)
  2. 高パフォーマンスか省電力か選択して、 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フレームバッファが初期化できなかったりしたのですが、現在は高速かつほぼ安定しています。

などに使えるかもしれませんね。