Change slot generation for BufferState
BufferState layers now do slot generation with buffer death considered
appropriately. When a buffer dies, the slot will be pushed onto a stack
of available slots to be reused at the next opportunity. This should
mimic BufferQueue slot behavior and prevent Composer Resources from
growing too large.
Test: build, boot, manual
Bug: 129351223
Change-Id: Icef9592593cacb0b5c6b12f6679fc2c4dabdcd19
diff --git a/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp b/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
index a941e09..f72862b 100644
--- a/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
@@ -21,60 +21,30 @@
namespace android::compositionengine::impl {
HwcBufferCache::HwcBufferCache() {
- std::fill(std::begin(mBuffers), std::end(mBuffers),
- std::pair<uint64_t, wp<GraphicBuffer>>(0, nullptr));
-}
-bool HwcBufferCache::getSlot(const sp<GraphicBuffer>& buffer, uint32_t* outSlot) {
- // search for cached buffer first
- for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
- // Weak pointers in the cache may have had their object destroyed.
- // Comparisons between weak pointers will accurately reflect this case,
- // but comparisons between weak and strong may not. Thus, we create a weak
- // pointer from strong pointer buffer
- wp<GraphicBuffer> weakCopy(buffer);
- if (mBuffers[i].second == weakCopy) {
- *outSlot = i;
- return true;
- }
- }
-
- // use the least-recently used slot
- *outSlot = getLeastRecentlyUsedSlot();
- return false;
-}
-
-uint32_t HwcBufferCache::getLeastRecentlyUsedSlot() {
- auto iter = std::min_element(std::begin(mBuffers), std::end(mBuffers));
- return std::distance(std::begin(mBuffers), iter);
+ std::fill(std::begin(mBuffers), std::end(mBuffers), wp<GraphicBuffer>(nullptr));
}
void HwcBufferCache::getHwcBuffer(int slot, const sp<GraphicBuffer>& buffer, uint32_t* outSlot,
sp<GraphicBuffer>* outBuffer) {
- // if this slot corresponds to a BufferStateLayer, generate the slot
- if (slot == BufferQueue::INVALID_BUFFER_SLOT) {
- getSlot(buffer, outSlot);
- } else if (slot < 0 || slot >= BufferQueue::NUM_BUFFER_SLOTS) {
+ // default is 0
+ if (slot == BufferQueue::INVALID_BUFFER_SLOT || slot < 0 ||
+ slot >= BufferQueue::NUM_BUFFER_SLOTS) {
*outSlot = 0;
} else {
*outSlot = slot;
}
- auto& [currentCounter, currentBuffer] = mBuffers[*outSlot];
+ auto& currentBuffer = mBuffers[*outSlot];
wp<GraphicBuffer> weakCopy(buffer);
if (currentBuffer == weakCopy) {
// already cached in HWC, skip sending the buffer
*outBuffer = nullptr;
- currentCounter = getCounter();
} else {
*outBuffer = buffer;
// update cache
currentBuffer = buffer;
- currentCounter = getCounter();
}
}
-uint64_t HwcBufferCache::getCounter() {
- return mCounter++;
-}
} // namespace android::compositionengine::impl