Use actual length of frame timelines.
Test: atest ChoreographerTest Bug: 270612751 Change-Id: I628b94349c9f304fd549c425de6db8dfebd8326e
This commit is contained in:
@@ -1111,15 +1111,12 @@ public final class Choreographer {
|
||||
*/
|
||||
public static class FrameData {
|
||||
private long mFrameTimeNanos;
|
||||
private final FrameTimeline[] mFrameTimelines =
|
||||
new FrameTimeline[DisplayEventReceiver.VsyncEventData.FRAME_TIMELINES_LENGTH];
|
||||
private FrameTimeline[] mFrameTimelines;
|
||||
private int mPreferredFrameTimelineIndex;
|
||||
private boolean mInCallback = false;
|
||||
|
||||
FrameData() {
|
||||
for (int i = 0; i < mFrameTimelines.length; i++) {
|
||||
mFrameTimelines[i] = new FrameTimeline();
|
||||
}
|
||||
allocateFrameTimelines(DisplayEventReceiver.VsyncEventData.FRAME_TIMELINES_LENGTH);
|
||||
}
|
||||
|
||||
/** The time in nanoseconds when the frame started being rendered. */
|
||||
@@ -1157,21 +1154,29 @@ public final class Choreographer {
|
||||
}
|
||||
}
|
||||
|
||||
private void allocateFrameTimelines(int length) {
|
||||
mFrameTimelines = new FrameTimeline[length];
|
||||
for (int i = 0; i < mFrameTimelines.length; i++) {
|
||||
mFrameTimelines[i] = new FrameTimeline();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the frame data with a {@code DisplayEventReceiver.VsyncEventData} received from
|
||||
* native.
|
||||
*/
|
||||
FrameTimeline update(
|
||||
long frameTimeNanos, DisplayEventReceiver.VsyncEventData vsyncEventData) {
|
||||
if (vsyncEventData.frameTimelines.length != mFrameTimelines.length) {
|
||||
throw new IllegalStateException(
|
||||
"Length of native frame timelines received does not match Java. Did "
|
||||
+ "FRAME_TIMELINES_LENGTH or kFrameTimelinesLength (native) "
|
||||
+ "change?");
|
||||
if (vsyncEventData.frameTimelinesLength == 0) {
|
||||
throw new IllegalArgumentException(
|
||||
"Vsync event timelines length must be greater than 0");
|
||||
}
|
||||
if (mFrameTimelines.length != vsyncEventData.frameTimelinesLength) {
|
||||
allocateFrameTimelines(vsyncEventData.frameTimelinesLength);
|
||||
}
|
||||
mFrameTimeNanos = frameTimeNanos;
|
||||
mPreferredFrameTimelineIndex = vsyncEventData.preferredFrameTimelineIndex;
|
||||
for (int i = 0; i < vsyncEventData.frameTimelines.length; i++) {
|
||||
for (int i = 0; i < mFrameTimelines.length; i++) {
|
||||
DisplayEventReceiver.VsyncEventData.FrameTimeline frameTimeline =
|
||||
vsyncEventData.frameTimelines[i];
|
||||
mFrameTimelines[i].update(frameTimeline.vsyncId,
|
||||
|
||||
@@ -198,6 +198,8 @@ public abstract class DisplayEventReceiver {
|
||||
|
||||
public int preferredFrameTimelineIndex = 0;
|
||||
|
||||
public int frameTimelinesLength = 0;
|
||||
|
||||
VsyncEventData() {
|
||||
frameTimelines = new FrameTimeline[FRAME_TIMELINES_LENGTH];
|
||||
for (int i = 0; i < frameTimelines.length; i++) {
|
||||
@@ -208,14 +210,16 @@ public abstract class DisplayEventReceiver {
|
||||
// Called from native code.
|
||||
@SuppressWarnings("unused")
|
||||
VsyncEventData(FrameTimeline[] frameTimelines, int preferredFrameTimelineIndex,
|
||||
long frameInterval) {
|
||||
int frameTimelinesLength, long frameInterval) {
|
||||
this.frameTimelines = frameTimelines;
|
||||
this.preferredFrameTimelineIndex = preferredFrameTimelineIndex;
|
||||
this.frameTimelinesLength = frameTimelinesLength;
|
||||
this.frameInterval = frameInterval;
|
||||
}
|
||||
|
||||
void copyFrom(VsyncEventData other) {
|
||||
preferredFrameTimelineIndex = other.preferredFrameTimelineIndex;
|
||||
frameTimelinesLength = other.frameTimelinesLength;
|
||||
frameInterval = other.frameInterval;
|
||||
for (int i = 0; i < frameTimelines.length; i++) {
|
||||
frameTimelines[i].copyFrom(other.frameTimelines[i]);
|
||||
|
||||
@@ -63,6 +63,7 @@ static struct {
|
||||
|
||||
jfieldID frameInterval;
|
||||
jfieldID preferredFrameTimelineIndex;
|
||||
jfieldID frameTimelinesLength;
|
||||
jfieldID frameTimelines;
|
||||
} vsyncEventDataClassInfo;
|
||||
|
||||
@@ -127,7 +128,7 @@ void NativeDisplayEventReceiver::dispose() {
|
||||
static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventData) {
|
||||
ScopedLocalRef<jobjectArray>
|
||||
frameTimelineObjs(env,
|
||||
env->NewObjectArray(VsyncEventData::kFrameTimelinesLength,
|
||||
env->NewObjectArray(vsyncEventData.frameTimelinesLength,
|
||||
gDisplayEventReceiverClassInfo
|
||||
.frameTimelineClassInfo.clazz,
|
||||
/*initial element*/ NULL));
|
||||
@@ -137,7 +138,7 @@ static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventDa
|
||||
env->ExceptionClear();
|
||||
return NULL;
|
||||
}
|
||||
for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
|
||||
for (int i = 0; i < vsyncEventData.frameTimelinesLength; i++) {
|
||||
VsyncEventData::FrameTimeline frameTimeline = vsyncEventData.frameTimelines[i];
|
||||
ScopedLocalRef<jobject>
|
||||
frameTimelineObj(env,
|
||||
@@ -159,7 +160,7 @@ static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventDa
|
||||
return env->NewObject(gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.init,
|
||||
frameTimelineObjs.get(), vsyncEventData.preferredFrameTimelineIndex,
|
||||
vsyncEventData.frameInterval);
|
||||
vsyncEventData.frameTimelinesLength, vsyncEventData.frameInterval);
|
||||
}
|
||||
|
||||
void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDisplayId displayId,
|
||||
@@ -175,6 +176,10 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo
|
||||
.preferredFrameTimelineIndex,
|
||||
vsyncEventData.preferredFrameTimelineIndex);
|
||||
env->SetIntField(vsyncEventDataObj.get(),
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo
|
||||
.frameTimelinesLength,
|
||||
vsyncEventData.frameTimelinesLength);
|
||||
env->SetLongField(vsyncEventDataObj.get(),
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval,
|
||||
vsyncEventData.frameInterval);
|
||||
@@ -186,7 +191,7 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
|
||||
gDisplayEventReceiverClassInfo
|
||||
.vsyncEventDataClassInfo
|
||||
.frameTimelines)));
|
||||
for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
|
||||
for (int i = 0; i < vsyncEventData.frameTimelinesLength; i++) {
|
||||
VsyncEventData::FrameTimeline& frameTimeline = vsyncEventData.frameTimelines[i];
|
||||
ScopedLocalRef<jobject>
|
||||
frameTimelineObj(env, env->GetObjectArrayElement(frameTimelinesObj.get(), i));
|
||||
@@ -392,11 +397,14 @@ int register_android_view_DisplayEventReceiver(JNIEnv* env) {
|
||||
GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
|
||||
"<init>",
|
||||
"([Landroid/view/"
|
||||
"DisplayEventReceiver$VsyncEventData$FrameTimeline;IJ)V");
|
||||
"DisplayEventReceiver$VsyncEventData$FrameTimeline;IIJ)V");
|
||||
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.preferredFrameTimelineIndex =
|
||||
GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
|
||||
"preferredFrameTimelineIndex", "I");
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameTimelinesLength =
|
||||
GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
|
||||
"frameTimelinesLength", "I");
|
||||
gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval =
|
||||
GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
|
||||
"frameInterval", "J");
|
||||
|
||||
Reference in New Issue
Block a user