Skip to content

Commit 8ce652f

Browse files
Anton IvanovAndroid (Google) Code Review
authored andcommitted
Merge "Reduce heap allocations in BLASTBufferQueue." into main
2 parents aedbed0 + 7016de5 commit 8ce652f

3 files changed

Lines changed: 21 additions & 12 deletions

File tree

include/ftl/small_map.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,12 @@ class SmallMap final {
234234
//
235235
bool erase(const key_type& key) { return erase(key, begin()); }
236236

237+
// Removes a mapping.
238+
//
239+
// The last() and end() iterators, as well as those to the erased mapping, are invalidated.
240+
//
241+
void erase(iterator it) { map_.unstable_erase(it); }
242+
237243
// Removes all mappings.
238244
//
239245
// All iterators are invalidated.

libs/gui/BLASTBufferQueue.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,12 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp<Fence
415415
stat.frameEventStats.dequeueReadyTime);
416416
}
417417
auto currFrameNumber = stat.frameEventStats.frameNumber;
418-
std::vector<ReleaseCallbackId> staleReleases;
419-
for (const auto& [key, value]: mSubmitted) {
420-
if (currFrameNumber > key.framenumber) {
421-
staleReleases.push_back(key);
418+
// Release stale buffers.
419+
for (const auto& [key, _] : mSubmitted) {
420+
if (currFrameNumber <= key.framenumber) {
421+
continue; // not stale.
422422
}
423-
}
424-
for (const auto& staleRelease : staleReleases) {
425-
releaseBufferCallbackLocked(staleRelease,
423+
releaseBufferCallbackLocked(key,
426424
stat.previousReleaseFence
427425
? stat.previousReleaseFence
428426
: Fence::NO_FENCE,
@@ -618,7 +616,7 @@ status_t BLASTBufferQueue::acquireNextBufferLocked(
618616
mNumAcquired++;
619617
mLastAcquiredFrameNumber = bufferItem.mFrameNumber;
620618
ReleaseCallbackId releaseCallbackId(buffer->getId(), mLastAcquiredFrameNumber);
621-
mSubmitted[releaseCallbackId] = bufferItem;
619+
mSubmitted.emplace_or_replace(releaseCallbackId, bufferItem);
622620

623621
bool needsDisconnect = false;
624622
mBufferItemConsumer->getConnectionEvents(bufferItem.mFrameNumber, &needsDisconnect);
@@ -851,7 +849,7 @@ void BLASTBufferQueue::onFrameReplaced(const BufferItem& item) {
851849

852850
void BLASTBufferQueue::onFrameDequeued(const uint64_t bufferId) {
853851
std::lock_guard _lock{mTimestampMutex};
854-
mDequeueTimestamps[bufferId] = systemTime();
852+
mDequeueTimestamps.emplace_or_replace(bufferId, systemTime());
855853
};
856854

857855
void BLASTBufferQueue::onFrameCancelled(const uint64_t bufferId) {

libs/gui/include/gui/BLASTBufferQueue.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <optional>
2121
#include <queue>
2222

23+
#include <ftl/small_map.h>
2324
#include <gui/BufferItem.h>
2425
#include <gui/BufferItemConsumer.h>
2526
#include <gui/IGraphicBufferConsumer.h>
@@ -36,6 +37,10 @@
3637

3738
namespace android {
3839

40+
// Sizes determined empirically to avoid allocations during common activity.
41+
constexpr size_t kSubmittedBuffersMapSizeHint = 8;
42+
constexpr size_t kDequeueTimestampsMapSizeHint = 32;
43+
3944
class BLASTBufferQueue;
4045
class BufferItemConsumer;
4146

@@ -206,7 +211,7 @@ class BLASTBufferQueue : public ConsumerBase::FrameAvailableListener {
206211

207212
// Keep a reference to the submitted buffers so we can release when surfaceflinger drops the
208213
// buffer or the buffer has been presented and a new buffer is ready to be presented.
209-
std::unordered_map<ReleaseCallbackId, BufferItem, ReleaseBufferCallbackIdHash> mSubmitted
214+
ftl::SmallMap<ReleaseCallbackId, BufferItem, kSubmittedBuffersMapSizeHint> mSubmitted
210215
GUARDED_BY(mMutex);
211216

212217
// Keep a queue of the released buffers instead of immediately releasing
@@ -291,8 +296,8 @@ class BLASTBufferQueue : public ConsumerBase::FrameAvailableListener {
291296
std::mutex mTimestampMutex;
292297
// Tracks buffer dequeue times by the client. This info is sent to SurfaceFlinger which uses
293298
// it for debugging purposes.
294-
std::unordered_map<uint64_t /* bufferId */, nsecs_t> mDequeueTimestamps
295-
GUARDED_BY(mTimestampMutex);
299+
ftl::SmallMap<uint64_t /* bufferId */, nsecs_t, kDequeueTimestampsMapSizeHint>
300+
mDequeueTimestamps GUARDED_BY(mTimestampMutex);
296301

297302
// Keep track of SurfaceControls that have submitted a transaction and BBQ is waiting on a
298303
// callback for them.

0 commit comments

Comments
 (0)