On Wed, 29 Sep 2021 00:42:01 GMT, Sergey Bylokhov <[email protected]> wrote:

> Do you know why we post it twice? It does not seem right, since we repaint 
> all content in the apps like Netbeans/Idea and it is quite a heavyweight 
> operation.

Because SurfaceData is judged to be lost when 1st getGraphics() is called on 
1st PaintEvent processing.

https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java#L478

I traced PaintEvent, then I got following stacktrace.


breakpoint hit: "Thread=AWT-EventQueue-0", 
java.awt.event.PaintEvent.<init>()、line=106 bci=0

  [1] java.awt.event.PaintEvent.<init> (PaintEvent.java:106)
  [2] sun.awt.PaintEventDispatcher.createPaintEvent 
(PaintEventDispatcher.java:80)
  [3] sun.awt.windows.WComponentPeer.postPaintIfNecessary 
(WComponentPeer.java:892)
  [4] sun.awt.windows.WComponentPeer.handlePaint (WComponentPeer.java:886)
  [5] sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget 
(D3DScreenUpdateManager.java:283)
  [6] sun.java2d.d3d.D3DScreenUpdateManager.validate 
(D3DScreenUpdateManager.java:492)
  [7] sun.java2d.d3d.D3DScreenUpdateManager.createGraphics 
(D3DScreenUpdateManager.java:260)
  [8] sun.awt.windows.WComponentPeer.getGraphics (WComponentPeer.java:646)
  [9] java.awt.Component.getGraphics (Component.java:3,128)
  [10] sun.awt.RepaintArea.paint (RepaintArea.java:227)
  [11] sun.awt.windows.WComponentPeer.handleEvent (WComponentPeer.java:371)
  [12] java.awt.Component.dispatchEventImpl (Component.java:5,056)
  [13] java.awt.Container.dispatchEventImpl (Container.java:2,325)
  [14] java.awt.Window.dispatchEventImpl (Window.java:2,775)
  [15] java.awt.Component.dispatchEvent (Component.java:4,827)
  [16] java.awt.EventQueue.dispatchEventImpl (EventQueue.java:772)
  [17] java.awt.EventQueue$4.run (EventQueue.java:721)
  [18] java.awt.EventQueue$4.run (EventQueue.java:715)
  [19] java.security.AccessController.executePrivileged 
(AccessController.java:753)
  [20] java.security.AccessController.doPrivileged (AccessController.java:391)
  [21] 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege 
(ProtectionDomain.java:85)
  [22] 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege 
(ProtectionDomain.java:95)
  [23] java.awt.EventQueue$5.run (EventQueue.java:745)
  [24] java.awt.EventQueue$5.run (EventQueue.java:743)
  [25] java.security.AccessController.executePrivileged 
(AccessController.java:753)
  [26] java.security.AccessController.doPrivileged (AccessController.java:391)
  [27] 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege 
(ProtectionDomain.java:85)
  [28] java.awt.EventQueue.dispatchEvent (EventQueue.java:742)
  [29] java.awt.EventDispatchThread.pumpOneEventForFilters 
(EventDispatchThread.java:203)
  [30] java.awt.EventDispatchThread.pumpEventsForFilter 
(EventDispatchThread.java:124)
  [31] java.awt.EventDispatchThread.pumpEventsForHierarchy 
(EventDispatchThread.java:113)
  [32] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:109)
  [33] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:101)
  [34] java.awt.EventDispatchThread.run (EventDispatchThread.java:90)
AWT-EventQueue-0[1] > >


At 1st PaintEvent is processing, RepaintArea calls getGraphics(), then 
D3DScreenUpdateManager finally calls new PaintEvent().
So, 2nd PaintEvent is posted and invoked later on EDT.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5491

Reply via email to