Merge changes Ib132c1e2,I2115f086 into udc-dev
* changes:
Revert "Remove JNI per-frame allocations in Choreographer"
Revert "Copy from DisplayEventReceiver.VsyncEventData"
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index c92b1b8..8c4e90c 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -195,7 +195,7 @@
private boolean mDebugPrintNextFrameTimeDelta;
private int mFPSDivisor = 1;
- private final DisplayEventReceiver.VsyncEventData mLastVsyncEventData =
+ private DisplayEventReceiver.VsyncEventData mLastVsyncEventData =
new DisplayEventReceiver.VsyncEventData();
private final FrameData mFrameData = new FrameData();
@@ -857,7 +857,7 @@
mFrameScheduled = false;
mLastFrameTimeNanos = frameTimeNanos;
mLastFrameIntervalNanos = frameIntervalNanos;
- mLastVsyncEventData.copyFrom(vsyncEventData);
+ mLastVsyncEventData = vsyncEventData;
}
AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS);
@@ -1247,7 +1247,7 @@
private boolean mHavePendingVsync;
private long mTimestampNanos;
private int mFrame;
- private final VsyncEventData mLastVsyncEventData = new VsyncEventData();
+ private VsyncEventData mLastVsyncEventData = new VsyncEventData();
FrameDisplayEventReceiver(Looper looper, int vsyncSource, long layerHandle) {
super(looper, vsyncSource, /* eventRegistration */ 0, layerHandle);
@@ -1287,7 +1287,7 @@
mTimestampNanos = timestampNanos;
mFrame = frame;
- mLastVsyncEventData.copyFrom(vsyncEventData);
+ mLastVsyncEventData = vsyncEventData;
Message msg = Message.obtain(mHandler, this);
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS);
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index 54db34e..0307489 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -81,10 +81,7 @@
// GC'd while the native peer of the receiver is using them.
private MessageQueue mMessageQueue;
- private final VsyncEventData mVsyncEventData = new VsyncEventData();
-
private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver,
- WeakReference<VsyncEventData> vsyncEventData,
MessageQueue messageQueue, int vsyncSource, int eventRegistration, long layerHandle);
private static native long nativeGetDisplayEventReceiverFinalizer();
@FastNative
@@ -127,9 +124,7 @@
}
mMessageQueue = looper.getQueue();
- mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this),
- new WeakReference<VsyncEventData>(mVsyncEventData),
- mMessageQueue,
+ mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue,
vsyncSource, eventRegistration, layerHandle);
mFreeNativeResources = sNativeAllocationRegistry.registerNativeAllocation(this,
mReceiverPtr);
@@ -152,6 +147,9 @@
* @hide
*/
public static final class VsyncEventData {
+ static final FrameTimeline[] INVALID_FRAME_TIMELINES =
+ {new FrameTimeline(FrameInfo.INVALID_VSYNC_ID, Long.MAX_VALUE, Long.MAX_VALUE)};
+
// The amount of frame timeline choices.
// Must be in sync with VsyncEventData::kFrameTimelinesLength in
// frameworks/native/libs/gui/include/gui/VsyncEventData.h. If they do not match, a runtime
@@ -159,32 +157,22 @@
static final int FRAME_TIMELINES_LENGTH = 7;
public static class FrameTimeline {
- FrameTimeline() {}
-
- // Called from native code.
- @SuppressWarnings("unused")
FrameTimeline(long vsyncId, long expectedPresentationTime, long deadline) {
this.vsyncId = vsyncId;
this.expectedPresentationTime = expectedPresentationTime;
this.deadline = deadline;
}
- void copyFrom(FrameTimeline other) {
- vsyncId = other.vsyncId;
- expectedPresentationTime = other.expectedPresentationTime;
- deadline = other.deadline;
- }
-
// The frame timeline vsync id, used to correlate a frame
// produced by HWUI with the timeline data stored in Surface Flinger.
- public long vsyncId = FrameInfo.INVALID_VSYNC_ID;
+ public final long vsyncId;
// The frame timestamp for when the frame is expected to be presented.
- public long expectedPresentationTime = Long.MAX_VALUE;
+ public final long expectedPresentationTime;
// The frame deadline timestamp in {@link System#nanoTime()} timebase that it is
// allotted for the frame to be completed.
- public long deadline = Long.MAX_VALUE;
+ public final long deadline;
}
/**
@@ -192,18 +180,11 @@
* {@link FrameInfo#VSYNC} to the current vsync in case Choreographer callback was heavily
* delayed by the app.
*/
- public long frameInterval = -1;
+ public final long frameInterval;
public final FrameTimeline[] frameTimelines;
- public int preferredFrameTimelineIndex = 0;
-
- VsyncEventData() {
- frameTimelines = new FrameTimeline[FRAME_TIMELINES_LENGTH];
- for (int i = 0; i < frameTimelines.length; i++) {
- frameTimelines[i] = new FrameTimeline();
- }
- }
+ public final int preferredFrameTimelineIndex;
// Called from native code.
@SuppressWarnings("unused")
@@ -214,12 +195,10 @@
this.frameInterval = frameInterval;
}
- void copyFrom(VsyncEventData other) {
- preferredFrameTimelineIndex = other.preferredFrameTimelineIndex;
- frameInterval = other.frameInterval;
- for (int i = 0; i < frameTimelines.length; i++) {
- frameTimelines[i].copyFrom(other.frameTimelines[i]);
- }
+ VsyncEventData() {
+ this.frameInterval = -1;
+ this.frameTimelines = INVALID_FRAME_TIMELINES;
+ this.preferredFrameTimelineIndex = 0;
}
public FrameTimeline preferredFrameTimeline() {
@@ -325,8 +304,9 @@
// Called from native code.
@SuppressWarnings("unused")
- private void dispatchVsync(long timestampNanos, long physicalDisplayId, int frame) {
- onVsync(timestampNanos, physicalDisplayId, frame, mVsyncEventData);
+ private void dispatchVsync(long timestampNanos, long physicalDisplayId, int frame,
+ VsyncEventData vsyncEventData) {
+ onVsync(timestampNanos, physicalDisplayId, frame, vsyncEventData);
}
// Called from native code.
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index 410b441..dd72689 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -48,22 +48,12 @@
struct {
jclass clazz;
-
jmethodID init;
-
- jfieldID vsyncId;
- jfieldID expectedPresentationTime;
- jfieldID deadline;
} frameTimelineClassInfo;
struct {
jclass clazz;
-
jmethodID init;
-
- jfieldID frameInterval;
- jfieldID preferredFrameTimelineIndex;
- jfieldID frameTimelines;
} vsyncEventDataClassInfo;
} gDisplayEventReceiverClassInfo;
@@ -71,7 +61,7 @@
class NativeDisplayEventReceiver : public DisplayEventDispatcher {
public:
- NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak, jobject vsyncEventDataWeak,
+ NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak,
const sp<MessageQueue>& messageQueue, jint vsyncSource,
jint eventRegistration, jlong layerHandle);
@@ -82,7 +72,6 @@
private:
jobject mReceiverWeakGlobal;
- jobject mVsyncEventDataWeakGlobal;
sp<MessageQueue> mMessageQueue;
void dispatchVsync(nsecs_t timestamp, PhysicalDisplayId displayId, uint32_t count,
@@ -96,7 +85,6 @@
};
NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak,
- jobject vsyncEventDataWeak,
const sp<MessageQueue>& messageQueue,
jint vsyncSource, jint eventRegistration,
jlong layerHandle)
@@ -108,7 +96,6 @@
reinterpret_cast<IBinder*>(layerHandle))
: nullptr),
mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)),
- mVsyncEventDataWeakGlobal(env->NewGlobalRef(vsyncEventDataWeak)),
mMessageQueue(messageQueue) {
ALOGV("receiver %p ~ Initializing display event receiver.", this);
}
@@ -167,43 +154,12 @@
JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
- ScopedLocalRef<jobject> vsyncEventDataObj(env, GetReferent(env, mVsyncEventDataWeakGlobal));
- if (receiverObj.get() && vsyncEventDataObj.get()) {
+ if (receiverObj.get()) {
ALOGV("receiver %p ~ Invoking vsync handler.", this);
- env->SetIntField(vsyncEventDataObj.get(),
- gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo
- .preferredFrameTimelineIndex,
- vsyncEventData.preferredFrameTimelineIndex);
- env->SetLongField(vsyncEventDataObj.get(),
- gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval,
- vsyncEventData.frameInterval);
-
- ScopedLocalRef<jobjectArray>
- frameTimelinesObj(env,
- reinterpret_cast<jobjectArray>(
- env->GetObjectField(vsyncEventDataObj.get(),
- gDisplayEventReceiverClassInfo
- .vsyncEventDataClassInfo
- .frameTimelines)));
- for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
- VsyncEventData::FrameTimeline& frameTimeline = vsyncEventData.frameTimelines[i];
- ScopedLocalRef<jobject>
- frameTimelineObj(env, env->GetObjectArrayElement(frameTimelinesObj.get(), i));
- env->SetLongField(frameTimelineObj.get(),
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo.vsyncId,
- frameTimeline.vsyncId);
- env->SetLongField(frameTimelineObj.get(),
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo
- .expectedPresentationTime,
- frameTimeline.expectedPresentationTime);
- env->SetLongField(frameTimelineObj.get(),
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo.deadline,
- frameTimeline.deadlineTimestamp);
- }
-
+ jobject javaVsyncEventData = createJavaVsyncEventData(env, vsyncEventData);
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchVsync,
- timestamp, displayId.value, count);
+ timestamp, displayId.value, count, javaVsyncEventData);
ALOGV("receiver %p ~ Returned from vsync handler.", this);
}
@@ -271,9 +227,8 @@
mMessageQueue->raiseAndClearException(env, "dispatchModeChanged");
}
-static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject vsyncEventDataWeak,
- jobject messageQueueObj, jint vsyncSource, jint eventRegistration,
- jlong layerHandle) {
+static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject messageQueueObj,
+ jint vsyncSource, jint eventRegistration, jlong layerHandle) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized.");
@@ -281,8 +236,8 @@
}
sp<NativeDisplayEventReceiver> receiver =
- new NativeDisplayEventReceiver(env, receiverWeak, vsyncEventDataWeak, messageQueue,
- vsyncSource, eventRegistration, layerHandle);
+ new NativeDisplayEventReceiver(env, receiverWeak, messageQueue, vsyncSource,
+ eventRegistration, layerHandle);
status_t status = receiver->initialize();
if (status) {
String8 message;
@@ -329,9 +284,7 @@
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
- {"nativeInit",
- "(Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;Landroid/os/"
- "MessageQueue;IIJ)J",
+ {"nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;IIJ)J",
(void*)nativeInit},
{"nativeGetDisplayEventReceiverFinalizer", "()J",
(void*)nativeGetDisplayEventReceiverFinalizer},
@@ -348,7 +301,8 @@
gDisplayEventReceiverClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gDisplayEventReceiverClassInfo.dispatchVsync =
- GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.clazz, "dispatchVsync", "(JJI)V");
+ GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.clazz, "dispatchVsync",
+ "(JJILandroid/view/DisplayEventReceiver$VsyncEventData;)V");
gDisplayEventReceiverClassInfo.dispatchHotplug = GetMethodIDOrDie(env,
gDisplayEventReceiverClassInfo.clazz, "dispatchHotplug", "(JJZ)V");
gDisplayEventReceiverClassInfo.dispatchModeChanged =
@@ -374,15 +328,6 @@
gDisplayEventReceiverClassInfo.frameTimelineClassInfo.init =
GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz,
"<init>", "(JJJ)V");
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo.vsyncId =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz,
- "vsyncId", "J");
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo.expectedPresentationTime =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz,
- "expectedPresentationTime", "J");
- gDisplayEventReceiverClassInfo.frameTimelineClassInfo.deadline =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz,
- "deadline", "J");
jclass vsyncEventDataClazz =
FindClassOrDie(env, "android/view/DisplayEventReceiver$VsyncEventData");
@@ -394,17 +339,6 @@
"([Landroid/view/"
"DisplayEventReceiver$VsyncEventData$FrameTimeline;IJ)V");
- gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.preferredFrameTimelineIndex =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
- "preferredFrameTimelineIndex", "I");
- gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
- "frameInterval", "J");
- gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameTimelines =
- GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
- "frameTimelines",
- "[Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;");
-
return res;
}