summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorJorim Jaggi <jjaggi@google.com>2017-06-09 04:06:38 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-06-09 04:06:43 +0000
commitd1f55f630228fbb49fbd8724d86feb7f9ddd24fb (patch)
tree20133bf45e22ba793c52d4d1f452abbfe6282bd1 /core/java
parent713ad88afecfdc91e7c4b5184f62bf663143d040 (diff)
parent34a0cdb98eb5561774ea4e7b3b602aad80c4a3cc (diff)
Merge "Properly run window animations at vsync-sf (1/2)" into oc-dev
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/view/Choreographer.java35
-rw-r--r--core/java/android/view/DisplayEventReceiver.java25
2 files changed, 52 insertions, 8 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index aac5baacdb11..597be6864494 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -16,6 +16,9 @@
package android.view;
+import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP;
+import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER;
+
import android.hardware.display.DisplayManagerGlobal;
import android.os.Handler;
import android.os.Looper;
@@ -102,10 +105,23 @@ public final class Choreographer {
if (looper == null) {
throw new IllegalStateException("The current thread must have a looper!");
}
- return new Choreographer(looper);
+ return new Choreographer(looper, VSYNC_SOURCE_APP);
}
};
+ // Thread local storage for the SF choreographer.
+ private static final ThreadLocal<Choreographer> sSfThreadInstance =
+ new ThreadLocal<Choreographer>() {
+ @Override
+ protected Choreographer initialValue() {
+ Looper looper = Looper.myLooper();
+ if (looper == null) {
+ throw new IllegalStateException("The current thread must have a looper!");
+ }
+ return new Choreographer(looper, VSYNC_SOURCE_SURFACE_FLINGER);
+ }
+ };
+
// Enable/disable vsync for animations and drawing.
private static final boolean USE_VSYNC = SystemProperties.getBoolean(
"debug.choreographer.vsync", true);
@@ -202,10 +218,12 @@ public final class Choreographer {
private static final int CALLBACK_LAST = CALLBACK_COMMIT;
- private Choreographer(Looper looper) {
+ private Choreographer(Looper looper, int vsyncSource) {
mLooper = looper;
mHandler = new FrameHandler(looper);
- mDisplayEventReceiver = USE_VSYNC ? new FrameDisplayEventReceiver(looper) : null;
+ mDisplayEventReceiver = USE_VSYNC
+ ? new FrameDisplayEventReceiver(looper, vsyncSource)
+ : null;
mLastFrameTimeNanos = Long.MIN_VALUE;
mFrameIntervalNanos = (long)(1000000000 / getRefreshRate());
@@ -233,6 +251,13 @@ public final class Choreographer {
return sThreadInstance.get();
}
+ /**
+ * @hide
+ */
+ public static Choreographer getSfInstance() {
+ return sSfThreadInstance.get();
+ }
+
/** Destroys the calling thread's choreographer
* @hide
*/
@@ -816,8 +841,8 @@ public final class Choreographer {
private long mTimestampNanos;
private int mFrame;
- public FrameDisplayEventReceiver(Looper looper) {
- super(looper);
+ public FrameDisplayEventReceiver(Looper looper, int vsyncSource) {
+ super(looper, vsyncSource);
}
@Override
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index 67cdfc53fb39..caadc364a3fb 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -35,6 +35,23 @@ import java.lang.ref.WeakReference;
* @hide
*/
public abstract class DisplayEventReceiver {
+
+ /**
+ * When retrieving vsync events, this specifies that the vsync event should happen at the normal
+ * vsync-app tick.
+ * <p>
+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h
+ */
+ public static final int VSYNC_SOURCE_APP = 0;
+
+ /**
+ * When retrieving vsync events, this specifies that the vsync event should happen whenever
+ * Surface Flinger is processing a frame.
+ * <p>
+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h
+ */
+ public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1;
+
private static final String TAG = "DisplayEventReceiver";
private final CloseGuard mCloseGuard = CloseGuard.get();
@@ -46,7 +63,7 @@ public abstract class DisplayEventReceiver {
private MessageQueue mMessageQueue;
private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver,
- MessageQueue messageQueue);
+ MessageQueue messageQueue, int vsyncSource);
private static native void nativeDispose(long receiverPtr);
@FastNative
private static native void nativeScheduleVsync(long receiverPtr);
@@ -55,14 +72,16 @@ public abstract class DisplayEventReceiver {
* Creates a display event receiver.
*
* @param looper The looper to use when invoking callbacks.
+ * @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values.
*/
- public DisplayEventReceiver(Looper looper) {
+ public DisplayEventReceiver(Looper looper, int vsyncSource) {
if (looper == null) {
throw new IllegalArgumentException("looper must not be null");
}
mMessageQueue = looper.getQueue();
- mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue);
+ mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue,
+ vsyncSource);
mCloseGuard.open("dispose");
}