Index: services/vsync/src/org/chromium/mojo/vsync/VSyncProviderImpl.java |
diff --git a/services/vsync/src/org/chromium/mojo/vsync/VSyncProviderImpl.java b/services/vsync/src/org/chromium/mojo/vsync/VSyncProviderImpl.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..adca2bc38868191bbee83077214148079e1350c4 |
--- /dev/null |
+++ b/services/vsync/src/org/chromium/mojo/vsync/VSyncProviderImpl.java |
@@ -0,0 +1,81 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.mojo.vsync; |
+ |
+import android.os.Handler; |
+import android.os.Looper; |
+import android.view.Choreographer; |
+ |
+import org.chromium.mojo.system.Core; |
+import org.chromium.mojo.system.MojoException; |
+import org.chromium.mojo.system.RunLoop; |
+import org.chromium.mojom.vsync.VSyncProvider; |
+ |
+/** |
+ * Android implementation of VSyncProvider. |
+ */ |
+public class VSyncProviderImpl implements VSyncProvider, Choreographer.FrameCallback { |
+ private final RunLoop mRunLoop; |
+ private Choreographer mChoreographer; |
+ private AwaitVSyncResponse mCallback; |
+ private Binding mBinding = null; |
+ |
+ public VSyncProviderImpl(Core core, Looper looper) { |
+ mRunLoop = core.getCurrentRunLoop(); |
+ // The choreographer must be initialized on a thread with a looper. |
+ new Handler(looper).post(new Runnable() { |
+ @Override |
+ public void run() { |
+ final Choreographer choreographer = Choreographer.getInstance(); |
+ mRunLoop.postDelayedTask(new Runnable() { |
+ @Override |
+ public void run() { |
+ mChoreographer = choreographer; |
+ if (mCallback != null) { |
+ mChoreographer.postFrameCallback(VSyncProviderImpl.this); |
+ } |
+ } |
+ }, 0); |
+ } |
+ }); |
+ } |
+ |
+ public void setBinding(Binding binding) { |
+ if (mBinding != null) { |
+ mBinding.unbind().close(); |
+ } |
+ mBinding = binding; |
+ } |
+ |
+ @Override |
+ public void close() {} |
+ |
+ @Override |
+ public void onConnectionError(MojoException e) {} |
+ |
+ @Override |
+ public void awaitVSync(final AwaitVSyncResponse callback) { |
+ if (mCallback != null) { |
+ setBinding(null); |
+ return; |
+ } |
+ mCallback = callback; |
+ if (mChoreographer != null) { |
+ // Posting from another thread is allowed on a choreographer. |
+ mChoreographer.postFrameCallback(this); |
+ } |
+ } |
+ |
+ @Override |
+ public void doFrame(final long frameTimeNanos) { |
+ mRunLoop.postDelayedTask(new Runnable() { |
abarth-chromium
2015/11/17 18:03:36
Why do we need an extra thread hop here? The Sky
qsr
2015/11/18 13:16:56
My guess is that sky is using the main thread to r
|
+ @Override |
+ public void run() { |
+ mCallback.call(frameTimeNanos / 1000); |
+ mCallback = null; |
+ } |
+ }, 0); |
+ } |
+} |