diff options
| author | 2025-03-04 11:31:16 -0800 | |
|---|---|---|
| committer | 2025-03-04 11:31:16 -0800 | |
| commit | 9dfcfef009d3950f8a1898e77795603f59ea1385 (patch) | |
| tree | e356246470445c41fc4129446a7d3f125253650c | |
| parent | 1bd65bd06b4951309508a8029a8b3acbfd5d7188 (diff) | |
| parent | 78b8252396fd3b7e5e6c78870b5163fc140c1b17 (diff) | |
Merge "Move RingBuffer from SF utils into libui" into main
| -rw-r--r-- | libs/ui/include/ui/RingBuffer.h (renamed from services/surfaceflinger/Utils/RingBuffer.h) | 6 | ||||
| -rw-r--r-- | libs/ui/tests/Android.bp | 11 | ||||
| -rw-r--r-- | libs/ui/tests/RingBuffer_test.cpp | 70 | ||||
| -rw-r--r-- | services/surfaceflinger/HdrLayerInfoReporter.h | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/PowerAdvisor/PowerAdvisor.cpp | 14 | ||||
| -rw-r--r-- | services/surfaceflinger/PowerAdvisor/PowerAdvisor.h | 26 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h | 4 |
7 files changed, 98 insertions, 37 deletions
diff --git a/services/surfaceflinger/Utils/RingBuffer.h b/libs/ui/include/ui/RingBuffer.h index 215472b388..31d5a950ef 100644 --- a/services/surfaceflinger/Utils/RingBuffer.h +++ b/libs/ui/include/ui/RingBuffer.h @@ -19,7 +19,7 @@ #include <stddef.h> #include <array> -namespace android::utils { +namespace android::ui { template <class T, size_t SIZE> class RingBuffer { @@ -31,8 +31,8 @@ public: ~RingBuffer() = default; constexpr size_t capacity() const { return SIZE; } - size_t size() const { return mCount; } + bool isFull() const { return size() == capacity(); } T& next() { mHead = static_cast<size_t>(mHead + 1) % SIZE; @@ -67,4 +67,4 @@ private: size_t mCount = 0; }; -} // namespace android::utils +} // namespace android::ui diff --git a/libs/ui/tests/Android.bp b/libs/ui/tests/Android.bp index 2d8a1e326c..2b11786df3 100644 --- a/libs/ui/tests/Android.bp +++ b/libs/ui/tests/Android.bp @@ -144,6 +144,17 @@ cc_test { } cc_test { + name: "RingBuffer_test", + test_suites: ["device-tests"], + shared_libs: ["libui"], + srcs: ["RingBuffer_test.cpp"], + cflags: [ + "-Wall", + "-Werror", + ], +} + +cc_test { name: "Size_test", test_suites: ["device-tests"], shared_libs: ["libui"], diff --git a/libs/ui/tests/RingBuffer_test.cpp b/libs/ui/tests/RingBuffer_test.cpp new file mode 100644 index 0000000000..9839492b9f --- /dev/null +++ b/libs/ui/tests/RingBuffer_test.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <gtest/gtest.h> +#include <ui/RingBuffer.h> + +namespace android::ui { + +TEST(RingBuffer, basic) { + RingBuffer<int, 5> rb; + + rb.next() = 1; + ASSERT_EQ(1, rb.size()); + ASSERT_EQ(1, rb.back()); + ASSERT_EQ(1, rb.front()); + + rb.next() = 2; + ASSERT_EQ(2, rb.size()); + ASSERT_EQ(2, rb.back()); + ASSERT_EQ(1, rb.front()); + ASSERT_EQ(1, rb[-1]); + + rb.next() = 3; + ASSERT_EQ(3, rb.size()); + ASSERT_EQ(3, rb.back()); + ASSERT_EQ(1, rb.front()); + ASSERT_EQ(2, rb[-1]); + ASSERT_EQ(1, rb[-2]); + + rb.next() = 4; + ASSERT_EQ(4, rb.size()); + ASSERT_EQ(4, rb.back()); + ASSERT_EQ(1, rb.front()); + ASSERT_EQ(3, rb[-1]); + ASSERT_EQ(2, rb[-2]); + ASSERT_EQ(1, rb[-3]); + + rb.next() = 5; + ASSERT_EQ(5, rb.size()); + ASSERT_EQ(5, rb.back()); + ASSERT_EQ(1, rb.front()); + ASSERT_EQ(4, rb[-1]); + ASSERT_EQ(3, rb[-2]); + ASSERT_EQ(2, rb[-3]); + ASSERT_EQ(1, rb[-4]); + + rb.next() = 6; + ASSERT_EQ(5, rb.size()); + ASSERT_EQ(6, rb.back()); + ASSERT_EQ(2, rb.front()); + ASSERT_EQ(5, rb[-1]); + ASSERT_EQ(4, rb[-2]); + ASSERT_EQ(3, rb[-3]); + ASSERT_EQ(2, rb[-4]); +} + +} // namespace android::ui
\ No newline at end of file diff --git a/services/surfaceflinger/HdrLayerInfoReporter.h b/services/surfaceflinger/HdrLayerInfoReporter.h index 614f33fbce..758b111e41 100644 --- a/services/surfaceflinger/HdrLayerInfoReporter.h +++ b/services/surfaceflinger/HdrLayerInfoReporter.h @@ -19,11 +19,11 @@ #include <android-base/thread_annotations.h> #include <android/gui/IHdrLayerInfoListener.h> #include <binder/IBinder.h> +#include <ui/RingBuffer.h> #include <utils/Timers.h> #include <unordered_map> -#include "Utils/RingBuffer.h" #include "WpHash.h" namespace android { @@ -102,7 +102,7 @@ private: EventHistoryEntry(const HdrLayerInfo& info) : info(info) { timestamp = systemTime(); } }; - utils::RingBuffer<EventHistoryEntry, 32> mHdrInfoHistory; + ui::RingBuffer<EventHistoryEntry, 32> mHdrInfoHistory; }; } // namespace android
\ No newline at end of file diff --git a/services/surfaceflinger/PowerAdvisor/PowerAdvisor.cpp b/services/surfaceflinger/PowerAdvisor/PowerAdvisor.cpp index cd7210c627..788448d079 100644 --- a/services/surfaceflinger/PowerAdvisor/PowerAdvisor.cpp +++ b/services/surfaceflinger/PowerAdvisor/PowerAdvisor.cpp @@ -515,7 +515,7 @@ void PowerAdvisor::setRequiresRenderEngine(DisplayId displayId, bool requiresRen } void PowerAdvisor::setExpectedPresentTime(TimePoint expectedPresentTime) { - mExpectedPresentTimes.append(expectedPresentTime); + mExpectedPresentTimes.next() = expectedPresentTime; } void PowerAdvisor::setSfPresentTiming(TimePoint presentFenceTime, TimePoint presentEndTime) { @@ -532,7 +532,7 @@ void PowerAdvisor::setHwcPresentDelayedTime(DisplayId displayId, TimePoint earli } void PowerAdvisor::setCommitStart(TimePoint commitStartTime) { - mCommitStartTimes.append(commitStartTime); + mCommitStartTimes.next() = commitStartTime; } void PowerAdvisor::setCompositeEnd(TimePoint compositeEndTime) { @@ -579,7 +579,7 @@ std::optional<hal::WorkDuration> PowerAdvisor::estimateWorkDuration() { } // Tracks when we finish presenting to hwc - TimePoint estimatedHwcEndTime = mCommitStartTimes[0]; + TimePoint estimatedHwcEndTime = mCommitStartTimes.back(); // How long we spent this frame not doing anything, waiting for fences or vsync Duration idleDuration = 0ns; @@ -643,13 +643,13 @@ std::optional<hal::WorkDuration> PowerAdvisor::estimateWorkDuration() { // Also add the frame delay duration since the target did not move while we were delayed Duration totalDuration = mFrameDelayDuration + std::max(estimatedHwcEndTime, estimatedGpuEndTime.value_or(TimePoint{0ns})) - - mCommitStartTimes[0]; + mCommitStartTimes.back(); Duration totalDurationWithoutGpu = - mFrameDelayDuration + estimatedHwcEndTime - mCommitStartTimes[0]; + mFrameDelayDuration + estimatedHwcEndTime - mCommitStartTimes.back(); // We finish SurfaceFlinger when post-composition finishes, so add that in here Duration flingerDuration = - estimatedFlingerEndTime + mLastPostcompDuration - mCommitStartTimes[0]; + estimatedFlingerEndTime + mLastPostcompDuration - mCommitStartTimes.back(); Duration estimatedGpuDuration = firstGpuTimeline.has_value() ? estimatedGpuEndTime.value_or(TimePoint{0ns}) - firstGpuTimeline->startTime : Duration::fromNs(0); @@ -661,7 +661,7 @@ std::optional<hal::WorkDuration> PowerAdvisor::estimateWorkDuration() { hal::WorkDuration duration{ .timeStampNanos = TimePoint::now().ns(), .durationNanos = combinedDuration.ns(), - .workPeriodStartTimestampNanos = mCommitStartTimes[0].ns(), + .workPeriodStartTimestampNanos = mCommitStartTimes.back().ns(), .cpuDurationNanos = supportsGpuReporting() ? cpuDuration.ns() : 0, .gpuDurationNanos = supportsGpuReporting() ? estimatedGpuDuration.ns() : 0, }; diff --git a/services/surfaceflinger/PowerAdvisor/PowerAdvisor.h b/services/surfaceflinger/PowerAdvisor/PowerAdvisor.h index 540a9df2ca..b97160a3e5 100644 --- a/services/surfaceflinger/PowerAdvisor/PowerAdvisor.h +++ b/services/surfaceflinger/PowerAdvisor/PowerAdvisor.h @@ -23,6 +23,7 @@ #include <ui/DisplayId.h> #include <ui/FenceTime.h> +#include <ui/RingBuffer.h> #include <utils/Mutex.h> // FMQ library in IPower does questionable conversions @@ -247,27 +248,6 @@ private: std::optional<GpuTimeline> estimateGpuTiming(std::optional<TimePoint> previousEndTime); }; - template <class T, size_t N> - class RingBuffer { - std::array<T, N> elements = {}; - size_t mIndex = 0; - size_t numElements = 0; - - public: - void append(T item) { - mIndex = (mIndex + 1) % N; - numElements = std::min(N, numElements + 1); - elements[mIndex] = item; - } - bool isFull() const { return numElements == N; } - // Allows access like [0] == current, [-1] = previous, etc.. - T& operator[](int offset) { - size_t positiveOffset = - static_cast<size_t>((offset % static_cast<int>(N)) + static_cast<int>(N)); - return elements[(mIndex + positiveOffset) % N]; - } - }; - // Filter and sort the display ids by a given property std::vector<DisplayId> getOrderedDisplayIds( std::optional<TimePoint> DisplayTimingData::*sortBy); @@ -287,9 +267,9 @@ private: // Last frame's post-composition duration Duration mLastPostcompDuration{0ns}; // Buffer of recent commit start times - RingBuffer<TimePoint, 2> mCommitStartTimes; + ui::RingBuffer<TimePoint, 2> mCommitStartTimes; // Buffer of recent expected present times - RingBuffer<TimePoint, 2> mExpectedPresentTimes; + ui::RingBuffer<TimePoint, 2> mExpectedPresentTimes; // Most recent present fence time, provided by SF after composition engine finishes presenting TimePoint mLastPresentFenceTime; // Most recent composition engine present end time, returned with the present fence from SF diff --git a/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h b/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h index 813d4dedff..ff461d2d85 100644 --- a/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +++ b/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h @@ -24,6 +24,7 @@ #include <ui/DisplayId.h> #include <ui/Fence.h> #include <ui/FenceTime.h> +#include <ui/RingBuffer.h> #include <scheduler/Features.h> #include <scheduler/FrameTime.h> @@ -34,7 +35,6 @@ // TODO(b/185536303): Pull to FTL. #include "../../../TracedOrdinal.h" #include "../../../Utils/Dumper.h" -#include "../../../Utils/RingBuffer.h" namespace android::scheduler { @@ -108,7 +108,7 @@ protected: std::pair<bool /* wouldBackpressure */, PresentFence> expectedSignaledPresentFence( Period vsyncPeriod, Period minFramePeriod) const; std::array<PresentFence, 2> mPresentFencesLegacy; - utils::RingBuffer<PresentFence, 5> mPresentFences; + ui::RingBuffer<PresentFence, 5> mPresentFences; FrameTime mLastSignaledFrameTime; |