Add SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index c3ae80d..c18c14f 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1219,6 +1219,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.
*
* This variable can be set to the following values:
diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c
index 41966db..de7999c 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