diff options
author | 2025-02-18 11:35:58 -0800 | |
---|---|---|
committer | 2025-02-18 19:39:07 +0000 | |
commit | aed2282953df1ed812f45ee401c7277bde4c3cfd (patch) | |
tree | dcb50293f672ed35685a627be6fa62d647f4b89d /libs/hwui | |
parent | 6dd107ab7db5296496aba54ad06c60831b3e67c8 (diff) |
Pass metrics buffer as std::array
Before this change, metrics were passed around as a raw array, without clear guidance of how big the array was or how to use it. The callers had to look into the implementation to understand that to use this array, "FrameInfo.h" needed to be included, and that the array size and indices were there.
With the current refactor, it will become slightly easier to use these metrics.
Bug: 376713684
Change-Id: Iecc04a0a215a7913ca8f49e4611fb104e1cacb8e
Test: compile only
Flag: EXEMPT refactor
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/FrameInfo.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/FrameInfo.h | 6 | ||||
-rw-r--r-- | libs/hwui/FrameMetricsObserver.h | 4 | ||||
-rw-r--r-- | libs/hwui/FrameMetricsReporter.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/FrameMetricsReporter.h | 2 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRendererObserver.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRendererObserver.h | 2 | ||||
-rw-r--r-- | libs/hwui/tests/unit/FrameMetricsReporterTests.cpp | 23 | ||||
-rw-r--r-- | libs/hwui/tests/unit/JankTrackerTests.cpp | 9 |
9 files changed, 35 insertions, 26 deletions
diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp index 36feabde07eb..fa09296f647c 100644 --- a/libs/hwui/FrameInfo.cpp +++ b/libs/hwui/FrameInfo.cpp @@ -53,7 +53,7 @@ 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) { - memcpy(mFrameInfo, info, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t)); + 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 61c30b803b00..8b486cd49e24 100644 --- a/libs/hwui/FrameInfo.h +++ b/libs/hwui/FrameInfo.h @@ -84,6 +84,8 @@ enum { }; }; +using FrameInfoBuffer = std::array<int64_t, static_cast<size_t>(FrameInfoIndex::NumIndexes)>; + class UiFrameInfoBuilder { public: static constexpr int64_t INVALID_VSYNC_ID = -1; @@ -152,7 +154,7 @@ public: set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag); } - const int64_t* data() const { return mFrameInfo; } + const FrameInfoBuffer& data() const { return mFrameInfo; } inline int64_t operator[](FrameInfoIndex index) const { return get(index); } @@ -201,7 +203,7 @@ public: } private: - int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::NumIndexes)]; + FrameInfoBuffer mFrameInfo; std::optional<SkippedFrameReason> mSkippedFrameReason; }; diff --git a/libs/hwui/FrameMetricsObserver.h b/libs/hwui/FrameMetricsObserver.h index 3ea49518eecd..d267740d15c4 100644 --- a/libs/hwui/FrameMetricsObserver.h +++ b/libs/hwui/FrameMetricsObserver.h @@ -18,12 +18,14 @@ #include <utils/RefBase.h> +#include "FrameInfo.h" + namespace android { namespace uirenderer { class FrameMetricsObserver : public VirtualLightRefBase { public: - virtual void notify(const int64_t* buffer) = 0; + virtual void notify(const FrameInfoBuffer& buffer) = 0; bool waitForPresentTime() const { return mWaitForPresentTime; }; void reportMetricsFrom(uint64_t frameNumber, int32_t surfaceControlId) { diff --git a/libs/hwui/FrameMetricsReporter.cpp b/libs/hwui/FrameMetricsReporter.cpp index ee32ea17bfaf..4ad9c9ad7b31 100644 --- a/libs/hwui/FrameMetricsReporter.cpp +++ b/libs/hwui/FrameMetricsReporter.cpp @@ -16,10 +16,12 @@ #include "FrameMetricsReporter.h" +#include "FrameInfo.h" + namespace android { namespace uirenderer { -void FrameMetricsReporter::reportFrameMetrics(const int64_t* stats, bool hasPresentTime, +void FrameMetricsReporter::reportFrameMetrics(const FrameInfoBuffer& stats, bool hasPresentTime, uint64_t frameNumber, int32_t surfaceControlId) { FatVector<sp<FrameMetricsObserver>, 10> copy; { diff --git a/libs/hwui/FrameMetricsReporter.h b/libs/hwui/FrameMetricsReporter.h index 7e51df7ce6fc..0b0895aa3f3d 100644 --- a/libs/hwui/FrameMetricsReporter.h +++ b/libs/hwui/FrameMetricsReporter.h @@ -69,7 +69,7 @@ public: * stats of frames that are from "old" surfaces (i.e. with surfaceControlIds older than the one * the observer was attached on) nor those that are from "old" frame numbers. */ - void reportFrameMetrics(const int64_t* stats, bool hasPresentTime, uint64_t frameNumber, + void reportFrameMetrics(const FrameInfoBuffer& stats, bool hasPresentTime, uint64_t frameNumber, int32_t surfaceControlId); private: diff --git a/libs/hwui/jni/android_graphics_HardwareRendererObserver.cpp b/libs/hwui/jni/android_graphics_HardwareRendererObserver.cpp index 6cae5ffa397f..4f383ee063a2 100644 --- a/libs/hwui/jni/android_graphics_HardwareRendererObserver.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRendererObserver.cpp @@ -16,11 +16,12 @@ #include "android_graphics_HardwareRendererObserver.h" +#include <array> + +#include "FrameInfo.h" #include "graphics_jni_helpers.h" #include "nativehelper/jni_macros.h" -#include <array> - namespace android { struct { @@ -65,13 +66,13 @@ bool HardwareRendererObserver::getNextBuffer(JNIEnv* env, jlongArray metrics, in return false; } -void HardwareRendererObserver::notify(const int64_t* stats) { +void HardwareRendererObserver::notify(const uirenderer::FrameInfoBuffer& stats) { if (!mKeepListening) return; FrameMetricsNotification& elem = mRingBuffer[mNextFree]; if (!elem.hasData.load()) { - memcpy(elem.buffer, stats, kBufferSize * sizeof(stats[0])); + memcpy(elem.buffer, stats.data(), kBufferSize * sizeof(stats[0])); elem.dropCount = mDroppedReports; mDroppedReports = 0; diff --git a/libs/hwui/jni/android_graphics_HardwareRendererObserver.h b/libs/hwui/jni/android_graphics_HardwareRendererObserver.h index 5ee3e1669502..cf20ee135363 100644 --- a/libs/hwui/jni/android_graphics_HardwareRendererObserver.h +++ b/libs/hwui/jni/android_graphics_HardwareRendererObserver.h @@ -43,7 +43,7 @@ public: */ bool getNextBuffer(JNIEnv* env, jlongArray metrics, int* dropCount); - void notify(const int64_t* stats) override; + void notify(const uirenderer::FrameInfoBuffer& stats) override; private: static constexpr int kBufferSize = static_cast<int>(uirenderer::FrameInfoIndex::NumIndexes); diff --git a/libs/hwui/tests/unit/FrameMetricsReporterTests.cpp b/libs/hwui/tests/unit/FrameMetricsReporterTests.cpp index 571a26707c93..c7935ac5a753 100644 --- a/libs/hwui/tests/unit/FrameMetricsReporterTests.cpp +++ b/libs/hwui/tests/unit/FrameMetricsReporterTests.cpp @@ -14,13 +14,14 @@ * limitations under the License. */ -#include <gmock/gmock.h> -#include <gtest/gtest.h> - #include <FrameMetricsObserver.h> #include <FrameMetricsReporter.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> #include <utils/TimeUtils.h> +#include "FrameInfo.h" + using namespace android; using namespace android::uirenderer; @@ -31,7 +32,7 @@ public: explicit TestFrameMetricsObserver(bool waitForPresentTime) : FrameMetricsObserver(waitForPresentTime){}; - MOCK_METHOD(void, notify, (const int64_t* buffer), (override)); + MOCK_METHOD(void, notify, (const FrameInfoBuffer& buffer), (override)); }; // To make sure it is clear that something went wrong if no from frame is set (to make it easier @@ -44,7 +45,7 @@ TEST(FrameMetricsReporter, doesNotReportAnyFrameIfNoFromFrameIsSpecified) { reporter->addObserver(observer.get()); - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; uint64_t frameNumber = 1; int32_t surfaceControlId = 0; @@ -64,7 +65,7 @@ TEST(FrameMetricsReporter, doesNotReportAnyFrameIfNoFromFrameIsSpecified) { } TEST(FrameMetricsReporter, respectsWaitForPresentTimeUnset) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; uint64_t frameNumber = 3; int32_t surfaceControlId = 0; @@ -85,7 +86,7 @@ TEST(FrameMetricsReporter, respectsWaitForPresentTimeUnset) { } TEST(FrameMetricsReporter, respectsWaitForPresentTimeSet) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = true; uint64_t frameNumber = 3; int32_t surfaceControlId = 0; @@ -106,7 +107,7 @@ TEST(FrameMetricsReporter, respectsWaitForPresentTimeSet) { } TEST(FrameMetricsReporter, reportsAllFramesAfterSpecifiedFromFrame) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; std::vector<uint64_t> frameNumbers{0, 1, 10}; @@ -138,7 +139,7 @@ TEST(FrameMetricsReporter, reportsAllFramesAfterSpecifiedFromFrame) { } TEST(FrameMetricsReporter, doesNotReportsFramesBeforeSpecifiedFromFrame) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; std::vector<uint64_t> frameNumbers{1, 10}; @@ -165,7 +166,7 @@ TEST(FrameMetricsReporter, doesNotReportsFramesBeforeSpecifiedFromFrame) { } TEST(FrameMetricsReporter, canRemoveObservers) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; uint64_t frameNumber = 3; int32_t surfaceControlId = 0; @@ -187,7 +188,7 @@ TEST(FrameMetricsReporter, canRemoveObservers) { } TEST(FrameMetricsReporter, canSupportMultipleObservers) { - const int64_t* stats; + FrameInfoBuffer stats; bool hasPresentTime = false; uint64_t frameNumber = 3; int32_t surfaceControlId = 0; diff --git a/libs/hwui/tests/unit/JankTrackerTests.cpp b/libs/hwui/tests/unit/JankTrackerTests.cpp index c289d67fbef6..08718c959150 100644 --- a/libs/hwui/tests/unit/JankTrackerTests.cpp +++ b/libs/hwui/tests/unit/JankTrackerTests.cpp @@ -14,18 +14,19 @@ * limitations under the License. */ -#include <gtest/gtest.h> -#include <gmock/gmock.h> - #include <JankTracker.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> #include <utils/TimeUtils.h> +#include "FrameInfo.h" + using namespace android; using namespace android::uirenderer; class TestFrameMetricsObserver : public FrameMetricsObserver { public: - void notify(const int64_t*) {} + void notify(const FrameInfoBuffer&) override {} }; TEST(JankTracker, noJank) { |