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

Reply via email to