On Wed, 4 Mar 2026 01:32:26 GMT, Sergey Bylokhov <[email protected]> wrote:
>> 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 > > Sergey Bylokhov has updated the pull request incrementally with one > additional commit since the last revision: > > Review feedback Marked as reviewed by aivanov (Reviewer). test/jdk/sun/java2d/OpenGL/FlipCoexistTest.java line 110: > 108: private static void check(Robot robot, Frame frame, int x, int y, > Color exp, > 109: String desc) > 110: { Suggestion: private static void check(Robot robot, Frame frame, int x, int y, Color exp, String desc) { Is there a specific reason of putting the opening brace on its own line? test/jdk/sun/java2d/OpenGL/MultiWindowFillTest.java line 98: > 96: private static void check(Robot robot, Frame frame, int w, int h, > 97: Color exp, String desc) > 98: { Suggestion: private static void check(Robot robot, Frame frame, int w, int h, Color exp, String desc) { This is the only method doesn't leave the opening brace on the same line… ------------- PR Review: https://git.openjdk.org/jdk/pull/29886#pullrequestreview-3917862385 PR Review Comment: https://git.openjdk.org/jdk/pull/29886#discussion_r2907622245 PR Review Comment: https://git.openjdk.org/jdk/pull/29886#discussion_r2907635665
