RFR: 8378201: [OGL] glXMakeContextCurrent() drops the buffers of the unbound drawable
Sergey Bylokhov
serb at openjdk.org
Wed Feb 25 20:54:52 UTC 2026
The OGL pipeline on Linux passes raw X11 window id to GLX. This is allowed by the spec but is a deprecated compatibility path. Mesa has a [bug](https://gitlab.freedesktop.org/mesa/mesa/-/issues/1001) where glXMakeContextCurrent() drops the buffers of the previously bound drawable when switching to a different window, corrupting its content.
The fix creates GLXWindow objects via glXCreateWindow() and uses them instead of raw window id for all GLX calls. The question is where to store the GLXWindow. It could be stored in the java in XWindow and passed around, but that would pollute "shared xawt code" with OGL specific state even when OGL is not enabled. Instead, the GLXWindow is managed entirely on the native OGL side using a map keyed by the X window id. This keeps one GLXWindow per X window, creates it only when GLX surfaces are actually used, and uses reference counting so it is destroyed when the last surface releases it.
Also fixes [JDK-8369561](https://bugs.openjdk.org/browse/JDK-8369561) — wrong pixel colors in DrawBitmaskImage on Linux, same root cause.
Two tests added:
- MultiWindowFillTest — reproduces the bug: paints two windows different colors, switches context between them, verifies the first window's content survives
- FlipCoexistTest — verifies that direct rendering and flip BufferStrategy coexist on the same window. This test will fail if the implementation creates a separate GLXWindow per Java OGL surface instead of sharing one per X window
-------------
Commit messages:
- Update tests
- 8378201: [OGL] glXMakeContextCurrent() drops the buffers of the unbound drawable
Changes: https://git.openjdk.org/jdk/pull/29886/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29886&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8378201
Stats: 351 lines in 4 files changed: 346 ins; 1 del; 4 mod
Patch: https://git.openjdk.org/jdk/pull/29886.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/29886/head:pull/29886
PR: https://git.openjdk.org/jdk/pull/29886
More information about the client-libs-dev
mailing list