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

第18回 Days of WINE and Struggles[5]

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

先月くらいまでは対岸の火事のように思っていた新型コロナウィルスが,あれよあれよと言う間に世界中に蔓延し,⁠日常」を大きく変えてしまいました。今や感染の中心は欧米に移動し,ローマやパリ,ニューヨークといった観光名所から人々の姿が消えた映像は,私たちの「あたりまえ」がいかに脆弱な足場の上に築かれていたかを実感させます。

さて,今回はWINEのトラブルネタの最終回として,ささいなミスで1ヵ月以上迷宮をさまよった記録になります。

8月ZX日:ビルドしたWINEにトラブル発覚

ビルドしたWINEパッケージをインストールし,Windows用のソフトウェアをあれこれ試しているうちに奇妙なトラブルに気づいた。というのは,仮想環境(VirtualBox:以下VBoxと略)と実機で動作が異なるソフトがあることだ。

たとえば123 Free Solitaireというカードゲームは,効果音も含めてVBox上でも実機上でも完全に動く。

図1 実機上の「123 Free Solitare」

図1 実機上の「123 Free Solitare」

一方,弾幕シューティングとして有名な上海アリス幻樂団の東方プロジェクトシリーズの体験版は,VBox上では起動するものの,実機ではオープニング画面にすら辿りつかずにエラー終了してしまう。

図2 VBoxでは起動する(上)ソフトが実機(下)ではエラーになる

図2 実VBoxでは起動する(上)ソフトが実機(下)ではエラーになる

図2 実VBoxでは起動する(上)ソフトが実機(下)ではエラーになる

もっとも,VBoxでは「起動する」とは言うものの動作はすさまじく遅く,タイトル画面が表示されるまでに数分かかり,キー入力はほとんど不可能で,ゲームとしてはとてもプレイできないレベルだ。

実機上でコマンドラインから起動してみると,エラーメッセージとともにエラーのBacktraceも表示されるものの,"wined3d"あたりでエラーになっていることくらいしかわからない。

$ wine .wine/drive_c/Program\ Files\ \(x86\)/上海アリス幻樂団/東方紺珠伝体験版/th15.exe 
0009:fixme:ver:GetCurrentPackageId (0x32ed60 (nil)): stub
0009:fixme:dwmapi:DwmEnableComposition (0) stub
wine: Unhandled page fault on execute access to 00000000 at address 00000000 (thread 002c), starting debugger...
0033:fixme:dbghelp:elf_search_auxv can't find symbol in module
...
Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
0033:fixme:dbghelp:elf_search_auxv can't find symbol in module
Register dump:
 CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b
 EIP:00000000 ESP:00d8fdbc EBP:00d8fdd8 EFLAGS:00010246(  R- --  I  Z- -P- )
 EAX:05600076 EBX:00000000 ECX:00000003 EDX:00000001
 ESI:00195e30 EDI:00000001
Stack dump:
0x00d8fdbc:  7d522771 00000001 00000000 00d8fdf8
0x00d8fdcc:  7d5246d3 001e6b90 00195e30 00d8fdf8
0x00d8fddc:  7d5246e0 6e78a350 000000bf 00000500
0x00d8fdec:  001e5658 00195e30 001e5f50 00d8fec8
0x00d8fdfc:  7df3588e 00000001 001e5d48 00000000
0x00d8fe0c:  7decf8fa 00000000 000000bf 00000001
Backtrace:
=>0 0x00000000 (0x00d8fdd8)
  1 0x7d5246e0 X11DRV_wglSwapIntervalEXT+0x6f() in winex11 (0x00d8fdf8)
  2 0x7df3588e swapchain_gl_present+0xdd() in wined3d (0x00d8fec8)
  3 0x7dec9f1c wined3d_cs_exec_present+0x2b() in wined3d (0x00d8fef8)
  4 0x7decb236 wined3d_cs_run+0x115() in wined3d (0x00d8ff48)
  5 0x7bcac9cc call_thread_func_wrapper+0xb() in ntdll (0x00d8ff5c)
  6 0x7bcaff07 call_thread_func+0x86() in ntdll (0x00d8ffdc)
  7 0x7bcac9be call_thread_entry+0x9() in ntdll (0x00d8ffec)
0x00000000: -- no code accessible --
Modules:
Module	Address			Debug info	Name (133 modules)
PE	  400000-  522000	Deferred        th15
ELF	6d3ca000-6d500000	Deferred        oleaut32
....

他のWindows用ソフトはどうだろう…… とあれこれ試してみた結果,グラフィックを多用しないロールプレイゲームとかは動作するものの,シューティング等のアクションゲームは同じエラーになる。

どうして動くものと動かないものがあるのだろう,と調べていった結果,どうやらWindowsのDirectX機能を使っているソフトウェアが実機ではエラーになるようだ。

このあたりは不勉強だったので,そもそもDirectXとは何か,あたりから調べてみたところ,MicrosoftがWindows用に開発したゲームやマルチメディア用のAPIで,ビデオカードの3Dレンダリング機能などを容易に操作できるようになっているため,3DのシューティングゲームなどはたいていこのAPIを使っているらしい。

一方,WINEが動くLinuxの世界ではOpenGLが3Dレンダリングの標準的なAPIなので,WINEはDirectX用のコマンドをOpenGL用に翻訳して使っているそうだ。また,DirectXにはさまざまなバージョンが存在し,それに対応するためWINEにも"d3dXX"と呼ばれるライブラリが複数用意されている,などがわかってきた。

Windowsの世界ではDirectXの動作診断をするためのdxdiagというツールがあり,このツールで「Direct3Dのテスト」を試すと,VirtualBox上ではきちんと"DirectX"のロゴが付いた立方体が回転するのに対し,実機では画面が640x480に変ってWINEがエラー終了することがわかった。どうやらこのコマンドがDirectXの可否のテストに使えそうだ。

図3 VBoxでは起動する(上)ソフトが実機(下)ではエラーになる

図3 Direct3DのテストをVBox(上)と実機(下)で実行

図3 Direct3DのテストをVBox(上)と実機(下)で実行

たぶん原因はDirectX回りだろう,と絞れてはきたものの,果してどこから手を付けたものだろう。

著者プロフィール

こじまみつひろ

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

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