# HG changeset patch # User malenkov # Date 1246021126 -14400 # Node ID b5931be76fbcaeb357b1be42fc903f3c102a8c8d # Parent cce457efb5d82a0eba37a0ad4170f43bfd4a0aa8 6679840: provide a way to choose v-synced BufferStrategy Reviewed-by: peterz diff -r cce457efb5d8 -r b5931be76fbc jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java --- a/jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java Fri Jun 26 16:30:02 2009 +0400 +++ b/jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java Fri Jun 26 16:58:46 2009 +0400 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,17 @@ import sun.awt.EventQueueDelegate; import sun.awt.AppContext; +import java.util.Collections; import java.util.Map; +import java.util.WeakHashMap; import java.util.concurrent.Callable; import java.awt.AWTEvent; import java.awt.EventQueue; import java.awt.Component; +import java.awt.Container; import javax.swing.JComponent; import javax.swing.RepaintManager; +import javax.swing.SwingUtilities; /** * A collection of utility methods for Swing. @@ -69,6 +73,43 @@ repaintManager); } + private static final Map vsyncedMap = + Collections.synchronizedMap(new WeakHashMap()); + + /** + * Sets vsyncRequested state for the {@code rootContainer}. If + * {@code isRequested} is {@code true} then vsynced + * {@code BufferStrategy} is enabled for this {@code rootContainer}. + * + * Note: requesting vsynced painting does not guarantee one. The outcome + * depends on current RepaintManager's RepaintManager.PaintManager + * and on the capabilities of the graphics hardware/software and what not. + * + * @param rootContainer topmost container. Should be either {@code Window} + * or {@code Applet} + * @param isRequested the value to set vsyncRequested state to + */ + public static void setVsyncRequested(Container rootContainer, + boolean isRequested) { + assert SwingUtilities.getRoot(rootContainer) == rootContainer; + if (isRequested) { + vsyncedMap.put(rootContainer, Boolean.TRUE); + } else { + vsyncedMap.remove(rootContainer); + } + } + + /** + * Checks if vsync painting is requested for {@code rootContainer} + * + * @param rootContainer topmost container. Should be either Window or Applet + * @return {@code true} if vsync painting is requested for {@code rootContainer} + */ + public static boolean isVsyncRequested(Container rootContainer) { + assert SwingUtilities.getRoot(rootContainer) == rootContainer; + return Boolean.TRUE == vsyncedMap.get(rootContainer); + } + /** * Returns delegate {@code RepaintManager} for {@code component} hierarchy. */ diff -r cce457efb5d8 -r b5931be76fbc jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java --- a/jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java Fri Jun 26 16:30:02 2009 +0400 +++ b/jdk/src/share/classes/javax/swing/BufferStrategyPaintManager.java Fri Jun 26 16:58:46 2009 +0400 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,13 @@ import java.security.AccessController; import java.util.*; import java.util.logging.*; + +import com.sun.java.swing.SwingUtilities3; + import sun.awt.SubRegionShowable; import sun.java2d.SunGraphics2D; import sun.security.action.GetPropertyAction; +import sun.java2d.pipe.hw.ExtendedBufferCapabilities; /** * A PaintManager implementation that uses a BufferStrategy for @@ -73,12 +77,6 @@ private static Method COMPONENT_CREATE_BUFFER_STRATEGY_METHOD; private static Method COMPONENT_GET_BUFFER_STRATEGY_METHOD; - /** - * Indicates whether or not we should try and get a flip buffer strategy - * first, default is false. - */ - private static boolean TRY_FLIP; - private static final Logger LOGGER = Logger.getLogger( "javax.swing.BufferStrategyPaintManager"); @@ -151,12 +149,6 @@ */ private boolean disposeBufferOnEnd; - - static { - TRY_FLIP = "true".equals(AccessController.doPrivileged( - new GetPropertyAction("swing.useFlipBufferStrategy", "false"))); - } - private static Method getGetBufferStrategyMethod() { if (COMPONENT_GET_BUFFER_STRATEGY_METHOD == null) { getMethods(); @@ -257,7 +249,7 @@ try { BufferInfo info = getBufferInfo(c); BufferStrategy bufferStrategy; - if (info != null && !info.usingFlip && info.isInSync() && + if (info != null && info.isInSync() && (bufferStrategy = info.getBufferStrategy(false)) != null) { SubRegionShowable bsSubRegion = (SubRegionShowable)bufferStrategy; @@ -685,8 +677,6 @@ // same reason. private WeakReference weakBS; private WeakReference root; - // Whether or not we're using flip bs or blit. - private boolean usingFlip; // Indicates whether or not the backbuffer and display are in sync. // This is set to true when a full repaint on the rootpane is done. private boolean inSync; @@ -764,13 +754,6 @@ } /** - * Returns true if using a flip buffer strategy. - */ - public boolean usingFlip() { - return usingFlip; - } - - /** * Returns true if the buffer strategy of the component differs * from current buffer strategy. */ @@ -814,23 +797,19 @@ * blit. */ private BufferStrategy createBufferStrategy() { - BufferCapabilities caps; Container root = getRoot(); if (root == null) { return null; } BufferStrategy bs = null; - if (TRY_FLIP) { - bs = createBufferStrategy(root,BufferCapabilities.FlipContents. - COPIED); - usingFlip = true; + if (SwingUtilities3.isVsyncRequested(root)) { + bs = createBufferStrategy(root, true); if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.finer("createBufferStrategy: using flip strategy"); + LOGGER.finer("createBufferStrategy: using vsynced strategy"); } } if (bs == null) { - bs = createBufferStrategy(root, null); - usingFlip = false; + bs = createBufferStrategy(root, false); } if (!(bs instanceof SubRegionShowable)) { // We do this for two reasons: @@ -843,15 +822,22 @@ return bs; } - // Creates and returns a buffer strategy of the requested type. If + // Creates and returns a buffer strategy. If // there is a problem creating the buffer strategy this will // eat the exception and return null. private BufferStrategy createBufferStrategy(Container root, - BufferCapabilities.FlipContents type) { - BufferCapabilities caps = new BufferCapabilities( - new ImageCapabilities(true), - new ImageCapabilities(true), - type); + boolean isVsynced) { + BufferCapabilities caps; + if (isVsynced) { + caps = new ExtendedBufferCapabilities( + new ImageCapabilities(true), new ImageCapabilities(true), + BufferCapabilities.FlipContents.COPIED, + ExtendedBufferCapabilities.VSyncType.VSYNC_ON); + } else { + caps = new BufferCapabilities( + new ImageCapabilities(true), new ImageCapabilities(true), + null); + } BufferStrategy bs = null; if (root instanceof Applet) { try {