diff --git a/include/SDL_hints.h b/include/SDL_hints.h index c3ae80dbb..c18c14f8d 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -1218,6 +1218,17 @@ extern "C" { */ #define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" +/** + * \brief A variable controlling whether the EGL window is allowed to be + * composited as transparent, rather than opaque. + * + * Most window systems will always render windows opaque, even if the surface + * format has an alpha channel. This is not always true, however, so by default + * SDL will try to enforce opaque composition. To override this behavior, you + * can set this hint to "1". + */ +#define SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY "SDL_VIDEO_EGL_ALLOW_TRANSPARENCY" + /** * \brief A variable controlling whether the graphics context is externally managed. * diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 41966db45..de7999cf6 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -1223,8 +1223,9 @@ 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); attribs[attr++] = EGL_PRESENT_OPAQUE_EXT; - attribs[attr++] = EGL_TRUE; + attribs[attr++] = allow_transparent ? EGL_FALSE : EGL_TRUE; } #endif