さて、前回 の手順でWINEをインストールし、WINEPREFIX環境変数を指定してwinebootで初期化、winetricksで必要なフォントをインストールすれば、基本的なWINE環境は準備完了です。
後は、あれこれWindows用のアプリを試していけばいいものの、3Dのシューティングやアクションゲームを試す際に知っておくと便利なのが、DXVK (DirectX on VulKan)というライブラリです。今回はこのDXVKを紹介しつつWINEを使うコツを考えることにしましょう。
WineD3DとDXVK
以前 にも紹介したように、3Dコンピュータグラフィックスの世界は、Linux/Unixが支持するOpenGL とWindowsが支持するDirectX/Direct3D に二分されており、WINEでは両者を架橋するためDirect3D(D3D)の機能をOpenGLの機能に翻訳して実行するようなライブラリ(WineD3D )を開発してきました。
一方、GPUが進化するにつれ、その機能を活用するために、よりハードウェアレベルでの操作を可能とするAPIが求められ、D3D12 やVulkan のようなAPIが開発されました。
D3D12は、D3D11までの世代から設計方針が大きく変更され、むしろVulkanに近い仕様になったため、WINEでも従来のWineD3Dライブラリではなく、vkd3d という新しいライブラリで対応することになりました。
一方、Vulkanの普及に伴い、D3D12以前の機能も直接Vulkan上で実行する方がいいのでは、というアイデアから、D3D9/10/11の機能をVulkan用に変換するためのDXVKというライブラリ が開発されました。
本稿執筆時点でのDXVKの最新版は1.9.2で、以下のようなファイルから構成されています。
$ ls -R dxvk-1.9.2
dxvk-1.9.2:
setup_dxvk.sh* x32/ x64/
dxvk-1.9.2/x32:
d3d10.dll* d3d10_1.dll* d3d10core.dll* d3d11.dll* d3d9.dll* dxgi.dll*
dxvk-1.9.2/x64:
d3d10.dll* d3d10_1.dll* d3d10core.dll* d3d11.dll* d3d9.dll* dxgi.dll*
上記のように、DXVKはWindows用のライブラリ(DLL) として開発されており、添付のsetup_dxvk.shスクリプトを使うと、WINEPREFIXで指定したWINE環境内のDLLを置き替えるようにインストールされます。
$ env | grep -i WINEPREFIX
WINEPREFIX=/home/kojima/Wine/Wine01
$ ./setup_dxvk.sh install --with-d3d10
wine: configuration in L"/home/kojima/Wine/Wine01" has been updated.
名前変更: '/home/kojima/Wine/Wine01/dosdevices/c:/windows/system32/dxgi.dll' -> '/home/kojima/Wine/Wine01/dosdevices/c:/windows/system32/dxgi.dll.old'
...
DXVKをインストール後、winecfgで確認すると、DXVKが提供するライブラリがオーバーライドとして設定されています。
図1 DXVKをインストールした際のライブラリ設定
さて、それではWineD3DとDXVKでは何が違うのでしょうか? 手元であれこれ試したところ、Windows用Minecraftの試用版 は、前回の手順でインストールした基本環境(WineD3D環境)ではランチャーがブラックスクリーンのまま起動しませんでした。
図2 WineD3D環境の場合、Minecraftランチャーがブラックアウトしてしまう
一方、DXVKを追加インストールした環境では、ランチャーの日本語表示が文字化け(豆腐化)しているものの、ゲーム本体のダウンロードや動作は問題ないようです。
図3 DXVK環境では文字化けが見られるもののゲームは起動した
コンソールに出力されたログを見ると、起動しない環境では
210:fixme:kernelbase:AppPolicyGetThreadInitializationType FFFFFFFA, 0E13FEF8
0214:fixme:d3dcompiler:D3DCompile2 HLSL shader compilation is not yet implemented.
0218:fixme:d3dcompiler:D3DCompile2 HLSL shader compilation is not yet implemented.
0214:fixme:d3dcompiler:D3DCompile2 HLSL shader compilation is not yet implemented.
...
[1125/132925.993:ERROR:gl_utils.cc(316)] [.DisplayCompositor] GL_INVALID_OPERATION: Program not linked.
[1125/132925.993:ERROR:gl_utils.cc(316)] [.DisplayCompositor] GL_INVALID_OPERATION: Program object expected.
....
といったメッセージが頻出しているので、どうやらMinecraftが必要としている機能(D3DCompile2)が、DXVKでは対応しているもののWineD3Dでは未実装になっているようです。
もう一例、「メイの迷宮」 (※) という3Dダンジョン探検ゲーム(の試用版)の場合、WineD3D環境では迷宮の壁等が表示されずに真っ暗になってしまうのに対し、DXVK環境では質感を持った綺麗なグラフィックで表示されました。
図4 「 メイの迷宮」のWineD3D環境(上)とDXVK環境(下)
こちらも正しく表示できなかったWineD3D環境のログを眺めると、
0108:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x21.
0108:fixme:dxgi:dxgi_factory_EnumAdapterByGpuPreference Ignoring GPU preference 0x2.
0108:fixme:dxgi:dxgi_adapter_QueryVideoMemoryInfo Returning fake video memory info.
0108:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x20.
0108:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake threading support data.
0108:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0x3.
0108:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0x3.
0108:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0x3.
....
といったメッセージが延々と表示されているので、この場合もWineD3Dでは未対応の機能(D3D11のtexture mappingあたり?)を踏んでしまっているようです。
このように、どうやらDXVKの方がWineD3Dよりも多くの機能をサポートしているようなものの、逆にWineD3Dじゃないとダメな例もありました。具体的には、シンプルに徹した3D麻雀ゲーム「3D麻雀悠遊」 の場合、WineD3Dならば各自の得点や「チー」「 ポン」のコマンド欄が正しく表示されるものの、DXVKではそれらが一面緑の雀卓になって、カーソルが触れた部分(図では「チー」の欄)のみが再描画されるようです。
図5 WineD3D環境(上)とDXVK環境(下)
このあたりは、画面の再描画機能に関するWineD3DとDXVKの解釈の違いレベルで、ゲームのソースコードを少し直せば両環境に対応できそうに思うものの、現状ではDXVK環境で遊ぶのは難しそうです。
WINEPREFIXでのゲーム環境の切り分け
今回はDXVKとWineD3Dについて考えたものの、これ以外にも、"A"というアプリを動かすために必要なDLLをインストールすると、"B"というアプリが動かなくなる、という問題はいろいろと存在するようです。
このような問題に対応するため、WINEではWINEPREFIX 環境変数で複数のWINE環境を切り替えられるようになっています。今回の場合、DXVKを入れたWINE環境と入れていないWINE環境を用意し、「 3D麻雀悠遊」はDXVKを入れていないWINE環境に、「 Minecraft」や「メイの迷宮」はDXVKを入れている環境にそれぞれインストールしてやれば、各アプリは問題なく動作します。
「3D麻雀悠遊」のように、インストールウィザードが付属して、それを使うとデスクトップにアイコンが用意されるようなアプリの場合、インストール時のWINEPREFIX環境変数はアイコンが示すdesktopコマンドに埋め込まれるので、環境変数を切り替えても問題なく起動できます。
どういう風にやってるんだろ、と確認したところ、~/Desktop/には1つのアプリを起動するための2つのファイルが用意されていました。
$ ls ~/Desktop/3D麻雀悠遊.*
/home/kojima/Desktop/3D麻雀悠遊.desktop* /home/kojima/Desktop/3D麻雀悠遊.lnk
$ file ~/Desktop/3D麻雀悠遊.*
/home/kojima/Desktop/3D麻雀悠遊.desktop: UTF-8 Unicode text
/home/kojima/Desktop/3D麻雀悠遊.lnk: MS Windows shortcut, Item id list present,
Points to a file or directory, Has Working directory, Has command line arguments,
ctime=Sun Dec 31 14:41:01 1600, mtime=Sun Dec 31 14:41:01 1600, atime=Sun Dec 31
14:41:01 1600, length=0, window=hide
$ cat -n ~/Desktop/3D麻雀悠遊.desktop
1 [Desktop Entry]
2 Name=3D麻雀悠遊
3 Exec=env WINEPREFIX="/home/kojima/Wine/Wine01" wine C:\\\\Program\\ Files\\
\\(x86\\)\\\\3D麻雀悠遊\\\\3dyuyu.exe
4 Type=Application
5 StartupNotify=true
6 Path=/home/kojima/Wine/Wine01/dosdevices/c:/Program Files (x86)/3D麻雀悠遊
7 Icon=86B1_3dyuyu.0
8 StartupWMClass=3dyuyu.exe
この結果を見ると、インストールウィザードが作成するWindows用のショートカット(.lnk )を元に、WINEがLinux用のdesktopファイルを作り、そこにWINEPREFIX環境変数や起動すべきアプリ名を記録しているようです。
インストールウィザードを使わない「メイの迷宮」のような同人ゲームの場合、配布されているアーカイブファイルを展開したディレクトリ内で実行ファイルを直接起動するようになっていることが多いので、上記desktopファイルの例に習った起動用ラッパースクリプトでも用意すればいいでしょう。
$ cat -n May.sh
1 #!/bin/sh
2 export WINEPREFIX=/home/kojima/Wine/DXVK
3 wine ./May.exe
この方法を突き詰めていくと「WindowsアプリごとにカスタマイズしたWINE環境を用意する」ということになります。そこまでする必要があるのか、と思われる方も多いでしょうけれど、winebootとwinetricksが作るWINE用の基本環境は約1.5GB、それに対して昨今の3Dグラフィックスを活用したゲームでは100GBを越えるコンテンツをダウンロードさせるものも多いので、「 アプリごとにWINE環境を用意する」というのもそう大袈裟な話ではないように思っています。
今回、WINEのテスト用にあれこれWindows用アプリを探してみたものの、WINEはWindowsに紐づけられるMicrosoft Storeには対応していないため、Microsoft Store経由で配布されている膨大なアプリ群は利用できません。
また、機能的にはWINEが十分対応していそうなものの、コピープロテクトやユーザ認証を必要とする商用アプリ、チート防止機能を採用しているオンラインゲームなど、DRM(Digital Right Management)の壁に阻まれて、利用できないアプリも多数あります。
以前試した際に比べ、WINEはあきらかに進化していて動かしうるアプリも増えているのに、技術以外の部分で動かせないアプリが増えている、という状況には歯がゆさを禁じ得ないところです。