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

Commit 9180f641 authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "CriticalNative for RenderNode and DisplayListCanvas"

parents 711911bb fc29424a
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