続・玩式草子 ―戯れせんとや生まれけん―

第35回 Days of WINE and Struggles again[4]

この記事を読むのに必要な時間:およそ 4 分

さて,前回の手順で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が求められ,D3D12Vulkanのような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をインストールした際のライブラリ設定

図1 DXVKをインストールした際のライブラリ設定

さて,それではWineD3DとDXVKでは何が違うのでしょうか? 手元であれこれ試したところ,Windows用Minecraftの試用版は,前回の手順でインストールした基本環境(WineD3D環境)ではランチャーがブラックスクリーンのまま起動しませんでした。

図2 WineD3D環境の場合,Minecraftランチャーがブラックアウトしてしまう

図2 WineD3D環境の場合,Minecraftランチャーがブラックアウトしてしまう

一方,DXVKを追加インストールした環境では,ランチャーの日本語表示が文字化け(豆腐化)しているものの,ゲーム本体のダウンロードや動作は問題ないようです。

図3 DXVK環境では文字化けが見られるもののゲームは起動した

図3 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では未実装になっているようです。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html