All consumers now take an IGraphicBufferConsumer instead of a BufferQueue
this means they only have access to the consumer end of
the interface. we had a lot of code that assumed consumers
where holding a BufferQueue (i.e.: both ends), so most of
this change is untangling in fix that
Bug: 9265647
Change-Id: Ic2e2596ee14c7535f51bf26d9a897a0fc036d22c
diff --git a/libs/gui/BufferItemConsumer.cpp b/libs/gui/BufferItemConsumer.cpp
index 0f818b7..350887a 100644
--- a/libs/gui/BufferItemConsumer.cpp
+++ b/libs/gui/BufferItemConsumer.cpp
@@ -33,8 +33,8 @@
uint32_t consumerUsage, int bufferCount, bool controlledByApp) :
ConsumerBase(bq, controlledByApp)
{
- mBufferQueue->setConsumerUsageBits(consumerUsage);
- mBufferQueue->setMaxAcquiredBufferCount(bufferCount);
+ mConsumer->setConsumerUsageBits(consumerUsage);
+ mConsumer->setMaxAcquiredBufferCount(bufferCount);
}
BufferItemConsumer::~BufferItemConsumer() {
@@ -43,7 +43,7 @@
void BufferItemConsumer::setName(const String8& name) {
Mutex::Autolock _l(mMutex);
mName = name;
- mBufferQueue->setConsumerName(name);
+ mConsumer->setConsumerName(name);
}
status_t BufferItemConsumer::acquireBuffer(BufferItem *item,
@@ -95,12 +95,12 @@
status_t BufferItemConsumer::setDefaultBufferSize(uint32_t w, uint32_t h) {
Mutex::Autolock _l(mMutex);
- return mBufferQueue->setDefaultBufferSize(w, h);
+ return mConsumer->setDefaultBufferSize(w, h);
}
status_t BufferItemConsumer::setDefaultBufferFormat(uint32_t defaultFormat) {
Mutex::Autolock _l(mMutex);
- return mBufferQueue->setDefaultBufferFormat(defaultFormat);
+ return mConsumer->setDefaultBufferFormat(defaultFormat);
}
} // namespace android
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp
index 07c2d94..033c2a6 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -720,10 +720,6 @@
return err;
}
-void BufferQueue::dump(String8& result) const {
- BufferQueue::dump(result, "");
-}
-
void BufferQueue::dump(String8& result, const char* prefix) const {
Mutex::Autolock _l(mMutex);
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp
index d748786..c4ec857 100644
--- a/libs/gui/ConsumerBase.cpp
+++ b/libs/gui/ConsumerBase.cpp
@@ -51,9 +51,9 @@
return android_atomic_inc(&globalCounter);
}
-ConsumerBase::ConsumerBase(const sp<BufferQueue>& bufferQueue, bool controlledByApp) :
+ConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQueue, bool controlledByApp) :
mAbandoned(false),
- mBufferQueue(bufferQueue) {
+ mConsumer(bufferQueue) {
// Choose a name using the PID and a process-unique ID.
mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());
@@ -64,12 +64,12 @@
wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this);
sp<IConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener);
- status_t err = mBufferQueue->consumerConnect(proxy, controlledByApp);
+ status_t err = mConsumer->consumerConnect(proxy, controlledByApp);
if (err != NO_ERROR) {
CB_LOGE("ConsumerBase: error connecting to BufferQueue: %s (%d)",
strerror(-err), err);
} else {
- mBufferQueue->setConsumerName(mName);
+ mConsumer->setConsumerName(mName);
}
}
@@ -96,12 +96,6 @@
mSlots[slotIndex].mFrameNumber = 0;
}
-// Used for refactoring, should not be in final interface
-sp<BufferQueue> ConsumerBase::getBufferQueue() const {
- Mutex::Autolock lock(mMutex);
- return mBufferQueue;
-}
-
void ConsumerBase::onFrameAvailable() {
CB_LOGV("onFrameAvailable");
@@ -128,7 +122,7 @@
}
uint32_t mask = 0;
- mBufferQueue->getReleasedBuffers(&mask);
+ mConsumer->getReleasedBuffers(&mask);
for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
if (mask & (1 << i)) {
freeBufferLocked(i);
@@ -152,8 +146,8 @@
freeBufferLocked(i);
}
// disconnect from the BufferQueue
- mBufferQueue->consumerDisconnect();
- mBufferQueue.clear();
+ mConsumer->consumerDisconnect();
+ mConsumer.clear();
}
void ConsumerBase::setFrameAvailableListener(
@@ -176,13 +170,13 @@
result.appendFormat("%smAbandoned=%d\n", prefix, int(mAbandoned));
if (!mAbandoned) {
- mBufferQueue->dump(result, prefix);
+ mConsumer->dump(result, prefix);
}
}
status_t ConsumerBase::acquireBufferLocked(BufferQueue::BufferItem *item,
nsecs_t presentWhen) {
- status_t err = mBufferQueue->acquireBuffer(item, presentWhen);
+ status_t err = mConsumer->acquireBuffer(item, presentWhen);
if (err != NO_ERROR) {
return err;
}
@@ -247,7 +241,7 @@
CB_LOGV("releaseBufferLocked: slot=%d/%llu",
slot, mSlots[slot].mFrameNumber);
- status_t err = mBufferQueue->releaseBuffer(slot, mSlots[slot].mFrameNumber,
+ status_t err = mConsumer->releaseBuffer(slot, mSlots[slot].mFrameNumber,
display, eglFence, mSlots[slot].mFence);
if (err == BufferQueue::STALE_BUFFER_SLOT) {
freeBufferLocked(slot);
diff --git a/libs/gui/CpuConsumer.cpp b/libs/gui/CpuConsumer.cpp
index b8c00af..3db46bc 100644
--- a/libs/gui/CpuConsumer.cpp
+++ b/libs/gui/CpuConsumer.cpp
@@ -30,7 +30,7 @@
namespace android {
-CpuConsumer::CpuConsumer(const sp<BufferQueue>& bq,
+CpuConsumer::CpuConsumer(const sp<IGraphicBufferConsumer>& bq,
uint32_t maxLockedBuffers, bool controlledByApp) :
ConsumerBase(bq, controlledByApp),
mMaxLockedBuffers(maxLockedBuffers),
@@ -39,8 +39,8 @@
// Create tracking entries for locked buffers
mAcquiredBuffers.insertAt(0, maxLockedBuffers);
- mBufferQueue->setConsumerUsageBits(GRALLOC_USAGE_SW_READ_OFTEN);
- mBufferQueue->setMaxAcquiredBufferCount(maxLockedBuffers);
+ mConsumer->setConsumerUsageBits(GRALLOC_USAGE_SW_READ_OFTEN);
+ mConsumer->setMaxAcquiredBufferCount(maxLockedBuffers);
}
CpuConsumer::~CpuConsumer() {
@@ -52,19 +52,19 @@
void CpuConsumer::setName(const String8& name) {
Mutex::Autolock _l(mMutex);
mName = name;
- mBufferQueue->setConsumerName(name);
+ mConsumer->setConsumerName(name);
}
status_t CpuConsumer::setDefaultBufferSize(uint32_t width, uint32_t height)
{
Mutex::Autolock _l(mMutex);
- return mBufferQueue->setDefaultBufferSize(width, height);
+ return mConsumer->setDefaultBufferSize(width, height);
}
status_t CpuConsumer::setDefaultBufferFormat(uint32_t defaultFormat)
{
Mutex::Autolock _l(mMutex);
- return mBufferQueue->setDefaultBufferFormat(defaultFormat);
+ return mConsumer->setDefaultBufferFormat(defaultFormat);
}
status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp
index b8a3d28..363e25a 100644
--- a/libs/gui/GLConsumer.cpp
+++ b/libs/gui/GLConsumer.cpp
@@ -85,7 +85,7 @@
static void mtxMul(float out[16], const float a[16], const float b[16]);
-GLConsumer::GLConsumer(const sp<BufferQueue>& bq, GLuint tex,
+GLConsumer::GLConsumer(const sp<IGraphicBufferConsumer>& bq, GLuint tex,
GLenum texTarget, bool useFenceSync, bool isControlledByApp) :
ConsumerBase(bq, isControlledByApp),
mCurrentTransform(0),
@@ -108,12 +108,12 @@
memcpy(mCurrentTransformMatrix, mtxIdentity,
sizeof(mCurrentTransformMatrix));
- mBufferQueue->setConsumerUsageBits(DEFAULT_USAGE_FLAGS);
+ mConsumer->setConsumerUsageBits(DEFAULT_USAGE_FLAGS);
}
status_t GLConsumer::setDefaultMaxBufferCount(int bufferCount) {
Mutex::Autolock lock(mMutex);
- return mBufferQueue->setDefaultMaxBufferCount(bufferCount);
+ return mConsumer->setDefaultMaxBufferCount(bufferCount);
}
@@ -122,7 +122,7 @@
Mutex::Autolock lock(mMutex);
mDefaultWidth = w;
mDefaultHeight = h;
- return mBufferQueue->setDefaultBufferSize(w, h);
+ return mConsumer->setDefaultBufferSize(w, h);
}
status_t GLConsumer::updateTexImage() {
@@ -946,23 +946,23 @@
void GLConsumer::setName(const String8& name) {
Mutex::Autolock _l(mMutex);
mName = name;
- mBufferQueue->setConsumerName(name);
+ mConsumer->setConsumerName(name);
}
status_t GLConsumer::setDefaultBufferFormat(uint32_t defaultFormat) {
Mutex::Autolock lock(mMutex);
- return mBufferQueue->setDefaultBufferFormat(defaultFormat);
+ return mConsumer->setDefaultBufferFormat(defaultFormat);
}
status_t GLConsumer::setConsumerUsageBits(uint32_t usage) {
Mutex::Autolock lock(mMutex);
usage |= DEFAULT_USAGE_FLAGS;
- return mBufferQueue->setConsumerUsageBits(usage);
+ return mConsumer->setConsumerUsageBits(usage);
}
status_t GLConsumer::setTransformHint(uint32_t hint) {
Mutex::Autolock lock(mMutex);
- return mBufferQueue->setTransformHint(hint);
+ return mConsumer->setTransformHint(hint);
}
void GLConsumer::dumpLocked(String8& result, const char* prefix) const
diff --git a/libs/gui/IGraphicBufferConsumer.cpp b/libs/gui/IGraphicBufferConsumer.cpp
index 5263281..6d65016 100644
--- a/libs/gui/IGraphicBufferConsumer.cpp
+++ b/libs/gui/IGraphicBufferConsumer.cpp
@@ -186,7 +186,8 @@
SET_CONSUMER_NAME,
SET_DEFAULT_BUFFER_FORMAT,
SET_CONSUMER_USAGE_BITS,
- SET_TRANSFORM_HINT
+ SET_TRANSFORM_HINT,
+ DUMP,
};
@@ -344,6 +345,15 @@
}
return reply.readInt32();
}
+
+ virtual void dump(String8& result, const char* prefix) const {
+ Parcel data, reply;
+ data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
+ data.writeString8(result);
+ data.writeString8(String8(prefix ? prefix : ""));
+ remote()->transact(DUMP, data, &reply);
+ reply.readString8();
+ }
};
IMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer");
@@ -452,6 +462,14 @@
reply->writeInt32(result);
return NO_ERROR;
} break;
+ case DUMP: {
+ CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
+ String8 result = data.readString8();
+ String8 prefix = data.readString8();
+ static_cast<IGraphicBufferConsumer*>(this)->dump(result, prefix);
+ reply->writeString8(result);
+ return NO_ERROR;
+ }
}
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index bad4138..048553c 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -633,8 +633,8 @@
sp<CpuConsumer> ScreenshotClient::getCpuConsumer() const {
if (mCpuConsumer == NULL) {
- sp<BufferQueue> bq = new BufferQueue();
- mCpuConsumer = new CpuConsumer(bq, 1);
+ mBufferQueue = new BufferQueue();
+ mCpuConsumer = new CpuConsumer(mBufferQueue, 1);
mCpuConsumer->setName(String8("ScreenshotClient"));
}
return mCpuConsumer;
@@ -653,7 +653,7 @@
mHaveBuffer = false;
}
- status_t err = s->captureScreen(display, cpuConsumer->getBufferQueue(),
+ status_t err = s->captureScreen(display, mBufferQueue,
reqWidth, reqHeight, minLayerZ, maxLayerZ, true);
if (err == NO_ERROR) {
diff --git a/libs/gui/tests/CpuConsumer_test.cpp b/libs/gui/tests/CpuConsumer_test.cpp
index f8a35b4..afbc026 100644
--- a/libs/gui/tests/CpuConsumer_test.cpp
+++ b/libs/gui/tests/CpuConsumer_test.cpp
@@ -70,7 +70,7 @@
mCC = new CpuConsumer(bq, params.maxLockedBuffers);
String8 name("CpuConsumer_Under_Test");
mCC->setName(name);
- mSTC = new Surface(mCC->getProducerInterface());
+ mSTC = new Surface(bq);
mANW = mSTC;
}
diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp
index 1de9c27..459b001 100644
--- a/libs/gui/tests/SurfaceTextureClient_test.cpp
+++ b/libs/gui/tests/SurfaceTextureClient_test.cpp
@@ -42,7 +42,7 @@
sp<BufferQueue> bq = new BufferQueue();
mST = new GLConsumer(bq, 123);
- mSTC = new Surface(mST->getBufferQueue());
+ mSTC = new Surface(bq);
mANW = mSTC;
// We need a valid GL context so we can test updateTexImage()
@@ -710,7 +710,7 @@
for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
sp<BufferQueue> bq = new BufferQueue();
sp<GLConsumer> st(new GLConsumer(bq, i));
- sp<Surface> stc(new Surface(st->getBufferQueue()));
+ sp<Surface> stc(new Surface(bq));
mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
static_cast<ANativeWindow*>(stc.get()), NULL);
ASSERT_EQ(EGL_SUCCESS, eglGetError());
diff --git a/libs/gui/tests/SurfaceTexture_test.cpp b/libs/gui/tests/SurfaceTexture_test.cpp
index ae223c6..05b0b67 100644
--- a/libs/gui/tests/SurfaceTexture_test.cpp
+++ b/libs/gui/tests/SurfaceTexture_test.cpp
@@ -387,7 +387,7 @@
GLTest::SetUp();
sp<BufferQueue> bq = new BufferQueue();
mGlConsumer = new GLConsumer(bq, TEX_ID);
- mSurface = new Surface(mGlConsumer->getBufferQueue());
+ mSurface = new Surface(bq);
mANW = mSurface.get();
}
@@ -481,8 +481,9 @@
virtual void SetUp() {
GLTest::SetUp();
sp<BufferQueue> bq = new BufferQueue();
+ mBQ = bq;
mST = new GLConsumer(bq, TEX_ID);
- mSTC = new Surface(mST->getBufferQueue());
+ mSTC = new Surface(bq);
mANW = mSTC;
mTextureRenderer = new TextureRenderer(TEX_ID, mST);
ASSERT_NO_FATAL_FAILURE(mTextureRenderer->SetUp());
@@ -672,6 +673,7 @@
Condition mFrameCondition;
};
+ sp<BufferQueue> mBQ;
sp<GLConsumer> mST;
sp<Surface> mSTC;
sp<ANativeWindow> mANW;
@@ -1211,7 +1213,7 @@
};
sp<DisconnectWaiter> dw(new DisconnectWaiter());
- mST->getBufferQueue()->consumerConnect(dw, false);
+ mBQ->consumerConnect(dw, false);
sp<Thread> pt(new ProducerThread(mANW));
diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp
index bcdbedb..0440c4c 100644
--- a/libs/gui/tests/Surface_test.cpp
+++ b/libs/gui/tests/Surface_test.cpp
@@ -92,7 +92,7 @@
sp<CpuConsumer> consumer = new CpuConsumer(bq, 1);
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
- ASSERT_EQ(NO_ERROR, sf->captureScreen(display, consumer->getBufferQueue(),
+ ASSERT_EQ(NO_ERROR, sf->captureScreen(display, bq,
64, 64, 0, 0x7fffffff, true));
// Set the PROTECTED usage bit and verify that the screenshot fails. Note
@@ -121,7 +121,7 @@
&buf));
ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1));
}
- ASSERT_EQ(NO_ERROR, sf->captureScreen(display, consumer->getBufferQueue(),
+ ASSERT_EQ(NO_ERROR, sf->captureScreen(display, bq,
64, 64, 0, 0x7fffffff, true));
}