summaryrefslogtreecommitdiff
path: root/libs/gui/BLASTBufferQueue.cpp
diff options
context:
space:
mode:
author chaviw <chaviw@google.com> 2022-01-05 18:36:46 -0600
committer chaviw <chaviw@google.com> 2022-01-05 19:24:40 -0600
commit8dd181f3e8274bf89ebde94c1c7d57c9c83b0a49 (patch)
tree738f6dcff20f12f2a985e1811fe58515266e2627 /libs/gui/BLASTBufferQueue.cpp
parent38e78ac1e8d5006248f209fa7796faeea8feca66 (diff)
Replace releaseCallbackId with generateReleaseCallbackId in BufferData
releaseCallbackId was confusing data in BufferData because it wasn't being parceled, even though the rest of the object was. This is because the ReleaseCallbackId can be generated from info in BufferData. Therefore, remove releaseCallbackId and instead replace with a function that generates the ReleaseCallbackId This fixes an issue when Transactions that contained buffers for the same layer were being merged. The merge was expected to release the old buffer. However, if the Transaction was parceled before it was merged, the ReleaseCallbackId would be lost and the release callback would send an invalid callback id, resulting in a lost buffer that never got released. By using generateReleaseCallbackId, the callback id is recreated when the release callback needs to be invoked since the buffer and framenumber are already being parceled. Test: ReleaseBufferCallbackTest Test: AppConfigurationTests Bug: 209920544 Change-Id: I2a24b8a9764959173c960048dc82e68f4c083898
Diffstat (limited to 'libs/gui/BLASTBufferQueue.cpp')
-rw-r--r--libs/gui/BLASTBufferQueue.cpp5
1 files changed, 2 insertions, 3 deletions
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp
index 34faf87546..a726fee66d 100644
--- a/libs/gui/BLASTBufferQueue.cpp
+++ b/libs/gui/BLASTBufferQueue.cpp
@@ -507,8 +507,7 @@ void BLASTBufferQueue::acquireNextBufferLocked(
std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
sp<Fence> fence = bufferItem.mFence ? new Fence(bufferItem.mFence->dup()) : Fence::NO_FENCE;
- t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, releaseCallbackId,
- releaseBufferCallback);
+ t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, releaseBufferCallback);
t->setDataspace(mSurfaceControl, static_cast<ui::Dataspace>(bufferItem.mDataSpace));
t->setHdrMetadata(mSurfaceControl, bufferItem.mHdrMetadata);
t->setSurfaceDamageRegion(mSurfaceControl, bufferItem.mSurfaceDamage);
@@ -622,7 +621,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) {
if (bufferData) {
BQA_LOGD("Releasing previous buffer when syncing: framenumber=%" PRIu64,
bufferData->frameNumber);
- releaseBuffer(bufferData->releaseCallbackId, bufferData->acquireFence);
+ releaseBuffer(bufferData->generateReleaseCallbackId(), bufferData->acquireFence);
// Because we just released a buffer, we know there's no need to wait for a free
// buffer.
mayNeedToWaitForBuffer = false;