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
diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java
index 9f46ceb..4673f43 100644
--- a/graphics/java/android/graphics/RecordingCanvas.java
+++ b/graphics/java/android/graphics/RecordingCanvas.java
@@ -71,8 +71,8 @@
     }
 
     /*package*/
-    long finishRecording() {
-        return nFinishRecording(mNativeCanvasWrapper);
+    void finishRecording(RenderNode node) {
+        nFinishRecording(mNativeCanvasWrapper, node.mNativeRenderNode);
     }
 
     ///////////////////////////////////////////////////////////////////////////
@@ -251,7 +251,7 @@
     @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
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index 117828d..c1310a9 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -30,7 +30,6 @@
 import com.android.internal.util.ArrayUtils;
 
 import dalvik.annotation.optimization.CriticalNative;
-import dalvik.annotation.optimization.FastNative;
 
 import libcore.util.NativeAllocationRegistry;
 
@@ -406,8 +405,7 @@
         }
         RecordingCanvas canvas = mCurrentRecordingCanvas;
         mCurrentRecordingCanvas = null;
-        long displayList = canvas.finishRecording();
-        nSetDisplayList(mNativeRenderNode, displayList);
+        canvas.finishRecording(this);
         canvas.recycle();
     }
 
@@ -438,7 +436,7 @@
      * obsolete resources after related resources are gone.
      */
     public void discardDisplayList() {
-        nSetDisplayList(mNativeRenderNode, 0);
+        nDiscardDisplayList(mNativeRenderNode);
     }
 
     /**
@@ -1528,20 +1526,14 @@
 
     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);
 
     // Matrix
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 74c70c8..1c78eed 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -81,6 +81,10 @@
     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.
diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h
index 6d5e62e..1eaf0d4 100644
--- a/libs/hwui/RenderNode.h
+++ b/libs/hwui/RenderNode.h
@@ -101,6 +101,7 @@
     enum ReplayFlag { kReplayFlag_ClipChildren = 0x1 };
 
     void setStagingDisplayList(DisplayList* newData);
+    void discardStagingDisplayList();
 
     void output();
     int getUsageSize();
diff --git a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
index 7c1422d..5c13468 100644
--- a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
+++ b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
@@ -98,9 +98,11 @@
     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 @@
     { "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 },
diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp
index 6f4ba89..8b35d96 100644
--- a/libs/hwui/jni/android_graphics_RenderNode.cpp
+++ b/libs/hwui/jni/android_graphics_RenderNode.cpp
@@ -76,11 +76,9 @@
     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseRenderNode));
 }
 
-static void android_view_RenderNode_setDisplayList(JNIEnv* env,
-        jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
+static void android_view_RenderNode_discardDisplayList(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
-    DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
-    renderNode->setStagingDisplayList(newData);
+    renderNode->discardStagingDisplayList();
 }
 
 static jboolean android_view_RenderNode_isValid(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
@@ -657,18 +655,11 @@
     { "nAddAnimator",              "(JJ)V", (void*) android_view_RenderNode_addAnimator },
     { "nEndAllAnimators",          "(J)V", (void*) android_view_RenderNode_endAllAnimators },
     { "nRequestPositionUpdates",   "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates },
-    { "nSetDisplayList",       "(JJ)V",   (void*) android_view_RenderNode_setDisplayList },
-
-
-// ----------------------------------------------------------------------------
-// Fast JNI via @CriticalNative annotation in RenderNode.java
-// ----------------------------------------------------------------------------
-    { "nSetDisplayList",       "(JJ)V",   (void*) android_view_RenderNode_setDisplayList },
-
 
 // ----------------------------------------------------------------------------
 // Critical JNI via @CriticalNative annotation in RenderNode.java
 // ----------------------------------------------------------------------------
+    { "nDiscardDisplayList",   "(J)V",   (void*) android_view_RenderNode_discardDisplayList },
     { "nIsValid",              "(J)Z",   (void*) android_view_RenderNode_isValid },
     { "nSetLayerType",         "(JI)Z",  (void*) android_view_RenderNode_setLayerType },
     { "nGetLayerType",         "(J)I",   (void*) android_view_RenderNode_getLayerType },