JDK-8293533 : ClassCastException: Win32GraphicsConfig cannot be cast to class D3DGraphicsConfig
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 11.0.16.1
  • Priority: P4
  • Status: Open
  • Resolution: Unresolved
  • OS: generic
  • CPU: generic
  • Submitted: 2022-09-06
  • Updated: 2022-09-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11
11-poolUnresolved
Description
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`.


Comments
Victor, I have nothing to do with Azul anymore, please assign to Andrew Brygin instead
08-09-2022

11.0.15+10-LTS, Azul
08-09-2022

Moving to JDK Project for review.
08-09-2022