mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-04-19 23:05:33 +02:00
egl: Fix X11 EGL window creation on Nvidia
This is a port of808a3f5to SDL2. Fixes #13094 (cherry picked from commit3146374e4a)
This commit is contained in:
@@ -1186,6 +1186,7 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
||||
/* max 2 key+value pairs, plus terminator. */
|
||||
EGLint attribs[5];
|
||||
int attr = 0;
|
||||
int opaque_ext_idx = -1;
|
||||
|
||||
EGLSurface *surface;
|
||||
|
||||
@@ -1220,6 +1221,7 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
||||
#ifdef EGL_EXT_present_opaque
|
||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_EXT_present_opaque")) {
|
||||
const SDL_bool allow_transparent = SDL_GetHintBoolean(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, SDL_FALSE);
|
||||
opaque_ext_idx = attr;
|
||||
attribs[attr++] = EGL_PRESENT_OPAQUE_EXT;
|
||||
attribs[attr++] = allow_transparent ? EGL_FALSE : EGL_TRUE;
|
||||
}
|
||||
@@ -1231,6 +1233,16 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
||||
_this->egl_data->egl_display,
|
||||
_this->egl_data->egl_config,
|
||||
nw, &attribs[0]);
|
||||
if (surface == EGL_NO_SURFACE) {
|
||||
/* we had a report of Nvidia drivers that report EGL_BAD_ATTRIBUTE if you try to
|
||||
* use EGL_PRESENT_OPAQUE_EXT, even when EGL_EXT_present_opaque is reported as available.
|
||||
* If we used it, try a second time without this attribute. */
|
||||
if ((_this->egl_data->eglGetError() == EGL_BAD_ATTRIBUTE) && (opaque_ext_idx >= 0)) {
|
||||
SDL_memmove(&attribs[opaque_ext_idx], &attribs[opaque_ext_idx + 2], sizeof (attribs[0]) * ((attr - opaque_ext_idx) - 2));
|
||||
surface = _this->egl_data->eglCreateWindowSurface(_this->egl_data->egl_display, _this->egl_data->egl_config, nw, &attribs[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (surface == EGL_NO_SURFACE) {
|
||||
SDL_EGL_SetError("unable to create an EGL window surface", "eglCreateWindowSurface");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user