summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Siarhei Vishniakou <svv@google.com> 2025-02-13 13:23:53 -0800
committer Siarhei Vishniakou <svv@google.com> 2025-02-18 13:45:51 -0800
commitb07fe1debbc100f9ae93d8f1447c281ed31ddf1a (patch)
tree5b4e474659f23f275a54e5ab1ee18e41cc5a05dd
parentf36bafc199b04d71de3d57f11de14f06422ca809 (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.java14
-rw-r--r--libs/hwui/FrameInfo.cpp2
-rw-r--r--libs/hwui/FrameInfo.h2
-rw-r--r--libs/hwui/FrameMetricsReporter.h6
-rw-r--r--libs/hwui/jni/android_graphics_HardwareRenderer.cpp10
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp6
-rw-r--r--libs/hwui/renderthread/CanvasContext.h4
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp12
-rw-r--r--libs/hwui/renderthread/RenderProxy.h4
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);