summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-02-18 15:53:01 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-02-18 15:53:01 -0800
commite8e8f93b86341205871771c5ddb6368ece6e8c5d (patch)
tree9633d43c75a6b4158d37e83673d949ff65340cab
parent180d229354b61e379b67e74af1344a0cb126b400 (diff)
parentb07fe1debbc100f9ae93d8f1447c281ed31ddf1a (diff)
Merge "Add infrastructure for registering a native frame metrics observer" into main
-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 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);