Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18f16e6f authored by John Reck's avatar John Reck
Browse files

TIME LORD!

 Bug: 14444180

Change-Id: I68bec3807c4d1c88d5af1aec2fe6907d60b5f2f3
parent 29e594c5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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:");
+14 −13
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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;

@@ -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);

@@ -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
@@ -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);
+10 −3
Original line number Diff line number Diff line
@@ -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);
@@ -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,
@@ -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 },
+2 −1
Original line number Diff line number Diff line
@@ -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,)

+3 −2
Original line number Diff line number Diff line
@@ -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) {
@@ -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