Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
index f7a4cab8364a7bd0e60e41ef0b1a9c00801e6c68..4a4124d9ef7dcb6fd099833bcc231342d9f71105 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
@@ -9,11 +9,14 @@ import android.content.Context; |
import android.graphics.Color; |
import android.graphics.PixelFormat; |
import android.graphics.Rect; |
+import android.os.Build; |
+import android.view.Display; |
import android.view.MotionEvent; |
import android.view.Surface; |
import android.view.SurfaceHolder; |
import android.view.SurfaceView; |
import android.view.View; |
+import android.view.WindowManager; |
import org.chromium.base.CommandLine; |
import org.chromium.base.Log; |
@@ -21,7 +24,6 @@ import org.chromium.base.TraceEvent; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
-import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeSwitches; |
import org.chromium.chrome.browser.compositor.layouts.Layout; |
import org.chromium.chrome.browser.compositor.layouts.LayoutProvider; |
@@ -47,6 +49,7 @@ import org.chromium.ui.resources.ResourceManager; |
public class CompositorView |
extends SurfaceView implements ContentOffsetProvider, SurfaceHolder.Callback { |
private static final String TAG = "CompositorView"; |
+ private static final long NANOSECONDS_PER_MILLISECOND = 1000000; |
// Cache objects that should not be created every frame |
private final Rect mCacheViewport = new Rect(); |
@@ -61,6 +64,9 @@ public class CompositorView |
private int mLastLayerCount; |
+ // A conservative estimate of when a frame is guaranteed to be presented after being submitted. |
+ private long mFramePresentationDelay; |
+ |
// Resource Management |
private ResourceManager mResourceManager; |
@@ -187,6 +193,18 @@ public class CompositorView |
setBackgroundColor(Color.WHITE); |
setVisibility(View.VISIBLE); |
+ mFramePresentationDelay = 0; |
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { |
+ Display display = |
+ ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)) |
+ .getDefaultDisplay(); |
+ long presentationDeadline = display.getPresentationDeadlineNanos() |
+ / NANOSECONDS_PER_MILLISECOND; |
+ long vsyncPeriod = mWindowAndroid.getVsyncPeriodInMillis(); |
+ mFramePresentationDelay = Math.min(3 * vsyncPeriod, |
+ ((presentationDeadline + vsyncPeriod - 1) / vsyncPeriod) * vsyncPeriod); |
+ } |
+ |
// Grab the Resource Manager |
mResourceManager = nativeGetResourceManager(mNativeCompositorView); |
} |
@@ -289,12 +307,12 @@ public class CompositorView |
private void onSwapBuffersCompleted(int pendingSwapBuffersCount) { |
// Clear the color used to cover the uninitialized surface. |
if (getBackground() != null) { |
- post(new Runnable() { |
+ postDelayed(new Runnable() { |
@Override |
public void run() { |
setBackgroundResource(0); |
} |
- }); |
+ }, mFramePresentationDelay); |
} |
mRenderHost.onSwapBuffersCompleted(pendingSwapBuffersCount); |