wined3dにgl4esをくっつけるのは可能か?
CPUのエミュレーションに関しては逆コンパイラのAnvill https://github.com/lifting-bits/anvill がGhidraに対応する予定なのでとりあえずそれを待ってから検討することに。今回の場合は真面目にx86のインタプリタを書けば十分な速度が出る可能性は高いが当然そういう方向は避けたい。。Ghidraで抽出した個々のbasic blockをC関数に変換して逐次実行すれば、元のCPUの1/20程度の速度は普通に出るはずで、そっちの方が最終的にはインタプリタよりも高速な可能性が高いのではないか。
ひとまず前回のでboxedwineのLinuxエミュレーションでDirectX8なゲームがそこそこ動作することは確認できた。boxedwineのドライバ類を真面目に活用するのはちょっとデバッグ面で不利なので、Wine等のDirectX互換実装を使ってドライバをバイパスする形を検討することにした。こうすることで、元のゲームはWindows上で直接動作させられ、Visual Studioの強力なデバッガを活用できる。
つまり:
- Direct3D(Zwei IIの場合はDirect3D 8) → wined3dでOpenGLに変換
- OpenGL → gl4esでOpenGL ES 2.0に変換
- OpenGL ES2.0 → WebGL1 に自前の変換レイヤで変換 (これは仕方ない)
- DirectSound → dsoal https://github.com/kcat/dsoal でOpenALに変換
- DirectInput → ?? Wineの実装を活用できるか検討しないと。。
この OpenGL → gl4es がたぶん一番難しい。
prev
gl4es
gl4esはいわゆるDesktop GLをOpenGL ES2.0に変換するためのレイヤで、いくつかのゲームで動作実績がある。が、
- 基本的にはLinux上のOpenGLを想定しているのでWindows用のWGLをEGLに変換するところは自前で用意する必要がある
- MRTやDepth textureのreadに対応していない -- DX9世代では割と使われる機能
... そもそもWineのAndroid版はどうしてんの。。?たぶん何も対策していないのではないかとは思うけど。。現状のAndroidはVulkanの存在が保証されているので、今後も特に実装されることは無い気がする。
コレにWGL(WindowsにおけるEGLのようなもの)の各種関数のstubをくっつけて opengl32.dll
に仕立てるのが当面の目標になる。
wined3d
MinGW向けのビルドスクリプトを配付している人がいる。まぁ元々のWineがMinGWをサポートしているのでそれを使える。
直接的に依存しているのは:
glEnable
glDisable
wglMakeCurrent
wglGetCurrentDC
wglDeleteContext
wglShareLists
wglGetProcAddress
wglGetCurrentContext
wglCreateContext
適切に実装されたWindows上のOpenGLプログラムは、コンテキストを作成してから 全ての OpenGL関数を wglGetProcAddress
で取得する必要がある。Wined3dは基本的にこの原則にちゃんと従っている。 glEnable
と glDisable
は謎。
(EDIT: 拡張だけだっけ。。?)
- https://github.com/wine-mirror/wine/blob/a8c1d5c108fc57e4d78e9db126f395c89083a83d/dlls/wined3d/adapter_gl.c#L2093 -- GLの関数を取得している部分
-
https://github.com/ptitSeb/gl4es/blob/f32599115183025a81935163eec3a6728e444d29/src/gl/gl_lookup.c -- gl4es が提供している関数(=
glGetProcAddress
の実装)
... これ見てみると何か全然足りなさそうなんですけど大丈夫なんですかね。。
既にWindowsの呼出し規約には移植されている
なのでビルド廻りは移植終わってるとして必要なのはwgl関数を補うことだけかな。同じ人が他にもいろいろとコミットを入れているものの、wgl関連は導入していないのでゴールはOpengl32.dllの置き換えではないようだ。
一旦 ↑ の関数しかexportしないニセopengl32.dllを作りwined3dに特化するのが良い気がする。