diff options
| author | Jorim Jaggi <jjaggi@google.com> | 2017-06-09 04:06:38 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-06-09 04:06:43 +0000 |
| commit | d1f55f630228fbb49fbd8724d86feb7f9ddd24fb (patch) | |
| tree | 20133bf45e22ba793c52d4d1f452abbfe6282bd1 /core/java | |
| parent | 713ad88afecfdc91e7c4b5184f62bf663143d040 (diff) | |
| parent | 34a0cdb98eb5561774ea4e7b3b602aad80c4a3cc (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.java | 35 | ||||
| -rw-r--r-- | core/java/android/view/DisplayEventReceiver.java | 25 |
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"); } |
