|
@@ -36,7 +36,10 @@ using namespace Windows::UI::Core;
|
|
|
|
|
|
/* ANGLE/WinRT constants */
|
|
|
static const int ANGLE_D3D_FEATURE_LEVEL_ANY = 0;
|
|
|
-
|
|
|
+#define EGL_PLATFORM_ANGLE_ANGLE 0x3201
|
|
|
+#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3202
|
|
|
+#define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3203
|
|
|
+#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3205
|
|
|
|
|
|
/*
|
|
|
* SDL/EGL top-level implementation
|
|
@@ -52,32 +55,56 @@ WINRT_GLES_LoadLibrary(_THIS, const char *path)
|
|
|
}
|
|
|
|
|
|
/* Load ANGLE/WinRT-specific functions */
|
|
|
- CreateWinrtEglWindow_Function CreateWinrtEglWindow = (CreateWinrtEglWindow_Function) SDL_LoadFunction(_this->egl_data->egl_dll_handle, "CreateWinrtEglWindow");
|
|
|
- if (!CreateWinrtEglWindow) {
|
|
|
- return SDL_SetError("Could not retrieve ANGLE/WinRT function CreateWinrtEglWindow");
|
|
|
+ CreateWinrtEglWindow_Old_Function CreateWinrtEglWindow = (CreateWinrtEglWindow_Old_Function) SDL_LoadFunction(_this->egl_data->egl_dll_handle, "CreateWinrtEglWindow");
|
|
|
+ if (CreateWinrtEglWindow) {
|
|
|
+ /* 'CreateWinrtEglWindow' was found, which means that an an older
|
|
|
+ * version of ANGLE/WinRT is being used. Continue setting up EGL,
|
|
|
+ * as appropriate to this version of ANGLE.
|
|
|
+ */
|
|
|
+
|
|
|
+ /* Create an ANGLE/WinRT EGL-window */
|
|
|
+ /* TODO, WinRT: check for XAML usage before accessing the CoreWindow, as not doing so could lead to a crash */
|
|
|
+ CoreWindow ^ native_win = CoreWindow::GetForCurrentThread();
|
|
|
+ Microsoft::WRL::ComPtr<IUnknown> cpp_win = reinterpret_cast<IUnknown *>(native_win);
|
|
|
+ HRESULT result = CreateWinrtEglWindow(cpp_win, ANGLE_D3D_FEATURE_LEVEL_ANY, &(video_data->winrtEglWindow));
|
|
|
+ if (FAILED(result)) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Call eglGetDisplay and eglInitialize as appropriate. On other
|
|
|
+ * platforms, this would probably get done by SDL_EGL_LoadLibrary,
|
|
|
+ * however ANGLE/WinRT's current implementation (as of Mar 22, 2014) of
|
|
|
+ * eglGetDisplay requires that a C++ object be passed into it, so the
|
|
|
+ * call will be made in this file, a C++ file, instead.
|
|
|
+ */
|
|
|
+ Microsoft::WRL::ComPtr<IUnknown> cpp_display = video_data->winrtEglWindow;
|
|
|
+ _this->egl_data->egl_display = ((eglGetDisplay_Old_Function)_this->egl_data->eglGetDisplay)(cpp_display);
|
|
|
+ if (!_this->egl_data->egl_display) {
|
|
|
+ return SDL_SetError("Could not get EGL display");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ const EGLint displayAttributes[] = {
|
|
|
+ EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
|
|
|
+ EGL_NONE,
|
|
|
+ };
|
|
|
+
|
|
|
+ /* 'CreateWinrtEglWindow' was NOT found, which either means that a
|
|
|
+ * newer version of ANGLE/WinRT is being used, or that we don't have
|
|
|
+ * a valid copy of ANGLE.
|
|
|
+ *
|
|
|
+ * Try loading ANGLE as if it were the newer version.
|
|
|
+ */
|
|
|
+ eglGetPlatformDisplayEXT_Function eglGetPlatformDisplayEXT = (eglGetPlatformDisplayEXT_Function)_this->egl_data->eglGetProcAddress("eglGetPlatformDisplayEXT");
|
|
|
+ if (!eglGetPlatformDisplayEXT) {
|
|
|
+ return SDL_SetError("Could not retrieve ANGLE/WinRT display function(s)");
|
|
|
+ }
|
|
|
+
|
|
|
+ _this->egl_data->egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttributes);
|
|
|
+ if (!_this->egl_data->egl_display) {
|
|
|
+ return SDL_SetError("Could not get EGL display");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- /* Create an ANGLE/WinRT EGL-window */
|
|
|
- /* TODO, WinRT: check for XAML usage before accessing the CoreWindow, as not doing so could lead to a crash */
|
|
|
- CoreWindow ^ native_win = CoreWindow::GetForCurrentThread();
|
|
|
- Microsoft::WRL::ComPtr<IUnknown> cpp_win = reinterpret_cast<IUnknown *>(native_win);
|
|
|
- HRESULT result = CreateWinrtEglWindow(cpp_win, ANGLE_D3D_FEATURE_LEVEL_ANY, &(video_data->winrtEglWindow));
|
|
|
- if (FAILED(result)) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- /* Call eglGetDisplay and eglInitialize as appropriate. On other
|
|
|
- * platforms, this would probably get done by SDL_EGL_LoadLibrary,
|
|
|
- * however ANGLE/WinRT's current implementation (as of Mar 22, 2014) of
|
|
|
- * eglGetDisplay requires that a C++ object be passed into it, so the
|
|
|
- * call will be made in this file, a C++ file, instead.
|
|
|
- */
|
|
|
- Microsoft::WRL::ComPtr<IUnknown> cpp_display = video_data->winrtEglWindow;
|
|
|
- _this->egl_data->egl_display = ((eglGetDisplay_Function)_this->egl_data->eglGetDisplay)(cpp_display);
|
|
|
- if (!_this->egl_data->egl_display) {
|
|
|
- return SDL_SetError("Could not get EGL display");
|
|
|
- }
|
|
|
-
|
|
|
if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) {
|
|
|
return SDL_SetError("Could not initialize EGL");
|
|
|
}
|