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
diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp
index 74c073f..2c4771c 100644
--- a/core/jni/android_view_DisplayListCanvas.cpp
+++ b/core/jni/android_view_DisplayListCanvas.cpp
@@ -87,19 +87,17 @@
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,31 +110,62 @@
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_insertReorderBarrier(jlong canvasPtr,
+ jboolean reorderEnable) {
+ Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
+ canvas->insertReorderBarrier(reorderEnable);
+}
-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) {
+static jlong android_view_DisplayListCanvas_finishRecording(jlong canvasPtr) {
+ Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
+ return reinterpret_cast<jlong>(canvas->finishRecording());
+}
+
+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);
+}
+
+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);
+}
+
+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);
@@ -148,8 +177,8 @@
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_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);
@@ -159,58 +188,6 @@
}
// ----------------------------------------------------------------------------
-// Display lists
-// ----------------------------------------------------------------------------
-
-static jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
- jobject clazz, 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) {
- 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) {
- Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
- DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
- canvas->drawLayer(layer);
-}
-
-// ----------------------------------------------------------------------------
-// Logging
-// ----------------------------------------------------------------------------
-
-static void
-android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
- int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
- android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
-}
-
-// ----------------------------------------------------------------------------
// JNI Glue
// ----------------------------------------------------------------------------
@@ -220,28 +197,25 @@
// ------------ @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 },
+ { "nResetDisplayListCanvas", "(JJII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
+ { "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 }
};