Fix a problem where hwc and GL composition could show a different buffer

if a surface's buffers are reallocated, the current active buffer will
end-up pointing on one of these until a new buffer is retired.

we're now keeping a reference to the actual buffer until we retire a
new one.

Change-Id: Ib1703947e7a0340694d846e0962576318863b935
This commit is contained in:
Mathias Agopian 2010-12-14 20:30:37 -08:00
parent ebeb709596
commit 420a283c4d
2 changed files with 16 additions and 19 deletions

View File

@ -804,7 +804,7 @@ Layer::ClientRef::Access::~Access()
Layer::BufferManager::BufferManager(TextureManager& tm)
: mNumBuffers(NUM_BUFFERS), mTextureManager(tm),
mActiveBuffer(-1), mFailover(false)
mActiveBufferIndex(-1), mFailover(false)
{
}
@ -819,10 +819,10 @@ status_t Layer::BufferManager::resize(size_t size,
if (size < mNumBuffers) {
// Move the active texture into slot 0
BufferData activeBufferData = mBufferData[mActiveBuffer];
mBufferData[mActiveBuffer] = mBufferData[0];
BufferData activeBufferData = mBufferData[mActiveBufferIndex];
mBufferData[mActiveBufferIndex] = mBufferData[0];
mBufferData[0] = activeBufferData;
mActiveBuffer = 0;
mActiveBufferIndex = 0;
// Free the buffers that are no longer needed.
for (size_t i = size; i < mNumBuffers; i++) {
@ -868,37 +868,33 @@ sp<GraphicBuffer> Layer::BufferManager::getBuffer(size_t index) const {
}
status_t Layer::BufferManager::setActiveBufferIndex(size_t index) {
mActiveBuffer = index;
BufferData const * const buffers = mBufferData;
Mutex::Autolock _l(mLock);
mActiveBuffer = buffers[index].buffer;
mActiveBufferIndex = index;
return NO_ERROR;
}
size_t Layer::BufferManager::getActiveBufferIndex() const {
return mActiveBuffer;
return mActiveBufferIndex;
}
Texture Layer::BufferManager::getActiveTexture() const {
Texture res;
if (mFailover || mActiveBuffer<0) {
if (mFailover || mActiveBufferIndex<0) {
res = mFailoverTexture;
} else {
static_cast<Image&>(res) = mBufferData[mActiveBuffer].texture;
static_cast<Image&>(res) = mBufferData[mActiveBufferIndex].texture;
}
return res;
}
sp<GraphicBuffer> Layer::BufferManager::getActiveBuffer() const {
sp<GraphicBuffer> result;
const ssize_t activeBuffer = mActiveBuffer;
if (activeBuffer >= 0) {
BufferData const * const buffers = mBufferData;
Mutex::Autolock _l(mLock);
result = buffers[activeBuffer].buffer;
}
return result;
return mActiveBuffer;
}
bool Layer::BufferManager::hasActiveBuffer() const {
return mActiveBuffer >= 0;
return mActiveBufferIndex >= 0;
}
sp<GraphicBuffer> Layer::BufferManager::detachBuffer(size_t index)
@ -943,7 +939,7 @@ status_t Layer::BufferManager::initEglImage(EGLDisplay dpy,
const sp<GraphicBuffer>& buffer)
{
status_t err = NO_INIT;
ssize_t index = mActiveBuffer;
ssize_t index = mActiveBufferIndex;
if (index >= 0) {
if (!mFailover) {
Image& texture(mBufferData[index].texture);

View File

@ -164,7 +164,8 @@ private:
size_t mNumBuffers;
Texture mFailoverTexture;
TextureManager& mTextureManager;
ssize_t mActiveBuffer;
ssize_t mActiveBufferIndex;
sp<GraphicBuffer> mActiveBuffer;
bool mFailover;
static status_t destroyTexture(Image* tex, EGLDisplay dpy);