Merge changes Ib132c1e2,I2115f086 into udc-dev am: f9a90ca984

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21939399

Change-Id: Id86529ad785d2e10fa34804b4144019df38c6868
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Rachel Lee
2023-04-07 17:59:33 +00:00
committed by Automerger Merge Worker
3 changed files with 31 additions and 117 deletions

View File

@@ -195,7 +195,7 @@ public final class Choreographer {
private boolean mDebugPrintNextFrameTimeDelta; private boolean mDebugPrintNextFrameTimeDelta;
private int mFPSDivisor = 1; private int mFPSDivisor = 1;
private final DisplayEventReceiver.VsyncEventData mLastVsyncEventData = private DisplayEventReceiver.VsyncEventData mLastVsyncEventData =
new DisplayEventReceiver.VsyncEventData(); new DisplayEventReceiver.VsyncEventData();
private final FrameData mFrameData = new FrameData(); private final FrameData mFrameData = new FrameData();
@@ -857,7 +857,7 @@ public final class Choreographer {
mFrameScheduled = false; mFrameScheduled = false;
mLastFrameTimeNanos = frameTimeNanos; mLastFrameTimeNanos = frameTimeNanos;
mLastFrameIntervalNanos = frameIntervalNanos; mLastFrameIntervalNanos = frameIntervalNanos;
mLastVsyncEventData.copyFrom(vsyncEventData); mLastVsyncEventData = vsyncEventData;
} }
AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS); AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS);
@@ -1247,7 +1247,7 @@ public final class Choreographer {
private boolean mHavePendingVsync; private boolean mHavePendingVsync;
private long mTimestampNanos; private long mTimestampNanos;
private int mFrame; private int mFrame;
private final VsyncEventData mLastVsyncEventData = new VsyncEventData(); private VsyncEventData mLastVsyncEventData = new VsyncEventData();
FrameDisplayEventReceiver(Looper looper, int vsyncSource, long layerHandle) { FrameDisplayEventReceiver(Looper looper, int vsyncSource, long layerHandle) {
super(looper, vsyncSource, /* eventRegistration */ 0, layerHandle); super(looper, vsyncSource, /* eventRegistration */ 0, layerHandle);
@@ -1287,7 +1287,7 @@ public final class Choreographer {
mTimestampNanos = timestampNanos; mTimestampNanos = timestampNanos;
mFrame = frame; mFrame = frame;
mLastVsyncEventData.copyFrom(vsyncEventData); mLastVsyncEventData = vsyncEventData;
Message msg = Message.obtain(mHandler, this); Message msg = Message.obtain(mHandler, this);
msg.setAsynchronous(true); msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS); mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS);

View File

@@ -81,10 +81,7 @@ public abstract class DisplayEventReceiver {
// GC'd while the native peer of the receiver is using them. // GC'd while the native peer of the receiver is using them.
private MessageQueue mMessageQueue; private MessageQueue mMessageQueue;
private final VsyncEventData mVsyncEventData = new VsyncEventData();
private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver, private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver,
WeakReference<VsyncEventData> vsyncEventData,
MessageQueue messageQueue, int vsyncSource, int eventRegistration, long layerHandle); MessageQueue messageQueue, int vsyncSource, int eventRegistration, long layerHandle);
private static native long nativeGetDisplayEventReceiverFinalizer(); private static native long nativeGetDisplayEventReceiverFinalizer();
@FastNative @FastNative
@@ -127,9 +124,7 @@ public abstract class DisplayEventReceiver {
} }
mMessageQueue = looper.getQueue(); mMessageQueue = looper.getQueue();
mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue,
new WeakReference<VsyncEventData>(mVsyncEventData),
mMessageQueue,
vsyncSource, eventRegistration, layerHandle); vsyncSource, eventRegistration, layerHandle);
mFreeNativeResources = sNativeAllocationRegistry.registerNativeAllocation(this, mFreeNativeResources = sNativeAllocationRegistry.registerNativeAllocation(this,
mReceiverPtr); mReceiverPtr);
@@ -152,6 +147,9 @@ public abstract class DisplayEventReceiver {
* @hide * @hide
*/ */
public static final class VsyncEventData { 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. // The amount of frame timeline choices.
// Must be in sync with VsyncEventData::kFrameTimelinesLength in // Must be in sync with VsyncEventData::kFrameTimelinesLength in
// frameworks/native/libs/gui/include/gui/VsyncEventData.h. If they do not match, a runtime // frameworks/native/libs/gui/include/gui/VsyncEventData.h. If they do not match, a runtime
@@ -159,32 +157,22 @@ public abstract class DisplayEventReceiver {
static final int FRAME_TIMELINES_LENGTH = 7; static final int FRAME_TIMELINES_LENGTH = 7;
public static class FrameTimeline { public static class FrameTimeline {
FrameTimeline() {}
// Called from native code.
@SuppressWarnings("unused")
FrameTimeline(long vsyncId, long expectedPresentationTime, long deadline) { FrameTimeline(long vsyncId, long expectedPresentationTime, long deadline) {
this.vsyncId = vsyncId; this.vsyncId = vsyncId;
this.expectedPresentationTime = expectedPresentationTime; this.expectedPresentationTime = expectedPresentationTime;
this.deadline = deadline; 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 // The frame timeline vsync id, used to correlate a frame
// produced by HWUI with the timeline data stored in Surface Flinger. // 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. // 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 // The frame deadline timestamp in {@link System#nanoTime()} timebase that it is
// allotted for the frame to be completed. // allotted for the frame to be completed.
public long deadline = Long.MAX_VALUE; public final long deadline;
} }
/** /**
@@ -192,18 +180,11 @@ public abstract class DisplayEventReceiver {
* {@link FrameInfo#VSYNC} to the current vsync in case Choreographer callback was heavily * {@link FrameInfo#VSYNC} to the current vsync in case Choreographer callback was heavily
* delayed by the app. * delayed by the app.
*/ */
public long frameInterval = -1; public final long frameInterval;
public final FrameTimeline[] frameTimelines; public final FrameTimeline[] frameTimelines;
public int preferredFrameTimelineIndex = 0; public final int preferredFrameTimelineIndex;
VsyncEventData() {
frameTimelines = new FrameTimeline[FRAME_TIMELINES_LENGTH];
for (int i = 0; i < frameTimelines.length; i++) {
frameTimelines[i] = new FrameTimeline();
}
}
// Called from native code. // Called from native code.
@SuppressWarnings("unused") @SuppressWarnings("unused")
@@ -214,12 +195,10 @@ public abstract class DisplayEventReceiver {
this.frameInterval = frameInterval; this.frameInterval = frameInterval;
} }
void copyFrom(VsyncEventData other) { VsyncEventData() {
preferredFrameTimelineIndex = other.preferredFrameTimelineIndex; this.frameInterval = -1;
frameInterval = other.frameInterval; this.frameTimelines = INVALID_FRAME_TIMELINES;
for (int i = 0; i < frameTimelines.length; i++) { this.preferredFrameTimelineIndex = 0;
frameTimelines[i].copyFrom(other.frameTimelines[i]);
}
} }
public FrameTimeline preferredFrameTimeline() { public FrameTimeline preferredFrameTimeline() {
@@ -325,8 +304,9 @@ public abstract class DisplayEventReceiver {
// Called from native code. // Called from native code.
@SuppressWarnings("unused") @SuppressWarnings("unused")
private void dispatchVsync(long timestampNanos, long physicalDisplayId, int frame) { private void dispatchVsync(long timestampNanos, long physicalDisplayId, int frame,
onVsync(timestampNanos, physicalDisplayId, frame, mVsyncEventData); VsyncEventData vsyncEventData) {
onVsync(timestampNanos, physicalDisplayId, frame, vsyncEventData);
} }
// Called from native code. // Called from native code.

View File

@@ -48,22 +48,12 @@ static struct {
struct { struct {
jclass clazz; jclass clazz;
jmethodID init; jmethodID init;
jfieldID vsyncId;
jfieldID expectedPresentationTime;
jfieldID deadline;
} frameTimelineClassInfo; } frameTimelineClassInfo;
struct { struct {
jclass clazz; jclass clazz;
jmethodID init; jmethodID init;
jfieldID frameInterval;
jfieldID preferredFrameTimelineIndex;
jfieldID frameTimelines;
} vsyncEventDataClassInfo; } vsyncEventDataClassInfo;
} gDisplayEventReceiverClassInfo; } gDisplayEventReceiverClassInfo;
@@ -71,7 +61,7 @@ static struct {
class NativeDisplayEventReceiver : public DisplayEventDispatcher { class NativeDisplayEventReceiver : public DisplayEventDispatcher {
public: public:
NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak, jobject vsyncEventDataWeak, NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak,
const sp<MessageQueue>& messageQueue, jint vsyncSource, const sp<MessageQueue>& messageQueue, jint vsyncSource,
jint eventRegistration, jlong layerHandle); jint eventRegistration, jlong layerHandle);
@@ -82,7 +72,6 @@ protected:
private: private:
jobject mReceiverWeakGlobal; jobject mReceiverWeakGlobal;
jobject mVsyncEventDataWeakGlobal;
sp<MessageQueue> mMessageQueue; sp<MessageQueue> mMessageQueue;
void dispatchVsync(nsecs_t timestamp, PhysicalDisplayId displayId, uint32_t count, void dispatchVsync(nsecs_t timestamp, PhysicalDisplayId displayId, uint32_t count,
@@ -96,7 +85,6 @@ private:
}; };
NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak, NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, jobject receiverWeak,
jobject vsyncEventDataWeak,
const sp<MessageQueue>& messageQueue, const sp<MessageQueue>& messageQueue,
jint vsyncSource, jint eventRegistration, jint vsyncSource, jint eventRegistration,
jlong layerHandle) jlong layerHandle)
@@ -108,7 +96,6 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, jobject rece
reinterpret_cast<IBinder*>(layerHandle)) reinterpret_cast<IBinder*>(layerHandle))
: nullptr), : nullptr),
mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)), mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)),
mVsyncEventDataWeakGlobal(env->NewGlobalRef(vsyncEventDataWeak)),
mMessageQueue(messageQueue) { mMessageQueue(messageQueue) {
ALOGV("receiver %p ~ Initializing display event receiver.", this); ALOGV("receiver %p ~ Initializing display event receiver.", this);
} }
@@ -167,43 +154,12 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
ScopedLocalRef<jobject> vsyncEventDataObj(env, GetReferent(env, mVsyncEventDataWeakGlobal)); if (receiverObj.get()) {
if (receiverObj.get() && vsyncEventDataObj.get()) {
ALOGV("receiver %p ~ Invoking vsync handler.", this); ALOGV("receiver %p ~ Invoking vsync handler.", this);
env->SetIntField(vsyncEventDataObj.get(), jobject javaVsyncEventData = createJavaVsyncEventData(env, vsyncEventData);
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);
}
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchVsync, env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchVsync,
timestamp, displayId.value, count); timestamp, displayId.value, count, javaVsyncEventData);
ALOGV("receiver %p ~ Returned from vsync handler.", this); ALOGV("receiver %p ~ Returned from vsync handler.", this);
} }
@@ -271,9 +227,8 @@ void NativeDisplayEventReceiver::dispatchFrameRateOverrides(
mMessageQueue->raiseAndClearException(env, "dispatchModeChanged"); mMessageQueue->raiseAndClearException(env, "dispatchModeChanged");
} }
static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject vsyncEventDataWeak, static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject messageQueueObj,
jobject messageQueueObj, jint vsyncSource, jint eventRegistration, jint vsyncSource, jint eventRegistration, jlong layerHandle) {
jlong layerHandle) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) { if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized."); jniThrowRuntimeException(env, "MessageQueue is not initialized.");
@@ -281,8 +236,8 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject
} }
sp<NativeDisplayEventReceiver> receiver = sp<NativeDisplayEventReceiver> receiver =
new NativeDisplayEventReceiver(env, receiverWeak, vsyncEventDataWeak, messageQueue, new NativeDisplayEventReceiver(env, receiverWeak, messageQueue, vsyncSource,
vsyncSource, eventRegistration, layerHandle); eventRegistration, layerHandle);
status_t status = receiver->initialize(); status_t status = receiver->initialize();
if (status) { if (status) {
String8 message; String8 message;
@@ -329,9 +284,7 @@ static jobject nativeGetLatestVsyncEventData(JNIEnv* env, jclass clazz, jlong re
static const JNINativeMethod gMethods[] = { static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */ /* name, signature, funcPtr */
{"nativeInit", {"nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;IIJ)J",
"(Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;Landroid/os/"
"MessageQueue;IIJ)J",
(void*)nativeInit}, (void*)nativeInit},
{"nativeGetDisplayEventReceiverFinalizer", "()J", {"nativeGetDisplayEventReceiverFinalizer", "()J",
(void*)nativeGetDisplayEventReceiverFinalizer}, (void*)nativeGetDisplayEventReceiverFinalizer},
@@ -348,7 +301,8 @@ int register_android_view_DisplayEventReceiver(JNIEnv* env) {
gDisplayEventReceiverClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); gDisplayEventReceiverClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gDisplayEventReceiverClassInfo.dispatchVsync = gDisplayEventReceiverClassInfo.dispatchVsync =
GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.clazz, "dispatchVsync", "(JJI)V"); GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.clazz, "dispatchVsync",
"(JJILandroid/view/DisplayEventReceiver$VsyncEventData;)V");
gDisplayEventReceiverClassInfo.dispatchHotplug = GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.dispatchHotplug = GetMethodIDOrDie(env,
gDisplayEventReceiverClassInfo.clazz, "dispatchHotplug", "(JJZ)V"); gDisplayEventReceiverClassInfo.clazz, "dispatchHotplug", "(JJZ)V");
gDisplayEventReceiverClassInfo.dispatchModeChanged = gDisplayEventReceiverClassInfo.dispatchModeChanged =
@@ -374,15 +328,6 @@ int register_android_view_DisplayEventReceiver(JNIEnv* env) {
gDisplayEventReceiverClassInfo.frameTimelineClassInfo.init = gDisplayEventReceiverClassInfo.frameTimelineClassInfo.init =
GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz, GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.frameTimelineClassInfo.clazz,
"<init>", "(JJJ)V"); "<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 = jclass vsyncEventDataClazz =
FindClassOrDie(env, "android/view/DisplayEventReceiver$VsyncEventData"); FindClassOrDie(env, "android/view/DisplayEventReceiver$VsyncEventData");
@@ -394,17 +339,6 @@ int register_android_view_DisplayEventReceiver(JNIEnv* env) {
"([Landroid/view/" "([Landroid/view/"
"DisplayEventReceiver$VsyncEventData$FrameTimeline;IJ)V"); "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; return res;
} }