Caching between SF and HWC for BufferStateLayers
Bug: 120434937
Test: build, boot,libcompositionengine_test
Change-Id: I4a99faeb7aa88683aac19c7000db87bd75f9ebe9
diff --git a/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp b/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
index 6f340b9..8177c7f 100644
--- a/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/HwcBufferCache.cpp
@@ -21,31 +21,45 @@
namespace android::compositionengine::impl {
HwcBufferCache::HwcBufferCache() {
- mBuffers.reserve(BufferQueue::NUM_BUFFER_SLOTS);
+ std::fill(std::begin(mBuffers), std::end(mBuffers),
+ std::pair<uint64_t, wp<GraphicBuffer>>(0, nullptr));
+}
+int HwcBufferCache::getSlot(const sp<GraphicBuffer>& buffer) {
+ // search for cached buffer first
+ for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
+ if (mBuffers[i].second == buffer) {
+ return i;
+ }
+ }
+
+ // use the least-recently used slot
+ return getLeastRecentlyUsedSlot();
}
-void HwcBufferCache::getHwcBuffer(int slot, const sp<GraphicBuffer>& buffer, uint32_t* outSlot,
+int HwcBufferCache::getLeastRecentlyUsedSlot() {
+ auto iter = std::min_element(std::begin(mBuffers), std::end(mBuffers));
+ return std::distance(std::begin(mBuffers), iter);
+}
+
+void HwcBufferCache::getHwcBuffer(const sp<GraphicBuffer>& buffer, uint32_t* outSlot,
sp<GraphicBuffer>* outBuffer) {
- if (slot == BufferQueue::INVALID_BUFFER_SLOT || slot < 0) {
- // default to slot 0
- slot = 0;
- }
+ *outSlot = getSlot(buffer);
- if (static_cast<size_t>(slot) >= mBuffers.size()) {
- mBuffers.resize(slot + 1);
- }
-
- *outSlot = slot;
-
- if (mBuffers[slot] == buffer) {
+ auto& [currentCounter, currentBuffer] = mBuffers[*outSlot];
+ if (currentBuffer == buffer) {
// already cached in HWC, skip sending the buffer
*outBuffer = nullptr;
+ currentCounter = getCounter();
} else {
*outBuffer = buffer;
// update cache
- mBuffers[slot] = buffer;
+ currentBuffer = buffer;
+ currentCounter = getCounter();
}
}
+uint64_t HwcBufferCache::getCounter() {
+ return mCounter++;
+}
} // namespace android::compositionengine::impl