BQ: Modify consumer buffer count interfaces
- Rename setDefaultMaxBufferCount() to setMaxBufferCount(). Modify it
to be hard maximum on the number of buffers that can't be overwritten
by the producer.
- Enforce the maximum buffer count in setMaxAcquiredBufferCount(),
setMaxDequeuedBufferCount(), and setAsyncMode().
- Remove mOverrideMaxBufferCount as it's no longer needed since
overriding is no longer possible.
- Expose setMaxAcquiredBufferCount() in GLConsumer.
- Remove disableAsyncBuffer(), it was only being used for single buffer
mode. Single buffer mode is now achievable with setMaxBufferCount().
Bug 13174928
Change-Id: Ia33799f42751272a711fbd8559f7602ce9f18e4f
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp
index 61878f6..8cc0cfa 100644
--- a/libs/gui/BufferQueueProducer.cpp
+++ b/libs/gui/BufferQueueProducer.cpp
@@ -115,13 +115,20 @@
return BAD_VALUE;
}
+ if (bufferCount > mCore->mMaxBufferCount) {
+ BQ_LOGE("setMaxDequeuedBufferCount: %d dequeued buffers would "
+ "exceed the maxBufferCount (%d) (maxAcquired %d async %d)",
+ maxDequeuedBuffers, mCore->mMaxBufferCount,
+ mCore->mMaxAcquiredBufferCount, mCore->mAsyncMode);
+ return BAD_VALUE;
+ }
+
// Here we are guaranteed that the producer doesn't have any dequeued
// buffers and will release all of its buffer references. We don't
// clear the queue, however, so that currently queued buffers still
// get displayed.
mCore->freeAllBuffersLocked();
mCore->mMaxDequeuedBufferCount = maxDequeuedBuffers;
- mCore->mOverrideMaxBufferCount = true;
mCore->mDequeueCondition.broadcast();
listener = mCore->mConsumerListener;
} // Autolock scope
@@ -156,8 +163,17 @@
}
}
+ if ((mCore->mMaxAcquiredBufferCount + mCore->mMaxDequeuedBufferCount +
+ (async ? 1 : 0)) > mCore->mMaxBufferCount) {
+ BQ_LOGE("setAsyncMode(%d): this call would cause the "
+ "maxBufferCount (%d) to be exceeded (maxAcquired %d "
+ "maxDequeued %d)", async,mCore->mMaxBufferCount,
+ mCore->mMaxAcquiredBufferCount,
+ mCore->mMaxDequeuedBufferCount);
+ return BAD_VALUE;
+ }
+
mCore->mAsyncMode = async;
- mCore->mOverrideMaxBufferCount = true;
mCore->mDequeueCondition.broadcast();
listener = mCore->mConsumerListener;
} // Autolock scope