Loading core/java/android/view/Choreographer.java +8 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,14 @@ public final class Choreographer { return delayMillis <= frameDelay ? 0 : delayMillis - frameDelay; } /** * @return The refresh rate as the nanoseconds between frames * @hide */ long getFrameIntervalNanos() { return mFrameIntervalNanos; } void dump(String prefix, PrintWriter writer) { String innerPrefix = prefix + " "; writer.print(prefix); writer.println("Choreographer:"); Loading core/java/android/view/ThreadedRenderer.java +14 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.os.SystemClock; import android.os.Trace; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; Loading Loading @@ -52,16 +51,23 @@ public class ThreadedRenderer extends HardwareRenderer { private static final Rect NULL_RECT = new Rect(); private static final long NANOS_PER_MS = 1000000; private int mWidth, mHeight; private long mNativeProxy; private boolean mInitialized = false; private RenderNode mRootNode; private Choreographer mChoreographer; ThreadedRenderer(boolean translucent) { long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); mRootNode.setClipToBounds(false); mNativeProxy = nCreateProxy(translucent, rootNodePtr); // Setup timing mChoreographer = Choreographer.getInstance(); nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); } @Override Loading Loading @@ -161,15 +167,6 @@ public class ThreadedRenderer extends HardwareRenderer { return false; } /** * TODO: Remove * Temporary hack to allow RenderThreadTest prototype app to trigger * replaying a DisplayList after modifying the displaylist properties * * @hide */ public void repeatLastDraw() { } private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { view.mPrivateFlags |= View.PFLAG_DRAWN; Loading @@ -194,7 +191,8 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { attachInfo.mIgnoreDirtyState = true; attachInfo.mDrawingTime = SystemClock.uptimeMillis(); long frameTimeNanos = mChoreographer.getFrameTimeNanos(); attachInfo.mDrawingTime = frameTimeNanos / NANOS_PER_MS; updateRootDisplayList(view, callbacks); Loading @@ -203,7 +201,8 @@ public class ThreadedRenderer extends HardwareRenderer { if (dirty == null) { dirty = NULL_RECT; } nSyncAndDrawFrame(mNativeProxy, dirty.left, dirty.top, dirty.right, dirty.bottom); nSyncAndDrawFrame(mNativeProxy, frameTimeNanos, dirty.left, dirty.top, dirty.right, dirty.bottom); } @Override Loading Loading @@ -297,13 +296,15 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateProxy(boolean translucent, long rootRenderNode); private static native void nDeleteProxy(long nativeProxy); private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); private static native void nSyncAndDrawFrame(long nativeProxy, private static native void nSyncAndDrawFrame(long nativeProxy, long frameTimeNanos, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); private static native void nRunWithGlContext(long nativeProxy, Runnable runnable); private static native void nDestroyCanvasAndSurface(long nativeProxy); Loading core/jni/android_view_ThreadedRenderer.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -152,6 +152,12 @@ static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz delete proxy; } static void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, jlong proxyPtr, jlong frameIntervalNanos) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setFrameInterval(frameIntervalNanos); } static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); Loading Loading @@ -186,10 +192,10 @@ static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, } static void android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, jlong proxyPtr, jint dirtyLeft, jint dirtyTop, jlong proxyPtr, jlong frameTimeNanos, jint dirtyLeft, jint dirtyTop, jint dirtyRight, jint dirtyBottom) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->syncAndDrawFrame(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); proxy->syncAndDrawFrame(frameTimeNanos, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); } static void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz, Loading Loading @@ -261,11 +267,12 @@ static JNINativeMethod gMethods[] = { { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSyncAndDrawFrame", "(JIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nSyncAndDrawFrame", "(JJIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface }, { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext }, Loading libs/hwui/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -59,7 +59,8 @@ ifeq ($(USE_OPENGL_RENDERER),true) renderthread/DrawFrameTask.cpp \ renderthread/RenderProxy.cpp \ renderthread/RenderTask.cpp \ renderthread/RenderThread.cpp renderthread/RenderThread.cpp \ renderthread/TimeLord.cpp intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,) Loading libs/hwui/renderthread/CanvasContext.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -406,6 +406,8 @@ void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* lay } void CanvasContext::prepareTree(TreeInfo& info) { info.frameTimeMs = mRenderThread.timeLord().frameTimeMs(); mRootRenderNode->prepareTree(info); if (info.hasAnimations && !info.hasFunctors) { Loading Loading @@ -449,12 +451,11 @@ void CanvasContext::draw(Rect* dirty) { } // Called by choreographer to do an RT-driven animation void CanvasContext::doFrame(nsecs_t frameTimeNanos) { void CanvasContext::doFrame() { ATRACE_CALL(); TreeInfo info; info.evaluateAnimations = true; info.frameTimeMs = nanoseconds_to_milliseconds(frameTimeNanos); info.performStagingPush = false; info.prepareTextures = false; Loading Loading
core/java/android/view/Choreographer.java +8 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,14 @@ public final class Choreographer { return delayMillis <= frameDelay ? 0 : delayMillis - frameDelay; } /** * @return The refresh rate as the nanoseconds between frames * @hide */ long getFrameIntervalNanos() { return mFrameIntervalNanos; } void dump(String prefix, PrintWriter writer) { String innerPrefix = prefix + " "; writer.print(prefix); writer.println("Choreographer:"); Loading
core/java/android/view/ThreadedRenderer.java +14 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.os.SystemClock; import android.os.Trace; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; Loading Loading @@ -52,16 +51,23 @@ public class ThreadedRenderer extends HardwareRenderer { private static final Rect NULL_RECT = new Rect(); private static final long NANOS_PER_MS = 1000000; private int mWidth, mHeight; private long mNativeProxy; private boolean mInitialized = false; private RenderNode mRootNode; private Choreographer mChoreographer; ThreadedRenderer(boolean translucent) { long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); mRootNode.setClipToBounds(false); mNativeProxy = nCreateProxy(translucent, rootNodePtr); // Setup timing mChoreographer = Choreographer.getInstance(); nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); } @Override Loading Loading @@ -161,15 +167,6 @@ public class ThreadedRenderer extends HardwareRenderer { return false; } /** * TODO: Remove * Temporary hack to allow RenderThreadTest prototype app to trigger * replaying a DisplayList after modifying the displaylist properties * * @hide */ public void repeatLastDraw() { } private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { view.mPrivateFlags |= View.PFLAG_DRAWN; Loading @@ -194,7 +191,8 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { attachInfo.mIgnoreDirtyState = true; attachInfo.mDrawingTime = SystemClock.uptimeMillis(); long frameTimeNanos = mChoreographer.getFrameTimeNanos(); attachInfo.mDrawingTime = frameTimeNanos / NANOS_PER_MS; updateRootDisplayList(view, callbacks); Loading @@ -203,7 +201,8 @@ public class ThreadedRenderer extends HardwareRenderer { if (dirty == null) { dirty = NULL_RECT; } nSyncAndDrawFrame(mNativeProxy, dirty.left, dirty.top, dirty.right, dirty.bottom); nSyncAndDrawFrame(mNativeProxy, frameTimeNanos, dirty.left, dirty.top, dirty.right, dirty.bottom); } @Override Loading Loading @@ -297,13 +296,15 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateProxy(boolean translucent, long rootRenderNode); private static native void nDeleteProxy(long nativeProxy); private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); private static native void nSyncAndDrawFrame(long nativeProxy, private static native void nSyncAndDrawFrame(long nativeProxy, long frameTimeNanos, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); private static native void nRunWithGlContext(long nativeProxy, Runnable runnable); private static native void nDestroyCanvasAndSurface(long nativeProxy); Loading
core/jni/android_view_ThreadedRenderer.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -152,6 +152,12 @@ static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz delete proxy; } static void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, jlong proxyPtr, jlong frameIntervalNanos) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setFrameInterval(frameIntervalNanos); } static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); Loading Loading @@ -186,10 +192,10 @@ static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, } static void android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, jlong proxyPtr, jint dirtyLeft, jint dirtyTop, jlong proxyPtr, jlong frameTimeNanos, jint dirtyLeft, jint dirtyTop, jint dirtyRight, jint dirtyBottom) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->syncAndDrawFrame(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); proxy->syncAndDrawFrame(frameTimeNanos, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); } static void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz, Loading Loading @@ -261,11 +267,12 @@ static JNINativeMethod gMethods[] = { { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSyncAndDrawFrame", "(JIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nSyncAndDrawFrame", "(JJIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface }, { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext }, Loading
libs/hwui/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -59,7 +59,8 @@ ifeq ($(USE_OPENGL_RENDERER),true) renderthread/DrawFrameTask.cpp \ renderthread/RenderProxy.cpp \ renderthread/RenderTask.cpp \ renderthread/RenderThread.cpp renderthread/RenderThread.cpp \ renderthread/TimeLord.cpp intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,) Loading
libs/hwui/renderthread/CanvasContext.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -406,6 +406,8 @@ void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* lay } void CanvasContext::prepareTree(TreeInfo& info) { info.frameTimeMs = mRenderThread.timeLord().frameTimeMs(); mRootRenderNode->prepareTree(info); if (info.hasAnimations && !info.hasFunctors) { Loading Loading @@ -449,12 +451,11 @@ void CanvasContext::draw(Rect* dirty) { } // Called by choreographer to do an RT-driven animation void CanvasContext::doFrame(nsecs_t frameTimeNanos) { void CanvasContext::doFrame() { ATRACE_CALL(); TreeInfo info; info.evaluateAnimations = true; info.frameTimeMs = nanoseconds_to_milliseconds(frameTimeNanos); info.performStagingPush = false; info.prepareTextures = false; Loading