Index: ui/android/java/src/org/chromium/ui/VSyncMonitor.java |
diff --git a/ui/android/java/src/org/chromium/ui/VSyncMonitor.java b/ui/android/java/src/org/chromium/ui/VSyncMonitor.java |
index 8974b99c795cabb45440c9fb4a791067ec956d05..83d02d91da79382fb2f70035d1b041b27bbc6735 100644 |
--- a/ui/android/java/src/org/chromium/ui/VSyncMonitor.java |
+++ b/ui/android/java/src/org/chromium/ui/VSyncMonitor.java |
@@ -4,9 +4,7 @@ |
package org.chromium.ui; |
-import android.annotation.SuppressLint; |
import android.content.Context; |
-import android.os.Build; |
import android.os.Handler; |
import android.view.Choreographer; |
import android.view.WindowManager; |
@@ -15,13 +13,9 @@ import org.chromium.base.TraceEvent; |
/** |
* Notifies clients of the default displays's vertical sync pulses. |
- * On ICS, VSyncMonitor relies on setVSyncPointForICS() being called to set a reasonable |
- * approximation of a vertical sync starting point; see also http://crbug.com/156397. |
*/ |
-@SuppressLint("NewApi") |
public class VSyncMonitor { |
private static final long NANOSECONDS_PER_SECOND = 1000000000; |
- private static final long NANOSECONDS_PER_MILLISECOND = 1000000; |
private static final long NANOSECONDS_PER_MICROSECOND = 1000; |
private boolean mInsideVSync = false; |
@@ -49,14 +43,9 @@ public class VSyncMonitor { |
private boolean mHaveRequestInFlight; |
- // Choreographer is used to detect vsync on >= JB. |
private final Choreographer mChoreographer; |
private final Choreographer.FrameCallback mVSyncFrameCallback; |
- |
- // On ICS we just post a task through the handler (http://crbug.com/156397) |
- private final Runnable mVSyncRunnableCallback; |
private long mGoodStartingPointNano; |
- private long mLastPostedNano; |
// If the monitor is activated after having been idle, we synthesize the first vsync to reduce |
// latency. |
@@ -70,16 +59,6 @@ public class VSyncMonitor { |
* @param listener The listener receiving VSync notifications. |
*/ |
public VSyncMonitor(Context context, VSyncMonitor.Listener listener) { |
- this(context, listener, true); |
- } |
- |
- /** |
- * Constructs a VSyncMonitor |
- * @param context The application context. |
- * @param listener The listener receiving VSync notifications. |
- * @param enableJBVsync Whether to allow Choreographer-based notifications on JB and up. |
- */ |
- public VSyncMonitor(Context context, VSyncMonitor.Listener listener, boolean enableJBVSync) { |
mListener = listener; |
float refreshRate = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)) |
.getDefaultDisplay().getRefreshRate(); |
@@ -88,43 +67,25 @@ public class VSyncMonitor { |
if (refreshRate <= 0) refreshRate = 60; |
mRefreshPeriodNano = (long) (NANOSECONDS_PER_SECOND / refreshRate); |
- if (enableJBVSync && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { |
- // Use Choreographer on JB+ to get notified of vsync. |
- mChoreographer = Choreographer.getInstance(); |
- mVSyncFrameCallback = new Choreographer.FrameCallback() { |
- @Override |
- public void doFrame(long frameTimeNanos) { |
- TraceEvent.begin("VSync"); |
- if (useEstimatedRefreshPeriod && mConsecutiveVSync) { |
- // Display.getRefreshRate() is unreliable on some platforms. |
- // Adjust refresh period- initial value is based on Display.getRefreshRate() |
- // after that it asymptotically approaches the real value. |
- long lastRefreshDurationNano = frameTimeNanos - mGoodStartingPointNano; |
- float lastRefreshDurationWeight = 0.1f; |
- mRefreshPeriodNano += (long) (lastRefreshDurationWeight |
- * (lastRefreshDurationNano - mRefreshPeriodNano)); |
- } |
- mGoodStartingPointNano = frameTimeNanos; |
- onVSyncCallback(frameTimeNanos, getCurrentNanoTime()); |
- TraceEvent.end("VSync"); |
- } |
- }; |
- mVSyncRunnableCallback = null; |
- } else { |
- // On ICS we just hope that running tasks is relatively predictable. |
- mChoreographer = null; |
- mVSyncFrameCallback = null; |
- mVSyncRunnableCallback = new Runnable() { |
- @Override |
- public void run() { |
- TraceEvent.begin("VSyncTimer"); |
- final long currentTime = getCurrentNanoTime(); |
- onVSyncCallback(currentTime, currentTime); |
- TraceEvent.end("VSyncTimer"); |
+ mChoreographer = Choreographer.getInstance(); |
+ mVSyncFrameCallback = new Choreographer.FrameCallback() { |
+ @Override |
+ public void doFrame(long frameTimeNanos) { |
+ TraceEvent.begin("VSync"); |
+ if (useEstimatedRefreshPeriod && mConsecutiveVSync) { |
+ // Display.getRefreshRate() is unreliable on some platforms. |
+ // Adjust refresh period- initial value is based on Display.getRefreshRate() |
+ // after that it asymptotically approaches the real value. |
+ long lastRefreshDurationNano = frameTimeNanos - mGoodStartingPointNano; |
+ float lastRefreshDurationWeight = 0.1f; |
+ mRefreshPeriodNano += (long) (lastRefreshDurationWeight |
+ * (lastRefreshDurationNano - mRefreshPeriodNano)); |
} |
- }; |
- mLastPostedNano = 0; |
- } |
+ mGoodStartingPointNano = frameTimeNanos; |
+ onVSyncCallback(frameTimeNanos, getCurrentNanoTime()); |
+ TraceEvent.end("VSync"); |
+ } |
+ }; |
mSyntheticVSyncRunnable = new Runnable() { |
@Override |
public void run() { |
@@ -145,13 +106,6 @@ public class VSyncMonitor { |
} |
/** |
- * Determine whether a true vsync signal is available on this platform. |
- */ |
- private boolean isVSyncSignalAvailable() { |
- return mChoreographer != null; |
- } |
- |
- /** |
* Request to be notified of the closest display vsync events. |
* Listener.onVSync() will be called soon after the upcoming vsync pulses. |
*/ |
@@ -160,14 +114,6 @@ public class VSyncMonitor { |
} |
/** |
- * Set the best guess of the point in the past when the vsync has happened. |
- * @param goodStartingPointNano Known vsync point in the past. |
- */ |
- public void setVSyncPointForICS(long goodStartingPointNano) { |
- mGoodStartingPointNano = goodStartingPointNano; |
- } |
- |
- /** |
* @return true if onVSync handler is executing. If onVSync handler |
* introduces invalidations, View#invalidate() should be called. If |
* View#postInvalidateOnAnimation is called instead, the corresponding onDraw |
@@ -200,12 +146,8 @@ public class VSyncMonitor { |
if (mHaveRequestInFlight) return; |
mHaveRequestInFlight = true; |
if (postSyntheticVSync()) return; |
- if (isVSyncSignalAvailable()) { |
- mConsecutiveVSync = mInsideVSync; |
- mChoreographer.postFrameCallback(mVSyncFrameCallback); |
- } else { |
- postRunnableCallback(); |
- } |
+ mConsecutiveVSync = mInsideVSync; |
+ mChoreographer.postFrameCallback(mVSyncFrameCallback); |
} |
private boolean postSyntheticVSync() { |
@@ -224,20 +166,4 @@ public class VSyncMonitor { |
* mRefreshPeriodNano; |
return lastRefreshTime; |
} |
- |
- private void postRunnableCallback() { |
- assert !isVSyncSignalAvailable(); |
- final long currentTime = getCurrentNanoTime(); |
- final long lastRefreshTime = estimateLastVSyncTime(currentTime); |
- long delay = (lastRefreshTime + mRefreshPeriodNano) - currentTime; |
- assert delay > 0 && delay <= mRefreshPeriodNano; |
- |
- if (currentTime + delay <= mLastPostedNano + mRefreshPeriodNano / 2) { |
- delay += mRefreshPeriodNano; |
- } |
- |
- mLastPostedNano = currentTime + delay; |
- if (delay == 0) mHandler.post(mVSyncRunnableCallback); |
- else mHandler.postDelayed(mVSyncRunnableCallback, delay / NANOSECONDS_PER_MILLISECOND); |
- } |
} |