From 01053d43506a8c850a4408d545d26079c7184e37 Mon Sep 17 00:00:00 2001 From: chaviw Date: Fri, 18 Mar 2022 17:54:00 -0500 Subject: [PATCH] Add call to disable RT Animations HWUI already supports disabling RT animations, but there was no correct way to call it from the application. Adding a call to enable or disable RT animations on the RenderThread so RT animations can be disabled during a blast sync. Test: Builds Bug: 200284684 Change-Id: Ia1ae3498c38b84b4975f08d37bc764f0c690ed9f --- .../android/graphics/HardwareRenderer.java | 19 ++++++++++++++----- .../jni/android_graphics_HardwareRenderer.cpp | 14 +++++++------- libs/hwui/renderthread/RenderProxy.cpp | 9 +++++++++ libs/hwui/renderthread/RenderProxy.h | 2 ++ 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index fd4bed19e927c..0e69184b34001 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -976,12 +976,12 @@ public class HardwareRenderer { } /** - * b/68769804: For low FPS experiments. + * b/68769804, b/66945974: For low FPS experiments. * * @hide */ public static void setFPSDivisor(int divisor) { - nHackySetRTAnimationsEnabled(divisor <= 1); + nSetRtAnimationsEnabled(divisor <= 1); } /** @@ -1145,6 +1145,16 @@ public class HardwareRenderer { nSetDrawingEnabled(drawingEnabled); } + /** + * Disable RenderThread animations that schedule draws directly from RenderThread. This is used + * when we don't want to de-schedule draw requests that come from the UI thread. + * + * @hide + */ + public static void setRtAnimationsEnabled(boolean enabled) { + nSetRtAnimationsEnabled(enabled); + } + private static final class DestroyContextRunnable implements Runnable { private final long mNativeInstance; @@ -1451,9 +1461,6 @@ public class HardwareRenderer { private static native void nSetHighContrastText(boolean enabled); - // For temporary experimentation b/66945974 - private static native void nHackySetRTAnimationsEnabled(boolean enabled); - private static native void nSetDebuggingEnabled(boolean enabled); private static native void nSetIsolatedProcess(boolean enabled); @@ -1472,4 +1479,6 @@ public class HardwareRenderer { private static native void nSetDrawingEnabled(boolean drawingEnabled); private static native boolean nIsDrawingEnabled(); + + private static native void nSetRtAnimationsEnabled(boolean rtAnimationsEnabled); } diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 27865b3972d7e..a3de92cdadedd 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -770,11 +770,6 @@ static void android_view_ThreadedRenderer_setHighContrastText(JNIEnv*, jclass, j Properties::enableHighContrastText = enable; } -static void android_view_ThreadedRenderer_hackySetRTAnimationsEnabled(JNIEnv*, jclass, - jboolean enable) { - Properties::enableRTAnimations = enable; -} - static void android_view_ThreadedRenderer_setDebuggingEnabled(JNIEnv*, jclass, jboolean enable) { Properties::debuggingEnabled = enable; } @@ -804,6 +799,11 @@ static void android_view_ThreadedRenderer_preload(JNIEnv*, jclass) { RenderProxy::preload(); } +static void android_view_ThreadedRenderer_setRtAnimationsEnabled(JNIEnv* env, jobject clazz, + jboolean enabled) { + RenderProxy::setRtAnimationsEnabled(enabled); +} + // Plumbs the display density down to DeviceInfo. static void android_view_ThreadedRenderer_setDisplayDensityDpi(JNIEnv*, jclass, jint densityDpi) { // Convert from dpi to density-independent pixels. @@ -959,8 +959,6 @@ static const JNINativeMethod gMethods[] = { (void*)android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode}, {"disableVsync", "()V", (void*)android_view_ThreadedRenderer_disableVsync}, {"nSetHighContrastText", "(Z)V", (void*)android_view_ThreadedRenderer_setHighContrastText}, - {"nHackySetRTAnimationsEnabled", "(Z)V", - (void*)android_view_ThreadedRenderer_hackySetRTAnimationsEnabled}, {"nSetDebuggingEnabled", "(Z)V", (void*)android_view_ThreadedRenderer_setDebuggingEnabled}, {"nSetIsolatedProcess", "(Z)V", (void*)android_view_ThreadedRenderer_setIsolatedProcess}, {"nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority}, @@ -974,6 +972,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_view_ThreadedRenderer_isWebViewOverlaysEnabled}, {"nSetDrawingEnabled", "(Z)V", (void*)android_view_ThreadedRenderer_setDrawingEnabled}, {"nIsDrawingEnabled", "()Z", (void*)android_view_ThreadedRenderer_isDrawingEnabled}, + {"nSetRtAnimationsEnabled", "(Z)V", + (void*)android_view_ThreadedRenderer_setRtAnimationsEnabled}, }; static JavaVM* mJvm = nullptr; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 026699c63e165..b88da13e4b08c 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -424,6 +424,15 @@ void RenderProxy::preload() { thread.queue().post([&thread]() { thread.preload(); }); } +void RenderProxy::setRtAnimationsEnabled(bool enabled) { + if (RenderThread::hasInstance()) { + RenderThread::getInstance().queue().post( + [enabled]() { Properties::enableRTAnimations = enabled; }); + } else { + Properties::enableRTAnimations = enabled; + } +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 491dbd72a14d6..0e7bd8c51bb20 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -143,6 +143,8 @@ public: static void preload(); + static void setRtAnimationsEnabled(bool enabled); + private: RenderThread& mRenderThread; CanvasContext* mContext;