|
@@ -81,6 +81,10 @@
|
|
|
#define DEFAULT_OGL_ES "libGLESv1_CM.so.1"
|
|
|
#endif /* SDL_VIDEO_DRIVER_RPI */
|
|
|
|
|
|
+#if SDL_VIDEO_OPENGL
|
|
|
+#include "SDL_opengl.h"
|
|
|
+#endif
|
|
|
+
|
|
|
/** If we happen to not have this defined because of an older EGL version, just define it 0x0
|
|
|
as eglGetPlatformDisplayEXT will most likely be NULL if this is missing
|
|
|
*/
|
|
@@ -943,6 +947,34 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+ /* Check whether making contexts current without a surface is supported.
|
|
|
+ * First condition: EGL must support it. That's the case for EGL 1.5
|
|
|
+ * or later, or if the EGL_KHR_surfaceless_context extension is present. */
|
|
|
+ if ((_this->egl_data->egl_version_major > 1) ||
|
|
|
+ ((_this->egl_data->egl_version_major == 1) && (_this->egl_data->egl_version_minor >= 5)) ||
|
|
|
+ SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_KHR_surfaceless_context"))
|
|
|
+ {
|
|
|
+ /* Secondary condition: The client API must support it. */
|
|
|
+ if (profile_es) {
|
|
|
+ /* On OpenGL ES, the GL_OES_surfaceless_context extension must be
|
|
|
+ * present. */
|
|
|
+ if (SDL_GL_ExtensionSupported("GL_OES_surfaceless_context")) {
|
|
|
+ _this->gl_allow_no_surface = 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* Desktop OpenGL supports it by default from version 3.0 on. */
|
|
|
+ void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params);
|
|
|
+ glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv");
|
|
|
+ if (glGetIntegervFunc) {
|
|
|
+ GLint v = 0;
|
|
|
+ glGetIntegervFunc(GL_MAJOR_VERSION, &v);
|
|
|
+ if (v >= 3) {
|
|
|
+ _this->gl_allow_no_surface = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return (SDL_GLContext) egl_context;
|
|
|
}
|
|
|
|
|
@@ -958,7 +990,7 @@ SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context)
|
|
|
/* The android emulator crashes badly if you try to eglMakeCurrent
|
|
|
* with a valid context and invalid surface, so we have to check for both here.
|
|
|
*/
|
|
|
- if (!egl_context || !egl_surface) {
|
|
|
+ if (!egl_context || (!egl_surface && !_this->gl_allow_no_surface)) {
|
|
|
_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
|
|
} else {
|
|
|
if (!_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display,
|