Sfoglia il codice sorgente

egl: Fix X11 EGL window creation on Nvidia

This is a port of 808a3f5 to SDL2.

Fixes #13094
Cameron Gutman 1 settimana fa
parent
commit
3146374e4a
1 ha cambiato i file con 12 aggiunte e 0 eliminazioni
  1. 12 0
      src/video/SDL_egl.c

+ 12 - 0
src/video/SDL_egl.c

@@ -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");
     }