Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8293533

ClassCastException: Win32GraphicsConfig cannot be cast to class D3DGraphicsConfig

XMLWordPrintable

    • 2d
    • 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`.

            bae Andrew Brygin
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: