summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-12-14 20:30:37 -0800
committerMathias Agopian <mathias@google.com>2010-12-14 20:30:37 -0800
commit1ebaa3a3795bd418280cea75d7a8f0a25678d3a8 (patch)
treead063ae877660fda68da7b932896a7dc9bb3e7fa /services/surfaceflinger/Layer.cpp
parent04a709e459db6f15c04b00bcd3b030c90ca52949 (diff)
downloadframeworks_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.cpp32
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);