BufferQueue: Increase max slots from 32 to 64
Increases NUM_BUFFER_SLOTS from 32 to 64 and changes the mask
returned by IGBC::getReleasedBuffers from 32 to 64 bits.
Bug: 13174352
Change-Id: Ie8ef0853916cfb91f83881c7241886bb1950f01a
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp
index 782afcc..34fd733 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -158,7 +158,7 @@
return mConsumer->disconnect();
}
-status_t BufferQueue::getReleasedBuffers(uint32_t* slotMask) {
+status_t BufferQueue::getReleasedBuffers(uint64_t* slotMask) {
return mConsumer->getReleasedBuffers(slotMask);
}
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp
index 756cd61..985dcaa 100644
--- a/libs/gui/BufferQueueConsumer.cpp
+++ b/libs/gui/BufferQueueConsumer.cpp
@@ -346,7 +346,7 @@
return NO_ERROR;
}
-status_t BufferQueueConsumer::getReleasedBuffers(uint32_t *outSlotMask) {
+status_t BufferQueueConsumer::getReleasedBuffers(uint64_t *outSlotMask) {
ATRACE_CALL();
if (outSlotMask == NULL) {
@@ -361,10 +361,10 @@
return NO_INIT;
}
- uint32_t mask = 0;
+ uint64_t mask = 0;
for (int s = 0; s < BufferQueueDefs::NUM_BUFFER_SLOTS; ++s) {
if (!mSlots[s].mAcquireCalled) {
- mask |= (1u << s);
+ mask |= (1ULL << s);
}
}
@@ -374,12 +374,12 @@
BufferQueueCore::Fifo::iterator current(mCore->mQueue.begin());
while (current != mCore->mQueue.end()) {
if (current->mAcquireCalled) {
- mask &= ~(1u << current->mSlot);
+ mask &= ~(1ULL << current->mSlot);
}
++current;
}
- BQ_LOGV("getReleasedBuffers: returning mask %#x", mask);
+ BQ_LOGV("getReleasedBuffers: returning mask %#" PRIx64, mask);
*outSlotMask = mask;
return NO_ERROR;
}
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp
index b6adc54..f1b8fa8 100644
--- a/libs/gui/ConsumerBase.cpp
+++ b/libs/gui/ConsumerBase.cpp
@@ -121,10 +121,10 @@
return;
}
- uint32_t mask = 0;
+ uint64_t mask = 0;
mConsumer->getReleasedBuffers(&mask);
for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
- if (mask & (1 << i)) {
+ if (mask & (1ULL << i)) {
freeBufferLocked(i);
}
}
diff --git a/libs/gui/IGraphicBufferConsumer.cpp b/libs/gui/IGraphicBufferConsumer.cpp
index 1b19626..ab644de 100644
--- a/libs/gui/IGraphicBufferConsumer.cpp
+++ b/libs/gui/IGraphicBufferConsumer.cpp
@@ -298,14 +298,18 @@
return reply.readInt32();
}
- virtual status_t getReleasedBuffers(uint32_t* slotMask) {
+ virtual status_t getReleasedBuffers(uint64_t* slotMask) {
Parcel data, reply;
+ if (slotMask == NULL) {
+ ALOGE("getReleasedBuffers: slotMask must not be NULL");
+ return BAD_VALUE;
+ }
data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply);
if (result != NO_ERROR) {
return result;
}
- *slotMask = reply.readInt32();
+ *slotMask = reply.readInt64();
return reply.readInt32();
}
@@ -480,9 +484,9 @@
} break;
case GET_RELEASED_BUFFERS: {
CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
- uint32_t slotMask;
+ uint64_t slotMask;
status_t result = getReleasedBuffers(&slotMask);
- reply->writeInt32(slotMask);
+ reply->writeInt64(slotMask);
reply->writeInt32(result);
return NO_ERROR;
} break;