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

Commit fc29424a authored by Chris Craik's avatar Chris Craik
Browse files

CriticalNative for RenderNode and DisplayListCanvas

Bug: 33460152
Test:  adb shell am instrument -w -e class android.view.ViewShowHidePerfTest com.android.perftests.core/android.support.test.runner.AndroidJUnitRunner

- Also FastNative for setDisplayList, simplifying upcall into field setter.

- Also removes depth sweep parameter for ViewShowHideTests for now, they're not
providing much extra info.

Together with Outline/Path CL, about 25% faster visibility toggles

960MHz Bullhead Before (prior to Outline/Path CL):

$ adb shell am instrument -w -e class android.view.ViewShowHidePerfTest com.android.perftests.core/android.support.test.runner.AndroidJUnitRunner | grep min
INSTRUMENTATION_STATUS: add[Factory:NestedLinearLayoutTree,depth:6]_min=743505
INSTRUMENTATION_STATUS: goneToVisible[Factory:NestedLinearLayoutTree,depth:6]_min=332420
INSTRUMENTATION_STATUS: invisibleToVisible[Factory:NestedLinearLayoutTree,depth:6]_min=354154
INSTRUMENTATION_STATUS: recordAfterAdd[Factory:NestedLinearLayoutTree,depth:6]_min=1106095
INSTRUMENTATION_STATUS: remove[Factory:NestedLinearLayoutTree,depth:6]_min=1261290
INSTRUMENTATION_STATUS: visibleToGone[Factory:NestedLinearLayoutTree,depth:6]_min=356153
INSTRUMENTATION_STATUS: visibleToInvisible[Factory:NestedLinearLayoutTree,depth:6]_min=362149

After (this CL + Outline/Path CL):

$ adb shell am instrument -w -e class android.view.ViewShowHidePerfTest com.android.perftests.core/android.support.test.runner.AndroidJUnitRunner | grep min
INSTRUMENTATION_STATUS: add[Factory:NestedLinearLayoutTree,depth:6]_min=636061
INSTRUMENTATION_STATUS: goneToVisible[Factory:NestedLinearLayoutTree,depth:6]_min=267481
INSTRUMENTATION_STATUS: invisibleToVisible[Factory:NestedLinearLayoutTree,depth:6]_min=289433
INSTRUMENTATION_STATUS: recordAfterAdd[Factory:NestedLinearLayoutTree,depth:6]_min=976827
INSTRUMENTATION_STATUS: remove[Factory:NestedLinearLayoutTree,depth:6]_min=1207286
INSTRUMENTATION_STATUS: visibleToGone[Factory:NestedLinearLayoutTree,depth:6]_min=286148
INSTRUMENTATION_STATUS: visibleToInvisible[Factory:NestedLinearLayoutTree,depth:6]_min=292834

