[OpenJDK 2D-Dev] [13] Review Request: 6933331 (d3d/ogl) java.lang.IllegalStateException: Buffers have not been created

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Tue May 14 22:15:47 UTC 2019

Please review the fix for JDK 13.

Bug: https://bugs.openjdk.java.net/browse/JDK-6933331
Fix: http://cr.openjdk.java.net/~serb/6933331/webrev.00

While working on enabling LCD rendering on macOS via BufferStrategy rendering, I was able to find this bug, which was previously mainly reported on Windows where we use this code path. Usually the problem described as an intermittent exception after "changing display resolutions", and I think that the root cause is that in such intermittent situations we will recreate the peer of the component when we cannot update the  GraphicConfig information on the fly in the java.awt.Component.java:
void setGraphicsConfiguration(GraphicsConfiguration gc) {
1155         synchronized(getTreeLock()) {
1156             if (updateGraphicsData(gc)) {
1157                 removeNotify();
1158                 addNotify();
1159             }
1160         }
1161     }

The bug can be easily reproduced if we will enable buffer strategy for the Window, and then dispose of the Window, and show again. In this case, the Window will drop internal buffers used by the bufferstrategy in the removeNotify() method, and we will get an exception when later the buffer strategy will try to use them.

As a solution, I suggest recreating the backbuffers in the bufferStrategy if the old buffer was disposed of.

Best regards, Sergey.

More information about the 2d-dev mailing list