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

Commit 0154feef authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Initial refactoring to enable reuse of SkiaDisplayList on a per...

Merge "Initial refactoring to enable reuse of SkiaDisplayList on a per RenderNode basis. With Skia renderer we see 30% speed improvement in Invalidate Tree UI Jank test, when SkiaDisplayList objects are reused."
parents 7ca5ad1d c0e7a90f
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -51,9 +51,10 @@ public final class DisplayListCanvas extends RecordingCanvas {
        if (node == null) throw new IllegalArgumentException("node cannot be null");
        DisplayListCanvas canvas = sPool.acquire();
        if (canvas == null) {
            canvas = new DisplayListCanvas(width, height);
            canvas = new DisplayListCanvas(node, width, height);
        } else {
            nResetDisplayListCanvas(canvas.mNativeCanvasWrapper, width, height);
            nResetDisplayListCanvas(canvas.mNativeCanvasWrapper, node.mNativeRenderNode,
                    width, height);
        }
        canvas.mNode = node;
        canvas.mWidth = width;
@@ -79,8 +80,8 @@ public final class DisplayListCanvas extends RecordingCanvas {
    // Constructors
    ///////////////////////////////////////////////////////////////////////////

    private DisplayListCanvas(int width, int height) {
        super(nCreateDisplayListCanvas(width, height));
    private DisplayListCanvas(@NonNull RenderNode node, int width, int height) {
        super(nCreateDisplayListCanvas(node.mNativeRenderNode, width, height));
        mDensity = 0; // disable bitmap density scaling
    }

@@ -230,9 +231,10 @@ public final class DisplayListCanvas extends RecordingCanvas {
    }

    @FastNative
    private static native long nCreateDisplayListCanvas(int width, int height);
    private static native long nCreateDisplayListCanvas(long node, int width, int height);
    @FastNative
    private static native void nResetDisplayListCanvas(long canvas, int width, int height);
    private static native void nResetDisplayListCanvas(long canvas, long node,
            int width, int height);
    @FastNative
    private static native int nGetMaximumTextureWidth();
    @FastNative
+8 −6
Original line number Diff line number Diff line
@@ -169,14 +169,16 @@ static jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
}

static jlong android_view_DisplayListCanvas_createDisplayListCanvas(JNIEnv* env, jobject clazz,
        jint width, jint height) {
    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height));
        jlong renderNodePtr, jint width, jint height) {
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height, renderNode));
}

static void android_view_DisplayListCanvas_resetDisplayListCanvas(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jint width, jint height) {
        jlong canvasPtr, jlong renderNodePtr, jint width, jint height) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->resetRecording(width, height);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->resetRecording(width, height, renderNode);
}


@@ -229,8 +231,8 @@ static JNINativeMethod gMethods[] = {
    { "nFinishRecording",   "(J)J",            (void*) android_view_DisplayListCanvas_finishRecording },
    { "nDrawRenderNode",    "(JJ)V",           (void*) android_view_DisplayListCanvas_drawRenderNode },

    { "nCreateDisplayListCanvas", "(II)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
    { "nResetDisplayListCanvas", "(JII)V",     (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
    { "nCreateDisplayListCanvas", "(JII)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
    { "nResetDisplayListCanvas", "(JJII)V",     (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },

    { "nDrawLayer",               "(JJ)V",     (void*) android_view_DisplayListCanvas_drawLayer },

+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ RecordingCanvas::~RecordingCanvas() {
            "Destroyed a RecordingCanvas during a record!");
}

void RecordingCanvas::resetRecording(int width, int height) {
void RecordingCanvas::resetRecording(int width, int height, RenderNode* node) {
    LOG_ALWAYS_FATAL_IF(mDisplayList,
            "prepareDirty called a second time during a recording!");
    mDisplayList = new DisplayList();
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public:
    RecordingCanvas(size_t width, size_t height);
    virtual ~RecordingCanvas();

    virtual void resetRecording(int width, int height) override;
    virtual void resetRecording(int width, int height, RenderNode* node = nullptr) override;
    virtual WARN_UNUSED_RESULT DisplayList* finishRecording() override;
// ----------------------------------------------------------------------------
// MISC HWUI OPERATIONS - TODO: CATEGORIZE
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ public:
        return mCanvas.get();
    }

    virtual void resetRecording(int width, int height) override {
    virtual void resetRecording(int width, int height,
            uirenderer::RenderNode* renderNode) override {
        LOG_ALWAYS_FATAL("SkiaCanvas cannot be reset as a recording canvas");
    }

Loading