Loading apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java +16 −1 Original line number Diff line number Diff line Loading @@ -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 }); } Loading Loading @@ -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) -> { Loading core/java/android/app/ActivityThread.java +5 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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); } Loading Loading @@ -6240,4 +6233,8 @@ public final class ActivityThread { throw new RuntimeException("Main thread loop unexpectedly exited"); } // ------------------ Regular JNI ------------------------ private native void nDumpGraphicsInfo(FileDescriptor fd); } core/java/android/view/DisplayListCanvas.java +20 −12 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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); } core/java/android/view/RenderNode.java +70 −66 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 /////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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); Loading @@ -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); } core/jni/android_view_DisplayListCanvas.cpp +64 −90 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } // ---------------------------------------------------------------------------- Loading @@ -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 Loading
apct-tests/perftests/core/src/android/view/ViewShowHidePerfTest.java +16 −1 Original line number Diff line number Diff line Loading @@ -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 }); } Loading Loading @@ -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) -> { Loading
core/java/android/app/ActivityThread.java +5 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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); } Loading Loading @@ -6240,4 +6233,8 @@ public final class ActivityThread { throw new RuntimeException("Main thread loop unexpectedly exited"); } // ------------------ Regular JNI ------------------------ private native void nDumpGraphicsInfo(FileDescriptor fd); }
core/java/android/view/DisplayListCanvas.java +20 −12 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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); }
core/java/android/view/RenderNode.java +70 −66 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 /////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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); Loading @@ -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); }
core/jni/android_view_DisplayListCanvas.cpp +64 −90 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } // ---------------------------------------------------------------------------- Loading @@ -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