Loading core/java/android/view/Display.java +36 −0 Original line number Diff line number Diff line Loading @@ -598,6 +598,42 @@ public final class Display { } } /** * Gets the app VSYNC offset, in nanoseconds. This is a positive value indicating * the phase offset of the VSYNC events provided by Choreographer relative to the * display refresh. For example, if Choreographer reports that the refresh occurred * at time N, it actually occurred at (N - appVsyncOffset). * <p> * Apps generally do not need to be aware of this. It's only useful for fine-grained * A/V synchronization. * @hide */ public long getAppVsyncOffsetNanos() { synchronized (this) { updateDisplayInfoLocked(); return mDisplayInfo.appVsyncOffsetNanos; } } /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - presentationDeadline). * <p> * The desired presentation time for GLES rendering may be set with * {@link android.opengl.EGLExt#eglPresentationTimeANDROID}. For video decoding, use * {@link android.media.MediaCodec#releaseOutputBuffer(int, long)}. Times are * expressed in nanoseconds, using the system monotonic clock * ({@link System#nanoTime}). * @hide */ public long getPresentationDeadlineNanos() { synchronized (this) { updateDisplayInfoLocked(); return mDisplayInfo.presentationDeadlineNanos; } } /** * Gets display metrics that describe the size and density of this display. * <p> Loading core/java/android/view/DisplayInfo.java +26 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,20 @@ public final class DisplayInfo implements Parcelable { */ public float physicalYDpi; /** * This is a positive value indicating the phase offset of the VSYNC events provided by * Choreographer relative to the display refresh. For example, if Choreographer reports * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos). */ public long appVsyncOffsetNanos; /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - bufferDeadlineNanos). */ public long presentationDeadlineNanos; /** * The state of the display, such as {@link android.view.Display#STATE_ON}. */ Loading Loading @@ -253,6 +267,8 @@ public final class DisplayInfo implements Parcelable { && logicalDensityDpi == other.logicalDensityDpi && physicalXDpi == other.physicalXDpi && physicalYDpi == other.physicalYDpi && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos && state == other.state && ownerUid == other.ownerUid && Objects.equal(ownerPackageName, other.ownerPackageName); Loading Loading @@ -286,6 +302,8 @@ public final class DisplayInfo implements Parcelable { logicalDensityDpi = other.logicalDensityDpi; physicalXDpi = other.physicalXDpi; physicalYDpi = other.physicalYDpi; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; state = other.state; ownerUid = other.ownerUid; ownerPackageName = other.ownerPackageName; Loading Loading @@ -314,6 +332,8 @@ public final class DisplayInfo implements Parcelable { logicalDensityDpi = source.readInt(); physicalXDpi = source.readFloat(); physicalYDpi = source.readFloat(); appVsyncOffsetNanos = source.readLong(); presentationDeadlineNanos = source.readLong(); state = source.readInt(); ownerUid = source.readInt(); ownerPackageName = source.readString(); Loading Loading @@ -343,6 +363,8 @@ public final class DisplayInfo implements Parcelable { dest.writeInt(logicalDensityDpi); dest.writeFloat(physicalXDpi); dest.writeFloat(physicalYDpi); dest.writeLong(appVsyncOffsetNanos); dest.writeLong(presentationDeadlineNanos); dest.writeInt(state); dest.writeInt(ownerUid); dest.writeString(ownerPackageName); Loading Loading @@ -450,6 +472,10 @@ public final class DisplayInfo implements Parcelable { sb.append(physicalYDpi); sb.append(") dpi, layerStack "); sb.append(layerStack); sb.append(", appVsyncOff "); sb.append(appVsyncOffsetNanos); sb.append(", presDeadline "); sb.append(presentationDeadlineNanos); sb.append(", type "); sb.append(Display.typeToString(type)); if (address != null) { Loading core/java/android/view/SurfaceControl.java +9 −2 Original line number Diff line number Diff line Loading @@ -458,6 +458,8 @@ public class SurfaceControl { public float xDpi; public float yDpi; public boolean secure; public long appVsyncOffsetNanos; public long presentationDeadlineNanos; public PhysicalDisplayInfo() { } Loading @@ -479,7 +481,9 @@ public class SurfaceControl { && density == other.density && xDpi == other.xDpi && yDpi == other.yDpi && secure == other.secure; && secure == other.secure && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos; } @Override Loading @@ -495,6 +499,8 @@ public class SurfaceControl { xDpi = other.xDpi; yDpi = other.yDpi; secure = other.secure; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; } // For debugging purposes Loading @@ -502,7 +508,8 @@ public class SurfaceControl { public String toString() { return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, " + "density " + density + ", " + xDpi + " x " + yDpi + " dpi, secure " + secure + "}"; + ", appVsyncOffset " + appVsyncOffsetNanos + ", bufferDeadline " + presentationDeadlineNanos + "}"; } } Loading core/jni/android_view_SurfaceControl.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ static struct { jfieldID xDpi; jfieldID yDpi; jfieldID secure; jfieldID appVsyncOffsetNanos; jfieldID presentationDeadlineNanos; } gPhysicalDisplayInfoClassInfo; static struct { Loading Loading @@ -392,6 +394,10 @@ static jobjectArray nativeGetDisplayConfigs(JNIEnv* env, jclass clazz, env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi); env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi); env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure); env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos, info.appVsyncOffset); env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos, info.presentationDeadline); env->SetObjectArrayElement(configArray, static_cast<jsize>(c), infoObj); env->DeleteLocalRef(infoObj); } Loading Loading @@ -648,6 +654,10 @@ int register_android_view_SurfaceControl(JNIEnv* env) gPhysicalDisplayInfoClassInfo.xDpi = env->GetFieldID(clazz, "xDpi", "F"); gPhysicalDisplayInfoClassInfo.yDpi = env->GetFieldID(clazz, "yDpi", "F"); gPhysicalDisplayInfoClassInfo.secure = env->GetFieldID(clazz, "secure", "Z"); gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos = env->GetFieldID(clazz, "appVsyncOffsetNanos", "J"); gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos = env->GetFieldID(clazz, "presentationDeadlineNanos", "J"); jclass rectClazz = env->FindClass("android/graphics/Rect"); gRectClassInfo.bottom = env->GetFieldID(rectClazz, "bottom", "I"); Loading services/core/java/com/android/server/display/DisplayDeviceInfo.java +21 −1 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ final class DisplayDeviceInfo { public int height; /** * The refresh rate of the display. * The refresh rate of the display, in frames per second. */ public float refreshRate; Loading @@ -143,6 +143,20 @@ final class DisplayDeviceInfo { */ public float yDpi; /** * This is a positive value indicating the phase offset of the VSYNC events provided by * Choreographer relative to the display refresh. For example, if Choreographer reports * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos). */ public long appVsyncOffsetNanos; /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - bufferDeadlineNanos). */ public long presentationDeadlineNanos; /** * Display flags. */ Loading Loading @@ -219,6 +233,8 @@ final class DisplayDeviceInfo { && densityDpi == other.densityDpi && xDpi == other.xDpi && yDpi == other.yDpi && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos && flags == other.flags && touch == other.touch && rotation == other.rotation Loading @@ -242,6 +258,8 @@ final class DisplayDeviceInfo { densityDpi = other.densityDpi; xDpi = other.xDpi; yDpi = other.yDpi; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; flags = other.flags; touch = other.touch; rotation = other.rotation; Loading @@ -261,6 +279,8 @@ final class DisplayDeviceInfo { sb.append(", ").append(refreshRate).append(" fps, "); sb.append("density ").append(densityDpi); sb.append(", ").append(xDpi).append(" x ").append(yDpi).append(" dpi"); sb.append(", appVsyncOff ").append(appVsyncOffsetNanos); sb.append(", presDeadline ").append(presentationDeadlineNanos); sb.append(", touch ").append(touchToString(touch)); sb.append(", rotation ").append(rotation); sb.append(", type ").append(Display.typeToString(type)); Loading Loading
core/java/android/view/Display.java +36 −0 Original line number Diff line number Diff line Loading @@ -598,6 +598,42 @@ public final class Display { } } /** * Gets the app VSYNC offset, in nanoseconds. This is a positive value indicating * the phase offset of the VSYNC events provided by Choreographer relative to the * display refresh. For example, if Choreographer reports that the refresh occurred * at time N, it actually occurred at (N - appVsyncOffset). * <p> * Apps generally do not need to be aware of this. It's only useful for fine-grained * A/V synchronization. * @hide */ public long getAppVsyncOffsetNanos() { synchronized (this) { updateDisplayInfoLocked(); return mDisplayInfo.appVsyncOffsetNanos; } } /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - presentationDeadline). * <p> * The desired presentation time for GLES rendering may be set with * {@link android.opengl.EGLExt#eglPresentationTimeANDROID}. For video decoding, use * {@link android.media.MediaCodec#releaseOutputBuffer(int, long)}. Times are * expressed in nanoseconds, using the system monotonic clock * ({@link System#nanoTime}). * @hide */ public long getPresentationDeadlineNanos() { synchronized (this) { updateDisplayInfoLocked(); return mDisplayInfo.presentationDeadlineNanos; } } /** * Gets display metrics that describe the size and density of this display. * <p> Loading
core/java/android/view/DisplayInfo.java +26 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,20 @@ public final class DisplayInfo implements Parcelable { */ public float physicalYDpi; /** * This is a positive value indicating the phase offset of the VSYNC events provided by * Choreographer relative to the display refresh. For example, if Choreographer reports * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos). */ public long appVsyncOffsetNanos; /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - bufferDeadlineNanos). */ public long presentationDeadlineNanos; /** * The state of the display, such as {@link android.view.Display#STATE_ON}. */ Loading Loading @@ -253,6 +267,8 @@ public final class DisplayInfo implements Parcelable { && logicalDensityDpi == other.logicalDensityDpi && physicalXDpi == other.physicalXDpi && physicalYDpi == other.physicalYDpi && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos && state == other.state && ownerUid == other.ownerUid && Objects.equal(ownerPackageName, other.ownerPackageName); Loading Loading @@ -286,6 +302,8 @@ public final class DisplayInfo implements Parcelable { logicalDensityDpi = other.logicalDensityDpi; physicalXDpi = other.physicalXDpi; physicalYDpi = other.physicalYDpi; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; state = other.state; ownerUid = other.ownerUid; ownerPackageName = other.ownerPackageName; Loading Loading @@ -314,6 +332,8 @@ public final class DisplayInfo implements Parcelable { logicalDensityDpi = source.readInt(); physicalXDpi = source.readFloat(); physicalYDpi = source.readFloat(); appVsyncOffsetNanos = source.readLong(); presentationDeadlineNanos = source.readLong(); state = source.readInt(); ownerUid = source.readInt(); ownerPackageName = source.readString(); Loading Loading @@ -343,6 +363,8 @@ public final class DisplayInfo implements Parcelable { dest.writeInt(logicalDensityDpi); dest.writeFloat(physicalXDpi); dest.writeFloat(physicalYDpi); dest.writeLong(appVsyncOffsetNanos); dest.writeLong(presentationDeadlineNanos); dest.writeInt(state); dest.writeInt(ownerUid); dest.writeString(ownerPackageName); Loading Loading @@ -450,6 +472,10 @@ public final class DisplayInfo implements Parcelable { sb.append(physicalYDpi); sb.append(") dpi, layerStack "); sb.append(layerStack); sb.append(", appVsyncOff "); sb.append(appVsyncOffsetNanos); sb.append(", presDeadline "); sb.append(presentationDeadlineNanos); sb.append(", type "); sb.append(Display.typeToString(type)); if (address != null) { Loading
core/java/android/view/SurfaceControl.java +9 −2 Original line number Diff line number Diff line Loading @@ -458,6 +458,8 @@ public class SurfaceControl { public float xDpi; public float yDpi; public boolean secure; public long appVsyncOffsetNanos; public long presentationDeadlineNanos; public PhysicalDisplayInfo() { } Loading @@ -479,7 +481,9 @@ public class SurfaceControl { && density == other.density && xDpi == other.xDpi && yDpi == other.yDpi && secure == other.secure; && secure == other.secure && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos; } @Override Loading @@ -495,6 +499,8 @@ public class SurfaceControl { xDpi = other.xDpi; yDpi = other.yDpi; secure = other.secure; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; } // For debugging purposes Loading @@ -502,7 +508,8 @@ public class SurfaceControl { public String toString() { return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, " + "density " + density + ", " + xDpi + " x " + yDpi + " dpi, secure " + secure + "}"; + ", appVsyncOffset " + appVsyncOffsetNanos + ", bufferDeadline " + presentationDeadlineNanos + "}"; } } Loading
core/jni/android_view_SurfaceControl.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ static struct { jfieldID xDpi; jfieldID yDpi; jfieldID secure; jfieldID appVsyncOffsetNanos; jfieldID presentationDeadlineNanos; } gPhysicalDisplayInfoClassInfo; static struct { Loading Loading @@ -392,6 +394,10 @@ static jobjectArray nativeGetDisplayConfigs(JNIEnv* env, jclass clazz, env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi); env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi); env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure); env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos, info.appVsyncOffset); env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos, info.presentationDeadline); env->SetObjectArrayElement(configArray, static_cast<jsize>(c), infoObj); env->DeleteLocalRef(infoObj); } Loading Loading @@ -648,6 +654,10 @@ int register_android_view_SurfaceControl(JNIEnv* env) gPhysicalDisplayInfoClassInfo.xDpi = env->GetFieldID(clazz, "xDpi", "F"); gPhysicalDisplayInfoClassInfo.yDpi = env->GetFieldID(clazz, "yDpi", "F"); gPhysicalDisplayInfoClassInfo.secure = env->GetFieldID(clazz, "secure", "Z"); gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos = env->GetFieldID(clazz, "appVsyncOffsetNanos", "J"); gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos = env->GetFieldID(clazz, "presentationDeadlineNanos", "J"); jclass rectClazz = env->FindClass("android/graphics/Rect"); gRectClassInfo.bottom = env->GetFieldID(rectClazz, "bottom", "I"); Loading
services/core/java/com/android/server/display/DisplayDeviceInfo.java +21 −1 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ final class DisplayDeviceInfo { public int height; /** * The refresh rate of the display. * The refresh rate of the display, in frames per second. */ public float refreshRate; Loading @@ -143,6 +143,20 @@ final class DisplayDeviceInfo { */ public float yDpi; /** * This is a positive value indicating the phase offset of the VSYNC events provided by * Choreographer relative to the display refresh. For example, if Choreographer reports * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos). */ public long appVsyncOffsetNanos; /** * This is how far in advance a buffer must be queued for presentation at * a given time. If you want a buffer to appear on the screen at * time N, you must submit the buffer before (N - bufferDeadlineNanos). */ public long presentationDeadlineNanos; /** * Display flags. */ Loading Loading @@ -219,6 +233,8 @@ final class DisplayDeviceInfo { && densityDpi == other.densityDpi && xDpi == other.xDpi && yDpi == other.yDpi && appVsyncOffsetNanos == other.appVsyncOffsetNanos && presentationDeadlineNanos == other.presentationDeadlineNanos && flags == other.flags && touch == other.touch && rotation == other.rotation Loading @@ -242,6 +258,8 @@ final class DisplayDeviceInfo { densityDpi = other.densityDpi; xDpi = other.xDpi; yDpi = other.yDpi; appVsyncOffsetNanos = other.appVsyncOffsetNanos; presentationDeadlineNanos = other.presentationDeadlineNanos; flags = other.flags; touch = other.touch; rotation = other.rotation; Loading @@ -261,6 +279,8 @@ final class DisplayDeviceInfo { sb.append(", ").append(refreshRate).append(" fps, "); sb.append("density ").append(densityDpi); sb.append(", ").append(xDpi).append(" x ").append(yDpi).append(" dpi"); sb.append(", appVsyncOff ").append(appVsyncOffsetNanos); sb.append(", presDeadline ").append(presentationDeadlineNanos); sb.append(", touch ").append(touchToString(touch)); sb.append(", rotation ").append(rotation); sb.append(", type ").append(Display.typeToString(type)); Loading