diff options
author | 2025-02-18 15:53:01 -0800 | |
---|---|---|
committer | 2025-02-18 15:53:01 -0800 | |
commit | e8e8f93b86341205871771c5ddb6368ece6e8c5d (patch) | |
tree | 9633d43c75a6b4158d37e83673d949ff65340cab | |
parent | 180d229354b61e379b67e74af1344a0cb126b400 (diff) | |
parent | b07fe1debbc100f9ae93d8f1447c281ed31ddf1a (diff) |
Merge "Add infrastructure for registering a native frame metrics observer" into main
-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 77879cf992b7..ebfd8fde91f6 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); |