ANGLEによるOpenGL ESを静的リンクしてXboxOneで使う
- WinRT上でGLES版のSDL renderを使っているところ
従来のANGLE(GoogleによるOpenGL ES2/3実装)は基本的にDLLでないと使用できず、MSによる配布でもDLLを使っていた。が、実は今年に入ってからANGLE側に変更が入り、静的リンクできるようになっている。
- https://github.com/google/angle/commit/80ab03c58df44689cb04b96cee3f042c80cdccb6
- テストのためにANGLEの一部を静的リンクできるようにする変更
...これが無いときはどうやってOpenGL ES on OpenGL ESをやろうとしていたのかは謎だけどとりあえず手でビルドしたら動いたので良しとする。
- https://github.com/okuoku/grpcore0/blob/90d4a976c8e20bd5fa5d0e779e75267a81b4f1f9/angle-srcs.cmake
- リンクすべきファイルのリスト
SDLのGLESサポートは基本的に常にEGLを動的ロードするようになっている。今回はSDL側を書き換えて実装した。
- https://github.com/okuoku/grpcore0/blob/90d4a976c8e20bd5fa5d0e779e75267a81b4f1f9/patch_sdl/SDL_egl_grpcore0.c#L50
- 静的リンクされたEGLを使うSDL_egl.c。
これでSDLとANGLEの両方が静的リンクできるようになったので、単体の.exeでOpenGL ES2環境が使えるようになった。GPUドライバのOpenGL ES実装を使えば別にANGLEを埋め込まなくてもOpenGL ES自体は使えるが、XboxOneには当然無いし、そもそもGPUドライバのOpenGL ES実装の実装度合いがマチマチで、ANGLEを使った方がマシな可能性が高い気がする。(ちなみに、SDLはデフォルトではGPUドライバ側のOpenGL ES実装を使おうとする -- OpenGL4.1以降では GL_ARB_ES2_compatibility が有るので -- 無ければANGLEを期待してlibEGL.dllをロードする。)
必要なパッチ
どうもGoogle側ではWinRTのANGLEはメンテナンスされていないようで、レビューされた変更が入っているはずのmain repositoryではビルドが通らなかった。
- https://github.com/google/angle/commit/151d5de65f5f7f7cfaf31ea621b9be3b00db449f
- このコミットでNativeWindow11WinRT::createSwapChainが変更されていない
diff --git a/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp b/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp index 2ef2235..f4eb40d 100644 --- a/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp +++ b/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp @@ -89,6 +89,7 @@ HRESULT NativeWindow11WinRT::createSwapChain(ID3D11Device *device, DXGI_FORMAT format, UINT width, UINT height, + UINT samples, IDXGISwapChain **swapChain) { if (mImpl) diff --git a/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h b/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h index 996fd3a..8fbceaa 100644 --- a/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h +++ b/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h @@ -34,6 +34,7 @@ class NativeWindow11WinRT : public NativeWindow11 DXGI_FORMAT format, UINT width, UINT height, + UINT samples, IDXGISwapChain **swapChain) override; void commitChange() override;
とりあえず単にsamplesパラメタを無視する方向で。。
SDLも変更が必要だったがまだちゃんと見れていない:
diff --git a/src/core/winrt/SDL_winrtapp_direct3d.cpp b/src/core/winrt/SDL_winrtapp_direct3d.cpp index 2a2eb15..7084f93 100644 --- a/src/core/winrt/SDL_winrtapp_direct3d.cpp +++ b/src/core/winrt/SDL_winrtapp_direct3d.cpp @@ -827,7 +827,7 @@ static void WINRT_OnBackButtonPressed(BackButtonEventArgs ^ args) } } -#if NTDDI_VERSION == NTDDI_WIN10 +#if NTDDI_VERSION >= NTDDI_WIN10 void SDL_WinRTApp::OnBackButtonPressed(Platform::Object^ sender, Windows::UI::Core::BackRequestedEventArgs^ args) { diff --git a/src/video/winrt/SDL_winrtvideo.cpp b/src/video/winrt/SDL_winrtvideo.cpp index 6f7e61f..5efdedd 100644 --- a/src/video/winrt/SDL_winrtvideo.cpp +++ b/src/video/winrt/SDL_winrtvideo.cpp @@ -43,7 +43,7 @@ using namespace Windows::UI::ViewManagement; /* [re]declare Windows GUIDs locally, to limit the amount of external lib(s) SDL has to link to */ static const GUID IID_IDisplayRequest = { 0xe5732044, 0xf49f, 0x4b60, { 0x8d, 0xd4, 0x5e, 0x7e, 0x3a, 0x63, 0x2a, 0xc0 } }; -static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } }; +//static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } }; /* SDL includes */
IID_IDXGIFactory2 等はライブラリdxguidに入っているので、そちらを使う。