Open2

謎の関数 wglChoosePixelFormat

okuokuokuoku

というわけで DirectX8 → wined3d → (Desktop OpenGL) → gl4es → (OpenGL ES2) → ANGLE → Vulkan の系をまず通したい。

一度OpenGL ES2でDirectX8なゲームがプレイできるようになったら、yuniframeのWebGL1実装を使ってプレイできるようにすることでWebブラウザに載せる道筋が付けられる。

okuokuokuoku

ChoosePixelFormat に失敗する問題

適当にstubを書いて実際にゲームに読ませてみたところ、wined3dが wglCreateContext してこない。 wglGetCurrentDCwglGetCurrentContext はしてくるので、

https://github.com/wine-mirror/wine/blob/a8c1d5c108fc57e4d78e9db126f395c89083a83d/dlls/wined3d/adapter_gl.c#L342

で失敗していることがわかる。

で、ねっとりとアセンブリをステップ実行したところ、WindowsのGDI関数 ChoosePixelFormat は非公開のOpenGL32関数 wglChoosePixelFormat にリダイレクトしており、プロセスにロードされたOpenGL32.dllにこの関数が無いとサイレントに失敗するようだ。

とりあえず何もしない関数で適当に実装しておいた。

https://github.com/okuoku/fakegl32-proto/blob/507b312eaf3f2620c20eda23384a9bd18c45f01e/dll.c#L143-L158

(wglSetPixelFormat は1を返却しないとGDIがレジスタを破壊するようだ。。)

この辺の事情はSOに回答があった:

https://stackoverflow.com/questions/20645706/why-are-functions-duplicated-between-opengl32-dll-and-gdi32-dll