Change-Id: Iaddfa9550bdbab807c662595d005126d98cdc277
parent 2414e1b0
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ public class ViewShowHidePerfTest {
    @Parameterized.Parameters(name = "Factory:{0},depth:{1}")
    public static Iterable<Object[]> params() {
        List<Object[]> params = new ArrayList<>();
        for (int depth : new int[] {1, 6, 10}) {
        for (int depth : new int[] { 6 }) {
            for (SubTreeFactory subTreeFactory : sSubTreeFactories) {
                params.add(new Object[]{ subTreeFactory, depth });
            }
@@ -198,6 +198,21 @@ public class ViewShowHidePerfTest {
        });
    }

    @Test
    public void testRecordAfterAdd() throws Throwable {
        testParentWithChild((state, width, height, parent, child) -> {
            while (state.keepRunning()) {
                state.pauseTiming();
                parent.removeAllViews();
                updateAndValidateDisplayList(parent); // Note, done to be safe, likely not needed
                parent.addView(child);
                layout(width, height, child);
                state.resumeTiming();

                updateAndValidateDisplayList(parent);
            }
        });
    }

    private void testVisibility(int fromVisibility, int toVisibility) throws Throwable {
        testParentWithChild((state, width, height, parent, child) -> {
+5 −8
Original line number Diff line number Diff line
@@ -113,9 +113,6 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.renderscript.RenderScriptCacheDir;
import android.system.Os;
import android.system.OsConstants;
import android.system.ErrnoException;
import android.webkit.WebView;

import com.android.internal.annotations.GuardedBy;
@@ -138,11 +135,9 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -653,8 +648,6 @@ public final class ActivityThread {
        }
    }

    private native void dumpGraphicsInfo(FileDescriptor fd);

    private class ApplicationThread extends IApplicationThread.Stub {
        private static final String DB_INFO_FORMAT = "  %8s %8s %14s %14s  %s";

@@ -1195,7 +1188,7 @@ public final class ActivityThread {

        @Override
        public void dumpGfxInfo(ParcelFileDescriptor pfd, String[] args) {
            dumpGraphicsInfo(pfd.getFileDescriptor());
            nDumpGraphicsInfo(pfd.getFileDescriptor());
            WindowManagerGlobal.getInstance().dumpGfxInfo(pfd.getFileDescriptor(), args);
            IoUtils.closeQuietly(pfd);
        }
@@ -6240,4 +6233,8 @@ public final class ActivityThread {

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    // ------------------ Regular JNI ------------------------

    private native void nDumpGraphicsInfo(FileDescriptor fd);
}
+20 −12
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.graphics.CanvasProperty;
import android.graphics.Paint;
import android.util.Pools.SynchronizedPool;

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

/**
@@ -230,30 +231,37 @@ public final class DisplayListCanvas extends RecordingCanvas {
        }
    }


    // ------------------ Fast JNI ------------------------

    @FastNative
    private static native void nCallDrawGLFunction(long renderer,
            long drawGLFunction, Runnable releasedCallback);


    // ------------------ Critical JNI ------------------------

    @CriticalNative
    private static native long nCreateDisplayListCanvas(long node, int width, int height);
    @FastNative
    @CriticalNative
    private static native void nResetDisplayListCanvas(long canvas, long node,
            int width, int height);
    @FastNative
    @CriticalNative
    private static native int nGetMaximumTextureWidth();
    @FastNative
    @CriticalNative
    private static native int nGetMaximumTextureHeight();
    @FastNative
    @CriticalNative
    private static native void nInsertReorderBarrier(long renderer, boolean enableReorder);
    @FastNative
    private static native void nCallDrawGLFunction(long renderer,
            long drawGLFunction, Runnable releasedCallback);
    @FastNative
    @CriticalNative
    private static native long nFinishRecording(long renderer);
    @FastNative
    @CriticalNative
    private static native void nDrawRenderNode(long renderer, long renderNode);
    @FastNative
    @CriticalNative
    private static native void nDrawLayer(long renderer, long layer);
    @FastNative
    @CriticalNative
    private static native void nDrawCircle(long renderer, long propCx,
            long propCy, long propRadius, long propPaint);
    @FastNative
    @CriticalNative
    private static native void nDrawRoundRect(long renderer, long propLeft, long propTop,
            long propRight, long propBottom, long propRx, long propRy, long propPaint);
}
+70 −66
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;

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

import libcore.util.NativeAllocationRegistry;
@@ -138,7 +139,9 @@ public class RenderNode {
                RenderNode.class.getClassLoader(), nGetNativeFinalizer(), 1024);
    }

    // Note: written by native when display lists are detached
    private boolean mValid;

    // Do not access directly unless you are ThreadedRenderer
    final long mNativeRenderNode;
    private final View mOwningView;
@@ -792,13 +795,6 @@ public class RenderNode {
        return nGetDebugSize(mNativeRenderNode);
    }

    /**
     * Called by native when the passed displaylist is removed from the draw tree
     */
    void onRenderNodeDetached() {
        discardDisplayList();
    }

    ///////////////////////////////////////////////////////////////////////////
    // Animations
    ///////////////////////////////////////////////////////////////////////////
@@ -828,14 +824,13 @@ public class RenderNode {
    }

    ///////////////////////////////////////////////////////////////////////////
    // Native methods
    // Regular JNI methods
    ///////////////////////////////////////////////////////////////////////////

    // Intentionally not static because it acquires a reference to 'this'
    private native long nCreate(String name);

    private static native long nGetNativeFinalizer();
    private static native void nSetDisplayList(long renderNode, long newData);
    private static native void nOutput(long renderNode);
    private static native int nGetDebugSize(long renderNode);
    private static native void nRequestPositionUpdates(long renderNode, SurfaceView callback);
@@ -845,132 +840,141 @@ public class RenderNode {
    private static native void nAddAnimator(long renderNode, long animatorPtr);
    private static native void nEndAllAnimators(long renderNode);


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

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


    ///////////////////////////////////////////////////////////////////////////
    // Fast native methods
    // @CriticalNative methods
    ///////////////////////////////////////////////////////////////////////////

    // Matrix

    @FastNative
    @CriticalNative
    private static native void nGetTransformMatrix(long renderNode, long nativeMatrix);
    @FastNative
    @CriticalNative
    private static native void nGetInverseTransformMatrix(long renderNode, long nativeMatrix);
    @FastNative
    @CriticalNative
    private static native boolean nHasIdentityMatrix(long renderNode);

    // Properties

    @FastNative
    @CriticalNative
    private static native boolean nOffsetTopAndBottom(long renderNode, int offset);
    @FastNative
    @CriticalNative
    private static native boolean nOffsetLeftAndRight(long renderNode, int offset);
    @FastNative
    @CriticalNative
    private static native boolean nSetLeftTopRightBottom(long renderNode, int left, int top,
            int right, int bottom);
    @FastNative
    @CriticalNative
    private static native boolean nSetBottom(long renderNode, int bottom);
    @FastNative
    @CriticalNative
    private static native boolean nSetRight(long renderNode, int right);
    @FastNative
    @CriticalNative
    private static native boolean nSetTop(long renderNode, int top);
    @FastNative
    @CriticalNative
    private static native boolean nSetLeft(long renderNode, int left);
    @FastNative
    @CriticalNative
    private static native boolean nSetCameraDistance(long renderNode, float distance);
    @FastNative
    @CriticalNative
    private static native boolean nSetPivotY(long renderNode, float pivotY);
    @FastNative
    @CriticalNative
    private static native boolean nSetPivotX(long renderNode, float pivotX);
    @FastNative
    @CriticalNative
    private static native boolean nSetLayerType(long renderNode, int layerType);
    @FastNative
    @CriticalNative
    private static native boolean nSetLayerPaint(long renderNode, long paint);
    @FastNative
    @CriticalNative
    private static native boolean nSetClipToBounds(long renderNode, boolean clipToBounds);
    @FastNative
    @CriticalNative
    private static native boolean nSetClipBounds(long renderNode, int left, int top,
            int right, int bottom);
    @FastNative
    @CriticalNative
    private static native boolean nSetClipBoundsEmpty(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject);
    @FastNative
    @CriticalNative
    private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve);
    @FastNative
    @CriticalNative
    private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top,
            int right, int bottom, float radius, float alpha);
    @FastNative
    @CriticalNative
    private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath,
            float alpha);
    @FastNative
    @CriticalNative
    private static native boolean nSetOutlineEmpty(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nSetOutlineNone(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nHasShadow(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline);
    @FastNative
    @CriticalNative
    private static native boolean nSetRevealClip(long renderNode,
            boolean shouldClip, float x, float y, float radius);
    @FastNative
    @CriticalNative
    private static native boolean nSetAlpha(long renderNode, float alpha);
    @FastNative
    @CriticalNative
    private static native boolean nSetHasOverlappingRendering(long renderNode,
            boolean hasOverlappingRendering);
    @FastNative
    @CriticalNative
    private static native boolean nSetElevation(long renderNode, float lift);
    @FastNative
    @CriticalNative
    private static native boolean nSetTranslationX(long renderNode, float translationX);
    @FastNative
    @CriticalNative
    private static native boolean nSetTranslationY(long renderNode, float translationY);
    @FastNative
    @CriticalNative
    private static native boolean nSetTranslationZ(long renderNode, float translationZ);
    @FastNative
    @CriticalNative
    private static native boolean nSetRotation(long renderNode, float rotation);
    @FastNative
    @CriticalNative
    private static native boolean nSetRotationX(long renderNode, float rotationX);
    @FastNative
    @CriticalNative
    private static native boolean nSetRotationY(long renderNode, float rotationY);
    @FastNative
    @CriticalNative
    private static native boolean nSetScaleX(long renderNode, float scaleX);
    @FastNative
    @CriticalNative
    private static native boolean nSetScaleY(long renderNode, float scaleY);
    @FastNative
    @CriticalNative
    private static native boolean nSetStaticMatrix(long renderNode, long nativeMatrix);
    @FastNative
    @CriticalNative
    private static native boolean nSetAnimationMatrix(long renderNode, long animationMatrix);

    @FastNative
    @CriticalNative
    private static native boolean nHasOverlappingRendering(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nGetClipToOutline(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetAlpha(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetCameraDistance(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetScaleX(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetScaleY(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetElevation(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetTranslationX(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetTranslationY(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetTranslationZ(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetRotation(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetRotationX(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetRotationY(long renderNode);
    @FastNative
    @CriticalNative
    private static native boolean nIsPivotExplicitlySet(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetPivotX(long renderNode);
    @FastNative
    @CriticalNative
    private static native float nGetPivotY(long renderNode);
}
+64 −90
Original line number Diff line number Diff line
@@ -87,19 +87,17 @@ private:
    sp<InvokeRunnableMessage> mMessage;
};

// ----------------------------------------------------------------------------
// Setup
// ----------------------------------------------------------------------------

static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jboolean reorderEnable) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->insertReorderBarrier(reorderEnable);
// ---------------- Regular JNI -----------------------------

static void
android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
    android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
}

// ----------------------------------------------------------------------------
// Functor
// ----------------------------------------------------------------------------

// ---------------- @FastNative -----------------------------

static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong functorPtr, jobject releasedCallback) {
@@ -112,102 +110,81 @@ static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobje
    canvas->callDrawGLFunction(functor, bridge.get());
}

// ----------------------------------------------------------------------------
// Misc
// ----------------------------------------------------------------------------

static jint android_view_DisplayListCanvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
// ---------------- @CriticalNative -------------------------

static jlong android_view_DisplayListCanvas_createDisplayListCanvas(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(jlong canvasPtr,
        jlong renderNodePtr, jint width, jint height) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->resetRecording(width, height, renderNode);
}

static jint android_view_DisplayListCanvas_getMaxTextureWidth() {
    if (!Caches::hasInstance()) {
        android::uirenderer::renderthread::RenderProxy::staticFence();
    }
    return Caches::getInstance().maxTextureSize;
}

static jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
static jint android_view_DisplayListCanvas_getMaxTextureHeight() {
    if (!Caches::hasInstance()) {
        android::uirenderer::renderthread::RenderProxy::staticFence();
    }
    return Caches::getInstance().maxTextureSize;
}

// ----------------------------------------------------------------------------
// Drawing
// ----------------------------------------------------------------------------

static void android_view_DisplayListCanvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
        jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
    CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
    CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
    CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
    canvas->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
}

static void android_view_DisplayListCanvas_drawCircleProps(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
static void android_view_DisplayListCanvas_insertReorderBarrier(jlong canvasPtr,
        jboolean reorderEnable) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
    canvas->drawCircle(xProp, yProp, radiusProp, paintProp);
    canvas->insertReorderBarrier(reorderEnable);
}

// ----------------------------------------------------------------------------
// Display lists
// ----------------------------------------------------------------------------

static jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
        jobject clazz, jlong canvasPtr) {
static jlong android_view_DisplayListCanvas_finishRecording(jlong canvasPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    return reinterpret_cast<jlong>(canvas->finishRecording());
}

static jlong android_view_DisplayListCanvas_createDisplayListCanvas(JNIEnv* env, jobject clazz,
        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, jlong renderNodePtr, jint width, jint height) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->resetRecording(width, height, renderNode);
}


static void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env,
        jobject clazz, jlong canvasPtr, jlong renderNodePtr) {
static void android_view_DisplayListCanvas_drawRenderNode(jlong canvasPtr, jlong renderNodePtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->drawRenderNode(renderNode);
}

// ----------------------------------------------------------------------------
// Layers
// ----------------------------------------------------------------------------

static void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong layerPtr) {
static void android_view_DisplayListCanvas_drawLayer(jlong canvasPtr, jlong layerPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
    canvas->drawLayer(layer);
}

// ----------------------------------------------------------------------------
// Logging
// ----------------------------------------------------------------------------
static void android_view_DisplayListCanvas_drawRoundRectProps(jlong canvasPtr,
        jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr, jlong bottomPropPtr,
        jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
    CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
    CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
    CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
    canvas->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
}

static void
android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
    android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
static void android_view_DisplayListCanvas_drawCircleProps(jlong canvasPtr,
        jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
    canvas->drawCircle(xProp, yProp, radiusProp, paintProp);
}

// ----------------------------------------------------------------------------
@@ -220,28 +197,25 @@ static JNINativeMethod gMethods[] = {

    // ------------ @FastNative ------------------

    { "nInsertReorderBarrier","(JZ)V",         (void*) android_view_DisplayListCanvas_insertReorderBarrier },

    { "nCallDrawGLFunction", "(JJLjava/lang/Runnable;)V",
            (void*) android_view_DisplayListCanvas_callDrawGLFunction },

    { "nDrawRoundRect",     "(JJJJJJJJ)V",     (void*) android_view_DisplayListCanvas_drawRoundRectProps },
    { "nDrawCircle",        "(JJJJJ)V",        (void*) android_view_DisplayListCanvas_drawCircleProps },

    { "nFinishRecording",   "(J)J",            (void*) android_view_DisplayListCanvas_finishRecording },
    { "nDrawRenderNode",    "(JJ)V",           (void*) android_view_DisplayListCanvas_drawRenderNode },

    // ------------ @CriticalNative --------------
    { "nCreateDisplayListCanvas", "(JII)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
    { "nResetDisplayListCanvas",  "(JJII)V",    (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },

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

    { "nGetMaximumTextureWidth",  "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureWidth },
    { "nGetMaximumTextureHeight", "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureHeight },
    { "nInsertReorderBarrier",    "(JZ)V",      (void*) android_view_DisplayListCanvas_insertReorderBarrier },
    { "nFinishRecording",         "(J)J",       (void*) android_view_DisplayListCanvas_finishRecording },
    { "nDrawRenderNode",          "(JJ)V",      (void*) android_view_DisplayListCanvas_drawRenderNode },
    { "nDrawLayer",               "(JJ)V",      (void*) android_view_DisplayListCanvas_drawLayer },
    { "nDrawCircle",              "(JJJJJ)V",   (void*) android_view_DisplayListCanvas_drawCircleProps },
    { "nDrawRoundRect",           "(JJJJJJJJ)V",(void*) android_view_DisplayListCanvas_drawRoundRectProps },
};

static JNINativeMethod gActivityThreadMethods[] = {
    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
        // ------------ Regular JNI ------------------
    { "nDumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
                                               (void*) android_app_ActivityThread_dumpGraphics }
};

Loading