libgui: Allow for pending releases in GLConsumer
Adds the ability for GLConsumer to record a pending release instead of
releasing the buffer immediately. This will be used by SurfaceFlinger
to latch a new buffer without having to immediately release the old
one, since it needs to get a fence from HWC before releasing.
Change-Id: I8cc3ce7d5ff80e2ea4b4d681b028db042352d229
diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp
index e1abd45..70c3dfa 100644
--- a/libs/gui/GLConsumer.cpp
+++ b/libs/gui/GLConsumer.cpp
@@ -370,7 +370,8 @@
return err;
}
-status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item)
+status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item,
+ PendingRelease* pendingRelease)
{
status_t err = NO_ERROR;
@@ -432,14 +433,23 @@
// release old buffer
if (mCurrentTexture != BufferQueue::INVALID_BUFFER_SLOT) {
- status_t status = releaseBufferLocked(
- mCurrentTexture, mCurrentTextureImage->graphicBuffer(),
- mEglDisplay, mEglSlots[mCurrentTexture].mEglFence);
- if (status < NO_ERROR) {
- GLC_LOGE("updateAndRelease: failed to release buffer: %s (%d)",
- strerror(-status), status);
- err = status;
- // keep going, with error raised [?]
+ if (pendingRelease == nullptr) {
+ status_t status = releaseBufferLocked(
+ mCurrentTexture, mCurrentTextureImage->graphicBuffer(),
+ mEglDisplay, mEglSlots[mCurrentTexture].mEglFence);
+ if (status < NO_ERROR) {
+ GLC_LOGE("updateAndRelease: failed to release buffer: %s (%d)",
+ strerror(-status), status);
+ err = status;
+ // keep going, with error raised [?]
+ }
+ } else {
+ pendingRelease->currentTexture = mCurrentTexture;
+ pendingRelease->graphicBuffer =
+ mCurrentTextureImage->graphicBuffer();
+ pendingRelease->display = mEglDisplay;
+ pendingRelease->fence = mEglSlots[mCurrentTexture].mEglFence;
+ pendingRelease->isPending = true;
}
}