diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index 14f20d716..02d26c1c7 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -38,7 +38,7 @@ public: enum { NUM_BUFFER_SLOTS = 32 }; enum { NO_CONNECTED_API = 0 }; enum { INVALID_BUFFER_SLOT = -1 }; - enum { STALE_BUFFER_SLOT = 1 }; + enum { STALE_BUFFER_SLOT = 1, NO_BUFFER_AVAILABLE }; // ConsumerListener is the interface through which the BufferQueue notifies // the consumer of events that the consumer may wish to react to. Because diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index 84ccb3fec..8263e4e71 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -851,8 +851,7 @@ status_t BufferQueue::acquireBuffer(BufferItem *buffer) { ATRACE_INT(mConsumerName.string(), mQueue.size()); } else { - // should be a better return code? - return -EINVAL; + return NO_BUFFER_AVAILABLE; } return OK; diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index dd96f8417..4fe2ccae8 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -211,7 +211,8 @@ status_t SurfaceTexture::updateTexImage() { // In asynchronous mode the list is guaranteed to be one buffer // deep, while in synchronous mode we use the oldest buffer. - if (mBufferQueue->acquireBuffer(&item) == NO_ERROR) { + err = mBufferQueue->acquireBuffer(&item); + if (err == NO_ERROR) { int buf = item.mBuf; // This buffer was newly allocated, so we need to clean up on our side if (item.mGraphicBuffer != NULL) { @@ -247,7 +248,6 @@ status_t SurfaceTexture::updateTexImage() { glBindTexture(mTexTarget, mTexName); glEGLImageTargetTexture2DOES(mTexTarget, (GLeglImageOES)image); - status_t err = OK; while ((error = glGetError()) != GL_NO_ERROR) { ST_LOGE("updateTexImage: error binding external texture image %p " "(slot %d): %#04x", image, buf, error); @@ -292,9 +292,13 @@ status_t SurfaceTexture::updateTexImage() { mCurrentScalingMode = item.mScalingMode; mCurrentTimestamp = item.mTimestamp; computeCurrentTransformMatrix(); - } else { + } else { + if (err < 0) { + ALOGE("updateTexImage failed on acquire %d", err); + } // We always bind the texture even if we don't update its contents. glBindTexture(mTexTarget, mTexName); + return OK; } return err; diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 6aa81a96c..5fb54167f 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -200,23 +200,6 @@ int SurfaceTextureClient::getSlotFromBufferLocked( android_native_buffer_t* buffer) const { bool dumpedState = false; for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { - // XXX: Dump the slots whenever we hit a NULL entry while searching for - // a buffer. - if (mSlots[i] == NULL) { - if (!dumpedState) { - ALOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d " - "looking for buffer %p", i, buffer->handle); - for (int j = 0; j < NUM_BUFFER_SLOTS; j++) { - if (mSlots[j] == NULL) { - ALOGD("getSlotFromBufferLocked: %02d: NULL", j); - } else { - ALOGD("getSlotFromBufferLocked: %02d: %p", j, mSlots[j]->handle); - } - } - dumpedState = true; - } - } - if (mSlots[i] != NULL && mSlots[i]->handle == buffer->handle) { return i; }