21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_WINRT && SDL_VIDEO_OPENGL_EGL 31 #include "../SDL_egl_c.h" 35 #include <wrl/client.h> 39 static const int ANGLE_D3D_FEATURE_LEVEL_ANY = 0;
40 #define EGL_PLATFORM_ANGLE_ANGLE 0x3202 41 #define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203 42 #define EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3204 43 #define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205 44 #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 45 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 46 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE 0x320B 47 #define EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE 0x320F 49 #define EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER 0x320B 57 WINRT_GLES_LoadLibrary(
_THIS,
const char *
path)
66 CreateWinrtEglWindow_Old_Function CreateWinrtEglWindow = (CreateWinrtEglWindow_Old_Function)
SDL_LoadFunction(
_this->egl_data->egl_dll_handle,
"CreateWinrtEglWindow");
67 if (CreateWinrtEglWindow) {
75 CoreWindow ^ native_win = CoreWindow::GetForCurrentThread();
76 Microsoft::WRL::ComPtr<IUnknown> cpp_win =
reinterpret_cast<IUnknown *
>(native_win);
88 Microsoft::WRL::ComPtr<IUnknown> cpp_display = video_data->
winrtEglWindow;
89 _this->egl_data->egl_display = ((eglGetDisplay_Old_Function)
_this->egl_data->eglGetDisplay)(cpp_display);
90 if (!
_this->egl_data->egl_display) {
91 return SDL_EGL_SetError(
"Could not get Windows 8.0 EGL display",
"eglGetDisplay");
95 return SDL_EGL_SetError(
"Could not initialize Windows 8.0 EGL",
"eglInitialize");
101 const EGLint defaultDisplayAttributes[] =
103 EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
104 EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER,
EGL_TRUE,
105 EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE,
EGL_TRUE,
109 const EGLint fl9_3DisplayAttributes[] =
111 EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
112 EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, 9,
113 EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, 3,
114 EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER,
EGL_TRUE,
115 EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE,
EGL_TRUE,
119 const EGLint warpDisplayAttributes[] =
121 EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
122 EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE,
123 EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER,
EGL_TRUE,
124 EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE,
EGL_TRUE,
134 eglGetPlatformDisplayEXT_Function eglGetPlatformDisplayEXT = (eglGetPlatformDisplayEXT_Function)
_this->egl_data->eglGetProcAddress(
"eglGetPlatformDisplayEXT");
135 if (!eglGetPlatformDisplayEXT) {
136 return SDL_EGL_SetError(
"Could not retrieve ANGLE/WinRT display function(s)",
"eglGetProcAddress");
139 #if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) 143 _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
EGL_DEFAULT_DISPLAY, defaultDisplayAttributes);
144 if (!
_this->egl_data->egl_display) {
145 return SDL_EGL_SetError(
"Could not get EGL display for Direct3D 10_0+",
"eglGetPlatformDisplayEXT");
155 _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
EGL_DEFAULT_DISPLAY, fl9_3DisplayAttributes);
156 if (!
_this->egl_data->egl_display) {
157 return SDL_EGL_SetError(
"Could not get EGL display for Direct3D 9_3",
"eglGetPlatformDisplayEXT");
164 _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
EGL_DEFAULT_DISPLAY, warpDisplayAttributes);
165 if (!
_this->egl_data->egl_display) {
166 return SDL_EGL_SetError(
"Could not get EGL display for Direct3D WARP",
"eglGetPlatformDisplayEXT");
170 return SDL_EGL_SetError(
"Could not initialize WinRT 8.x+ EGL",
"eglInitialize");
180 WINRT_GLES_UnloadLibrary(
_THIS)
191 SDL_EGL_UnloadLibrary(
_this);
195 SDL_EGL_CreateContext_impl(WINRT)
196 SDL_EGL_SwapWindow_impl(WINRT)
197 SDL_EGL_MakeCurrent_impl(WINRT)
#define EGL_DEFAULT_DISPLAY
static SDL_VideoDevice * _this
HRESULT(WINAPI *GetDpiForMonitor)(HMONITOR hmonitor
IUnknown * winrtEglWindow
GLsizei const GLchar *const * path
void * SDL_LoadFunction(void *handle, const char *name)