-
Bug
-
Resolution: Unresolved
-
P4
-
11.0.16.1
-
generic
-
generic
ADDITIONAL SYSTEM INFORMATION :
OS Build number: Windows 10 Pro 2009 (19043)
Java version: 11.0.15+10-LTS, Azul Systems, Inc., OpenJDK 64-Bit Server VM (note: this bug is present in current versions of OpenJDK, see description)
A DESCRIPTION OF THE PROBLEM :
Downstream ticket: https://josm.openstreetmap.de/ticket/22340
See https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L276 for where the failing cast is occurring. See https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L176 for the declaration of `graphicsDevice` (it is a https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java object).
Looking at the https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java#L444 method, it calls `super.getDefaultConfiguration()` if https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java#L142 returns `false`, which is https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/awt/Win32GraphicsDevice.java#L297.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Note: These are best guess steps to reproduce, based off of an investigation into the issue
1. Have a D3DSurfaceData object with a `D3DGraphicsDevice`.
2. Disable d3d on the device
3. Trigger a repaint
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No crash. Possibly slower painting.
ACTUAL -
Thread: AWT-EventQueue-1 (52) of JOSM
java.lang.ClassCastException: class sun.awt.Win32GraphicsConfig cannot be cast to class sun.java2d.d3d.D3DGraphicsConfig (sun.awt.Win32GraphicsConfig and sun.java2d.d3d.D3DGraphicsConfig are in module java.desktop of loader 'bootstrap')
at java.desktop/sun.java2d.d3d.D3DSurfaceData.makeProxyFor(D3DSurfaceData.java:276)
at java.desktop/sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:230)
at java.desktop/sun.java2d.pipe.DrawImage.renderImageScale(DrawImage.java:635)
at java.desktop/sun.java2d.pipe.DrawImage.scaleImage(DrawImage.java:730)
at java.desktop/sun.java2d.pipe.DrawImage.scaleImage(DrawImage.java:1081)
at java.desktop/sun.java2d.pipe.ValidatePipe.scaleImage(ValidatePipe.java:219)
at java.desktop/sun.java2d.SunGraphics2D.scaleImage(SunGraphics2D.java:3204)
at java.desktop/sun.java2d.SunGraphics2D.drawHiDPIImage(SunGraphics2D.java:3188)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3423)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3407)
at java.desktop/sun.swing.CachedPainter.paintImage(CachedPainter.java:249)
at java.desktop/sun.swing.CachedPainter.paint0(CachedPainter.java:217)
at java.desktop/sun.swing.CachedPainter.paint(CachedPainter.java:114)
at java.desktop/com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkinRaw(XPStyle.java:624)
at java.desktop/com.sun.java.swing.plaf.windows.AnimationController.paintSkin(AnimationController.java:254)
at java.desktop/com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkin(XPStyle.java:600)
at java.desktop/com.sun.java.swing.plaf.windows.WindowsToolBarSeparatorUI.paint(WindowsToolBarSeparatorUI.java:96)
at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5262)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
at java.desktop/java.awt.Container.paint(Container.java:2002)
at java.desktop/java.awt.Window.paint(Window.java:3940)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1890)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
CUSTOMER SUBMITTED WORKAROUND :
A temporary fix in the JDK is possible, using
```
var config = graphicsDevice.getDefaultConfiguration();
if (config instanceof D3DGraphicsConfig) {
return D3DSurfaceDataProxy.createProxy((D3DGraphicsConfig)graphicsDevice.getDefaultConfiguration());
}
return super.makeProxyFor(srcData);
```
for https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L273-L277 .
The super call just returns `SurfaceDataProxy.UNCACHED`.
OS Build number: Windows 10 Pro 2009 (19043)
Java version: 11.0.15+10-LTS, Azul Systems, Inc., OpenJDK 64-Bit Server VM (note: this bug is present in current versions of OpenJDK, see description)
A DESCRIPTION OF THE PROBLEM :
Downstream ticket: https://josm.openstreetmap.de/ticket/22340
See https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L276 for where the failing cast is occurring. See https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L176 for the declaration of `graphicsDevice` (it is a https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java object).
Looking at the https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java#L444 method, it calls `super.getDefaultConfiguration()` if https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsDevice.java#L142 returns `false`, which is https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/awt/Win32GraphicsDevice.java#L297.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Note: These are best guess steps to reproduce, based off of an investigation into the issue
1. Have a D3DSurfaceData object with a `D3DGraphicsDevice`.
2. Disable d3d on the device
3. Trigger a repaint
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No crash. Possibly slower painting.
ACTUAL -
Thread: AWT-EventQueue-1 (52) of JOSM
java.lang.ClassCastException: class sun.awt.Win32GraphicsConfig cannot be cast to class sun.java2d.d3d.D3DGraphicsConfig (sun.awt.Win32GraphicsConfig and sun.java2d.d3d.D3DGraphicsConfig are in module java.desktop of loader 'bootstrap')
at java.desktop/sun.java2d.d3d.D3DSurfaceData.makeProxyFor(D3DSurfaceData.java:276)
at java.desktop/sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:230)
at java.desktop/sun.java2d.pipe.DrawImage.renderImageScale(DrawImage.java:635)
at java.desktop/sun.java2d.pipe.DrawImage.scaleImage(DrawImage.java:730)
at java.desktop/sun.java2d.pipe.DrawImage.scaleImage(DrawImage.java:1081)
at java.desktop/sun.java2d.pipe.ValidatePipe.scaleImage(ValidatePipe.java:219)
at java.desktop/sun.java2d.SunGraphics2D.scaleImage(SunGraphics2D.java:3204)
at java.desktop/sun.java2d.SunGraphics2D.drawHiDPIImage(SunGraphics2D.java:3188)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3423)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3407)
at java.desktop/sun.swing.CachedPainter.paintImage(CachedPainter.java:249)
at java.desktop/sun.swing.CachedPainter.paint0(CachedPainter.java:217)
at java.desktop/sun.swing.CachedPainter.paint(CachedPainter.java:114)
at java.desktop/com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkinRaw(XPStyle.java:624)
at java.desktop/com.sun.java.swing.plaf.windows.AnimationController.paintSkin(AnimationController.java:254)
at java.desktop/com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkin(XPStyle.java:600)
at java.desktop/com.sun.java.swing.plaf.windows.WindowsToolBarSeparatorUI.paint(WindowsToolBarSeparatorUI.java:96)
at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5262)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
at java.desktop/java.awt.Container.paint(Container.java:2002)
at java.desktop/java.awt.Window.paint(Window.java:3940)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1890)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
CUSTOMER SUBMITTED WORKAROUND :
A temporary fix in the JDK is possible, using
```
var config = graphicsDevice.getDefaultConfiguration();
if (config instanceof D3DGraphicsConfig) {
return D3DSurfaceDataProxy.createProxy((D3DGraphicsConfig)graphicsDevice.getDefaultConfiguration());
}
return super.makeProxyFor(srcData);
```
for https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java#L273-L277 .
The super call just returns `SurfaceDataProxy.UNCACHED`.