diff options
author | 2025-02-13 13:23:53 -0800 | |
---|---|---|
committer | 2025-02-18 13:45:51 -0800 | |
commit | b07fe1debbc100f9ae93d8f1447c281ed31ddf1a (patch) | |
tree | 5b4e474659f23f275a54e5ab1ee18e41cc5a05dd | |
parent | f36bafc199b04d71de3d57f11de14f06422ca809 (diff) |
Add infrastructure for registering a native frame metrics observer
This will allow NativeInputEventReceiver to subscribe to the frame
metrics notifications directly from the native code, without having to
involve java.
Java would still be needed to register the observer, though.
Bug: 376713684
Test: compile only, this infra is used in another CL
Flag: EXEMPT refactor
Change-Id: I7be8f0b2e94595f9a64ce69a22fe5910e0cd7711
-rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 14 | ||||
-rw-r--r-- | libs/hwui/FrameInfo.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/FrameInfo.h | 2 | ||||
-rw-r--r-- | libs/hwui/FrameMetricsReporter.h | 6 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 4 |
9 files changed, 38 insertions, 22 deletions
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index 65854dd51a91..ef6b72871415 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -658,6 +658,13 @@ public class HardwareRenderer { } /** + * @hide + */ + public void addObserver(long nativeObserver) { + nAddObserver(mNativeProxy, nativeObserver); + } + + /** * TODO: Public API this? * * @hide @@ -667,6 +674,13 @@ public class HardwareRenderer { } /** + * @hide + */ + public void removeObserver(long nativeObserver) { + nRemoveObserver(mNativeProxy, nativeObserver); + } + + /** * Sets the desired color mode on this renderer. Whether or not the actual rendering * will use the requested colorMode depends on the hardware support for such rendering. * diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp index fa09296f647c..0e52f4e177c5 100644 --- a/libs/hwui/FrameInfo.cpp +++ b/libs/hwui/FrameInfo.cpp @@ -52,7 +52,7 @@ const std::array FrameInfoNames{"Flags", static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 24, "Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)"); -void FrameInfo::importUiThreadInfo(int64_t* info) { +void FrameInfo::importUiThreadInfo(const int64_t* info) { memcpy(mFrameInfo.data(), info, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t)); mSkippedFrameReason.reset(); } diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h index 8b486cd49e24..b1f479faadff 100644 --- a/libs/hwui/FrameInfo.h +++ b/libs/hwui/FrameInfo.h @@ -134,7 +134,7 @@ private: class FrameInfo { public: - void importUiThreadInfo(int64_t* info); + void importUiThreadInfo(const int64_t* info); void markSyncStart() { set(FrameInfoIndex::SyncStart) = systemTime(SYSTEM_TIME_MONOTONIC); } diff --git a/libs/hwui/FrameMetricsReporter.h b/libs/hwui/FrameMetricsReporter.h index 0b0895aa3f3d..71b3f52fe12e 100644 --- a/libs/hwui/FrameMetricsReporter.h +++ b/libs/hwui/FrameMetricsReporter.h @@ -35,12 +35,12 @@ class FrameMetricsReporter { public: FrameMetricsReporter() {} - void addObserver(FrameMetricsObserver* observer) { + void addObserver(sp<FrameMetricsObserver>&& observer) { std::lock_guard lock(mObserversLock); - mObservers.push_back(observer); + mObservers.push_back(std::move(observer)); } - bool removeObserver(FrameMetricsObserver* observer) { + bool removeObserver(const sp<FrameMetricsObserver>& observer) { std::lock_guard lock(mObserversLock); for (size_t i = 0; i < mObservers.size(); i++) { if (mObservers[i].get() == observer) { diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 99e7740d66d2..cfec24b17cd4 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -915,20 +915,22 @@ static jboolean android_view_ThreadedRenderer_isDrawingEnabled(JNIEnv*, jclass) static void android_view_ThreadedRenderer_addObserver(JNIEnv* env, jclass clazz, jlong proxyPtr, jlong observerPtr) { - HardwareRendererObserver* observer = reinterpret_cast<HardwareRendererObserver*>(observerPtr); + FrameMetricsObserver* rawObserver = reinterpret_cast<FrameMetricsObserver*>(observerPtr); + sp<FrameMetricsObserver> observer = sp<FrameMetricsObserver>::fromExisting(rawObserver); renderthread::RenderProxy* renderProxy = reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - renderProxy->addFrameMetricsObserver(observer); + renderProxy->addFrameMetricsObserver(std::move(observer)); } static void android_view_ThreadedRenderer_removeObserver(JNIEnv* env, jclass clazz, jlong proxyPtr, jlong observerPtr) { - HardwareRendererObserver* observer = reinterpret_cast<HardwareRendererObserver*>(observerPtr); + FrameMetricsObserver* rawObserver = reinterpret_cast<FrameMetricsObserver*>(observerPtr); + sp<FrameMetricsObserver> observer = sp<FrameMetricsObserver>::fromExisting(rawObserver); renderthread::RenderProxy* renderProxy = reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - renderProxy->removeFrameMetricsObserver(observer); + renderProxy->removeFrameMetricsObserver(std::move(observer)); } // ---------------------------------------------------------------------------- diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index e3e393c4fdfb..b248c4bc9ade 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -859,7 +859,7 @@ void CanvasContext::reportMetricsWithPresentTime() { } // release lock } -void CanvasContext::addFrameMetricsObserver(FrameMetricsObserver* observer) { +void CanvasContext::addFrameMetricsObserver(sp<FrameMetricsObserver>&& observer) { std::scoped_lock lock(mFrameInfoMutex); if (mFrameMetricsReporter.get() == nullptr) { mFrameMetricsReporter.reset(new FrameMetricsReporter()); @@ -870,10 +870,10 @@ void CanvasContext::addFrameMetricsObserver(FrameMetricsObserver* observer) { // their frame metrics. uint64_t nextFrameNumber = getFrameNumber(); observer->reportMetricsFrom(nextFrameNumber, mSurfaceControlGenerationId); - mFrameMetricsReporter->addObserver(observer); + mFrameMetricsReporter->addObserver(std::move(observer)); } -void CanvasContext::removeFrameMetricsObserver(FrameMetricsObserver* observer) { +void CanvasContext::removeFrameMetricsObserver(const sp<FrameMetricsObserver>& observer) { std::scoped_lock lock(mFrameInfoMutex); if (mFrameMetricsReporter.get() != nullptr) { mFrameMetricsReporter->removeObserver(observer); diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index cb3753822035..f119102dc2a2 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -176,8 +176,8 @@ public: void setContentDrawBounds(const Rect& bounds) { mContentDrawBounds = bounds; } - void addFrameMetricsObserver(FrameMetricsObserver* observer); - void removeFrameMetricsObserver(FrameMetricsObserver* observer); + void addFrameMetricsObserver(sp<FrameMetricsObserver>&& observer); + void removeFrameMetricsObserver(const sp<FrameMetricsObserver>& observer); // Used to queue up work that needs to be completed before this frame completes void enqueueFrameWork(std::function<void()>&& func); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 715153b5083d..8399e345c1e9 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -420,15 +420,15 @@ void RenderProxy::setFrameCompleteCallback(std::function<void()>&& callback) { mDrawFrameTask.setFrameCompleteCallback(std::move(callback)); } -void RenderProxy::addFrameMetricsObserver(FrameMetricsObserver* observerPtr) { - mRenderThread.queue().post([this, observer = sp{observerPtr}]() { - mContext->addFrameMetricsObserver(observer.get()); +void RenderProxy::addFrameMetricsObserver(sp<FrameMetricsObserver>&& observer) { + mRenderThread.queue().post([this, observer = std::move(observer)]() mutable { + mContext->addFrameMetricsObserver(std::move(observer)); }); } -void RenderProxy::removeFrameMetricsObserver(FrameMetricsObserver* observerPtr) { - mRenderThread.queue().post([this, observer = sp{observerPtr}]() { - mContext->removeFrameMetricsObserver(observer.get()); +void RenderProxy::removeFrameMetricsObserver(sp<FrameMetricsObserver>&& observer) { + mRenderThread.queue().post([this, observer = std::move(observer)]() { + mContext->removeFrameMetricsObserver(observer); }); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index f2d8e94c7bd2..ad6d54bfcf91 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -141,8 +141,8 @@ public: void setFrameCommitCallback(std::function<void(bool)>&& callback); void setFrameCompleteCallback(std::function<void()>&& callback); - void addFrameMetricsObserver(FrameMetricsObserver* observer); - void removeFrameMetricsObserver(FrameMetricsObserver* observer); + void addFrameMetricsObserver(sp<FrameMetricsObserver>&& observer); + void removeFrameMetricsObserver(sp<FrameMetricsObserver>&& observer); void setForceDark(ForceDarkType type); static void copySurfaceInto(ANativeWindow* window, std::shared_ptr<CopyRequest>&& request); |