mirror of
https://github.com/glfw/glfw.git
synced 2024-11-11 04:53:50 +00:00
Wayland: Fix window opacity on older systems
On systems lacking the EGL_EXT_present_opaque extension, some
compositors treat any buffer with an alpha channel as per-pixel
transparent.
This commit ignores any EGLConfig with an alpha channel if the extension
is missing and the window is created with GLFW_TRANSPARENT_FRAMEBUFFER
set to false.
This is technically not a breaking change since GLFW_ALPHA_BITS is not
a hard constraint, but it is still going to inconvenience anyone using
the framebuffer alpa channel to store other kinds of data.
Related to #1895
(cherry picked from commit ef6c9d8b4f
)
This commit is contained in:
parent
1f675ab62f
commit
8b4f1ebbea
@ -180,6 +180,7 @@ video tutorials.
|
|||||||
- pthom
|
- pthom
|
||||||
- Martin Pulec
|
- Martin Pulec
|
||||||
- Guillaume Racicot
|
- Guillaume Racicot
|
||||||
|
- Christian Rauch
|
||||||
- Philip Rideout
|
- Philip Rideout
|
||||||
- Eddie Ringle
|
- Eddie Ringle
|
||||||
- Max Risuhin
|
- Max Risuhin
|
||||||
|
@ -124,6 +124,8 @@ information on what to include when reporting a bug.
|
|||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
- [Wayland] Bugfix: Connecting a mouse after `glfwInit` would segfault (#1450)
|
- [Wayland] Bugfix: Connecting a mouse after `glfwInit` would segfault (#1450)
|
||||||
|
- [Wayland] Disabled alpha channel for opaque windows on systems lacking
|
||||||
|
`EGL_EXT_present_opaque` (#1895)
|
||||||
- [Linux] Bugfix: Joysticks without buttons were ignored (#2042,#2043)
|
- [Linux] Bugfix: Joysticks without buttons were ignored (#2042,#2043)
|
||||||
[EGL] Added loading of glvnd `libOpenGL.so.0` where available for OpenGL
|
[EGL] Added loading of glvnd `libOpenGL.so.0` where available for OpenGL
|
||||||
- [GLX] Added loading of glvnd `libGLX.so.0` where available
|
- [GLX] Added loading of glvnd `libGLX.so.0` where available
|
||||||
|
@ -312,6 +312,19 @@ Starting with GLFW 3.3.7, events posted with @ref glfwPostEmptyEvent now use a s
|
|||||||
unnamed pipe instead of sending an X11 client event to the helper window.
|
unnamed pipe instead of sending an X11 client event to the helper window.
|
||||||
|
|
||||||
|
|
||||||
|
@subsubsection wayland_alpha_34 Frambuffer may lack alpha channel on older Wayland systems
|
||||||
|
|
||||||
|
On Wayland, when creating an EGL context on a machine lacking the new
|
||||||
|
`EGL_EXT_present_opaque` extension, the @ref GLFW_ALPHA_BITS window hint will be
|
||||||
|
ignored and the framebuffer will have no alpha channel. This is because some
|
||||||
|
Wayland compositors treat any buffer with an alpha channel as per-pixel
|
||||||
|
transparent.
|
||||||
|
|
||||||
|
If you want a per-pixel transparent window, see the
|
||||||
|
[GLFW_TRANSPARENT_FRAMEBUFFER](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) window
|
||||||
|
hint.
|
||||||
|
|
||||||
|
|
||||||
@subsection deprecations_33 Deprecations in version 3.3
|
@subsection deprecations_33 Deprecations in version 3.3
|
||||||
|
|
||||||
@subsubsection charmods_callback_33 Character with modifiers callback
|
@subsubsection charmods_callback_33 Character with modifiers callback
|
||||||
|
@ -172,6 +172,18 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
|
|||||||
u->depthBits = getEGLConfigAttrib(n, EGL_DEPTH_SIZE);
|
u->depthBits = getEGLConfigAttrib(n, EGL_DEPTH_SIZE);
|
||||||
u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);
|
u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);
|
||||||
|
|
||||||
|
#if defined(_GLFW_WAYLAND)
|
||||||
|
// NOTE: The wl_surface opaque region is no guarantee that its buffer
|
||||||
|
// is presented as opaque, if it also has an alpha channel
|
||||||
|
// HACK: If EGL_EXT_present_opaque is unavailable, ignore any config
|
||||||
|
// with an alpha channel to ensure the buffer is opaque
|
||||||
|
if (!_glfw.egl.EXT_present_opaque)
|
||||||
|
{
|
||||||
|
if (!desired->transparent && u->alphaBits > 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif // _GLFW_WAYLAND
|
||||||
|
|
||||||
u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);
|
u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);
|
||||||
u->doublebuffer = desired->doublebuffer;
|
u->doublebuffer = desired->doublebuffer;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user