Open4

wined3dにgl4esをくっつけるのは可能か?

okuokuokuoku

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

https://zenn.dev/okuoku/scraps/432f09d775c63a

https://zenn.dev/okuoku/scraps/47b8d74361e126

okuokuokuoku

gl4es

https://github.com/ptitSeb/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 に仕立てるのが当面の目標になる。

okuokuokuoku

wined3d

https://github.com/adolfintel/wined3d4win

MinGW向けのビルドスクリプトを配付している人がいる。まぁ元々のWineがMinGWをサポートしているのでそれを使える。

直接的に依存しているのは:

  • glEnable
  • glDisable
  • wglMakeCurrent
  • wglGetCurrentDC
  • wglDeleteContext
  • wglShareLists
  • wglGetProcAddress
  • wglGetCurrentContext
  • wglCreateContext

適切に実装されたWindows上のOpenGLプログラムは、コンテキストを作成してから 全ての OpenGL関数を wglGetProcAddress で取得する必要がある。Wined3dは基本的にこの原則にちゃんと従っている。 glEnableglDisable は謎。

(EDIT: 拡張だけだっけ。。?)

... これ見てみると何か全然足りなさそうなんですけど大丈夫なんですかね。。

okuokuokuoku

既にWindowsの呼出し規約には移植されている

https://github.com/ptitSeb/gl4es/pull/307

https://github.com/ptitSeb/gl4es/pull/311

なのでビルド廻りは移植終わってるとして必要なのはwgl関数を補うことだけかな。同じ人が他にもいろいろとコミットを入れているものの、wgl関連は導入していないのでゴールはOpengl32.dllの置き換えではないようだ。

https://github.com/ptitSeb/gl4es/pulls?q=is%3Apr+author%3Ayjh-styx

一旦 ↑ の関数しかexportしないニセopengl32.dllを作りwined3dに特化するのが良い気がする。