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

Commit dc1a696f authored by John Reck's avatar John Reck
Browse files

Avoid DisplayList* hitting the JNI layer

Keep the actual display list type internal to HWUI/native
avoids requiring that the recording type fits in a jlong

aka, opens up a usage of value types here instead

Test: boots
Change-Id: Idf5a4acc7dbcb61e6742a6bf6369bd351f595be4
parent 9134bffa
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -71,8 +71,8 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
    }

    /*package*/
    long finishRecording() {
        return nFinishRecording(mNativeCanvasWrapper);
    void finishRecording(RenderNode node) {
        nFinishRecording(mNativeCanvasWrapper, node.mNativeRenderNode);
    }

    ///////////////////////////////////////////////////////////////////////////
@@ -251,7 +251,7 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
    @CriticalNative
    private static native void nEnableZ(long renderer, boolean enableZ);
    @CriticalNative
    private static native long nFinishRecording(long renderer);
    private static native void nFinishRecording(long renderer, long renderNode);
    @CriticalNative
    private static native void nDrawRenderNode(long renderer, long renderNode);
    @CriticalNative
+5 −13
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.view.View;
import com.android.internal.util.ArrayUtils;

import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;

import libcore.util.NativeAllocationRegistry;

@@ -406,8 +405,7 @@ public final class RenderNode {
        }
        RecordingCanvas canvas = mCurrentRecordingCanvas;
        mCurrentRecordingCanvas = null;
        long displayList = canvas.finishRecording();
        nSetDisplayList(mNativeRenderNode, displayList);
        canvas.finishRecording(this);
        canvas.recycle();
    }

@@ -438,7 +436,7 @@ public final class RenderNode {
     * obsolete resources after related resources are gone.
     */
    public void discardDisplayList() {
        nSetDisplayList(mNativeRenderNode, 0);
        nDiscardDisplayList(mNativeRenderNode);
    }

    /**
@@ -1528,19 +1526,13 @@ public final class RenderNode {

    private static native void nEndAllAnimators(long renderNode);


    ///////////////////////////////////////////////////////////////////////////
    // @FastNative methods
    ///////////////////////////////////////////////////////////////////////////

    @FastNative
    private static native void nSetDisplayList(long renderNode, long newData);


    ///////////////////////////////////////////////////////////////////////////
    // @CriticalNative methods
    ///////////////////////////////////////////////////////////////////////////

    @CriticalNative
    private static native void nDiscardDisplayList(long renderNode);

    @CriticalNative
    private static native boolean nIsValid(long renderNode);

+4 −0
Original line number Diff line number Diff line
@@ -81,6 +81,10 @@ void RenderNode::setStagingDisplayList(DisplayList* displayList) {
    mStagingDisplayList = displayList;
}

void RenderNode::discardStagingDisplayList() {
    setStagingDisplayList(nullptr);
}

/**
 * This function is a simplified version of replay(), where we simply retrieve and log the
 * display list. This function should remain in sync with the replay() function.
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ public:
    enum ReplayFlag { kReplayFlag_ClipChildren = 0x1 };

    void setStagingDisplayList(DisplayList* newData);
    void discardStagingDisplayList();

    void output();
    int getUsageSize();
+5 −3
Original line number Diff line number Diff line
@@ -98,9 +98,11 @@ static void android_view_DisplayListCanvas_enableZ(CRITICAL_JNI_PARAMS_COMMA jlo
    canvas->enableZ(reorderEnable);
}

static jlong android_view_DisplayListCanvas_finishRecording(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr) {
static void android_view_DisplayListCanvas_finishRecording(
        CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    return reinterpret_cast<jlong>(canvas->finishRecording());
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    renderNode->setStagingDisplayList(canvas->finishRecording());
}

static void android_view_DisplayListCanvas_drawRenderNode(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
@@ -157,7 +159,7 @@ static JNINativeMethod gMethods[] = {
    { "nGetMaximumTextureWidth",  "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureSize },
    { "nGetMaximumTextureHeight", "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureSize },
    { "nEnableZ",                 "(JZ)V",      (void*) android_view_DisplayListCanvas_enableZ },
    { "nFinishRecording",         "(J)J",       (void*) android_view_DisplayListCanvas_finishRecording },
    { "nFinishRecording",         "(JJ)V",      (void*) android_view_DisplayListCanvas_finishRecording },
    { "nDrawRenderNode",          "(JJ)V",      (void*) android_view_DisplayListCanvas_drawRenderNode },
    { "nDrawTextureLayer",        "(JJ)V",      (void*) android_view_DisplayListCanvas_drawTextureLayer },
    { "nDrawCircle",              "(JJJJJ)V",   (void*) android_view_DisplayListCanvas_drawCircleProps },
Loading