diff options
author | 2023-01-20 17:44:56 +0000 | |
---|---|---|
committer | 2023-01-20 17:44:56 +0000 | |
commit | 5e69090880bf1c8be54b759d6ed8b20b207c4afb (patch) | |
tree | 65e741b5bb7878883f8a3722121088c6ab87b92b | |
parent | ac6cd6146a9166f40df02eeef57830d312c8d445 (diff) | |
parent | ac5f755472e02f039f947ccfd5f5282e0ac80fe3 (diff) |
Merge "Send load up hint on view inflation"
-rw-r--r-- | core/java/android/view/LayoutInflater.java | 8 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 7 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 12 | ||||
-rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 11 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/HintSessionWrapper.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/renderthread/HintSessionWrapper.h | 1 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 1 |
11 files changed, 62 insertions, 0 deletions
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index df78827534a6..99a7fe598936 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -640,6 +640,10 @@ public abstract class LayoutInflater { mConstructorArgs[0] = inflaterContext; View result = root; + if (root != null && root.getViewRootImpl() != null) { + root.getViewRootImpl().notifyRendererOfExpensiveFrame(); + } + try { advanceToRootNode(parser); final String name = parser.getName(); @@ -662,6 +666,10 @@ public abstract class LayoutInflater { // Temp is the root view that was found in the xml final View temp = createViewFromTag(root, name, inflaterContext, attrs); + if (root == null && temp != null && temp.getViewRootImpl() != null) { + temp.getViewRootImpl().notifyRendererOfExpensiveFrame(); + } + ViewGroup.LayoutParams params = null; if (root != null) { diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 164a49464051..9c6e823b549e 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -594,6 +594,13 @@ public final class ThreadedRenderer extends HardwareRenderer { } } + @Override + public void notifyExpensiveFrame() { + if (isEnabled()) { + super.notifyExpensiveFrame(); + } + } + /** * Updates the light position based on the position of the window. * diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 5dccd068fb78..5165478c0c51 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2334,6 +2334,18 @@ public final class ViewRootImpl implements ViewParent, } } + /** + * Notifies the HardwareRenderer of an expensive upcoming frame, to + * allow better handling of power and scheduling requirements. + * + * @hide + */ + void notifyRendererOfExpensiveFrame() { + if (mAttachInfo.mThreadedRenderer != null) { + mAttachInfo.mThreadedRenderer.notifyExpensiveFrame(); + } + } + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) void scheduleTraversals() { if (!mTraversalScheduled) { diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index 89d63040b45a..f815a5e91e76 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -992,6 +992,15 @@ public class HardwareRenderer { } /** + * Notifies the hardware renderer about upcoming expensive frames. + * + * @hide + */ + public void notifyExpensiveFrame() { + nNotifyExpensiveFrame(mNativeProxy); + } + + /** * b/68769804, b/66945974: For low FPS experiments. * * @hide @@ -1553,4 +1562,6 @@ public class HardwareRenderer { private static native void nSetRtAnimationsEnabled(boolean rtAnimationsEnabled); private static native void nNotifyCallbackPending(long nativeProxy); + + private static native void nNotifyExpensiveFrame(long nativeProxy); } diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 3f4d004ae8fa..58923089deb0 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -822,6 +822,11 @@ static void android_view_ThreadedRenderer_notifyCallbackPending(JNIEnv*, jclass, proxy->notifyCallbackPending(); } +static void android_view_ThreadedRenderer_notifyExpensiveFrame(JNIEnv*, jclass, jlong proxyPtr) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + proxy->notifyExpensiveFrame(); +} + // Plumbs the display density down to DeviceInfo. static void android_view_ThreadedRenderer_setDisplayDensityDpi(JNIEnv*, jclass, jint densityDpi) { // Convert from dpi to density-independent pixels. @@ -1000,6 +1005,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_view_ThreadedRenderer_setRtAnimationsEnabled}, {"nNotifyCallbackPending", "(J)V", (void*)android_view_ThreadedRenderer_notifyCallbackPending}, + {"nNotifyExpensiveFrame", "(J)V", + (void*)android_view_ThreadedRenderer_notifyExpensiveFrame}, }; static JavaVM* mJvm = nullptr; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index b769f8d15044..f223137241d1 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -1021,6 +1021,10 @@ void CanvasContext::sendLoadResetHint() { mHintSessionWrapper.sendLoadResetHint(); } +void CanvasContext::sendLoadIncreaseHint() { + mHintSessionWrapper.sendLoadIncreaseHint(); +} + void CanvasContext::setSyncDelayDuration(nsecs_t duration) { mSyncDelayDuration = duration; } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 3f796d9b7b65..a274d2f2377f 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -223,6 +223,8 @@ public: void sendLoadResetHint(); + void sendLoadIncreaseHint(); + void setSyncDelayDuration(nsecs_t duration); private: diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp index 94c9d94a7c26..dece548e9dc1 100644 --- a/libs/hwui/renderthread/HintSessionWrapper.cpp +++ b/libs/hwui/renderthread/HintSessionWrapper.cpp @@ -158,6 +158,11 @@ void HintSessionWrapper::sendLoadResetHint() { mLastFrameNotification = now; } +void HintSessionWrapper::sendLoadIncreaseHint() { + if (!useHintSession()) return; + gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_UP)); +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h index fcbc10185255..c0f7a57bed75 100644 --- a/libs/hwui/renderthread/HintSessionWrapper.h +++ b/libs/hwui/renderthread/HintSessionWrapper.h @@ -33,6 +33,7 @@ public: void updateTargetWorkDuration(long targetDurationNanos); void reportActualWorkDuration(long actualDurationNanos); void sendLoadResetHint(); + void sendLoadIncreaseHint(); private: bool useHintSession(); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index ed01e322ffd9..5edb0b1dd818 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -254,6 +254,10 @@ void RenderProxy::notifyCallbackPending() { mRenderThread.queue().post([this]() { mContext->sendLoadResetHint(); }); } +void RenderProxy::notifyExpensiveFrame() { + mRenderThread.queue().post([this]() { mContext->sendLoadIncreaseHint(); }); +} + void RenderProxy::dumpProfileInfo(int fd, int dumpFlags) { mRenderThread.queue().runSync([&]() { std::lock_guard lock(mRenderThread.getJankDataMutex()); diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 17cf6650f87d..2aafe76f94f9 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -112,6 +112,7 @@ public: void stopDrawing(); void notifyFramePending(); void notifyCallbackPending(); + void notifyExpensiveFrame(); void dumpProfileInfo(int fd, int dumpFlags); // Not exported, only used for testing |