diff options
author | Mathias Agopian <mathias@google.com> | 2010-12-14 20:30:37 -0800 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2010-12-14 20:30:37 -0800 |
commit | 1ebaa3a3795bd418280cea75d7a8f0a25678d3a8 (patch) | |
tree | ad063ae877660fda68da7b932896a7dc9bb3e7fa /services/surfaceflinger/Layer.cpp | |
parent | 04a709e459db6f15c04b00bcd3b030c90ca52949 (diff) | |
download | frameworks_base-1ebaa3a3795bd418280cea75d7a8f0a25678d3a8.zip frameworks_base-1ebaa3a3795bd418280cea75d7a8f0a25678d3a8.tar.gz frameworks_base-1ebaa3a3795bd418280cea75d7a8f0a25678d3a8.tar.bz2 |
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
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 5a0f115..fde68f6 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -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); |