diff options
| author | 2010-12-14 16:04:44 -0800 | |
|---|---|---|
| committer | 2010-12-14 16:04:44 -0800 | |
| commit | 0cf9a22b9ee8b660ed932205484a645b0762e4b1 (patch) | |
| tree | df32ccceb9fd6230bc166f67be1bf647638ddd67 | |
| parent | a6219160f47539ef24ce11466d70b3b674229cb4 (diff) | |
| parent | 575eaf5498b2aeb2b26a912b672180db571bda1c (diff) | |
Merge "fix [3223749] media server crashes when switching mode from video capture to still image capture"
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 19 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 2 |
2 files changed, 18 insertions, 3 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 2b2f557d3a3c..5a0f115ca121 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -246,9 +246,10 @@ void Layer::setGeometry(hwc_layer_t* hwcl) void Layer::setPerFrameData(hwc_layer_t* hwcl) { sp<GraphicBuffer> buffer(mBufferManager.getActiveBuffer()); if (buffer == NULL) { - // this situation can happen if we ran out of memory for instance. - // not much we can do. continue to use whatever texture was bound - // to this context. + // this can happen if the client never drew into this layer yet, + // or if we ran out of memory. In that case, don't let + // HWC handle it. + hwcl->flags |= HWC_SKIP_LAYER; hwcl->handle = NULL; return; } @@ -581,12 +582,20 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) } // we retired a buffer, which becomes the new front buffer + + const bool noActiveBuffer = !mBufferManager.hasActiveBuffer(); if (mBufferManager.setActiveBufferIndex(buf) < NO_ERROR) { LOGE("retireAndLock() buffer index (%d) out of range", int(buf)); mPostedDirtyRegion.clear(); return; } + if (noActiveBuffer) { + // we didn't have an active buffer, we need to recompute + // our visible region + recomputeVisibleRegions = true; + } + sp<GraphicBuffer> newFrontBuffer(getBuffer(buf)); if (newFrontBuffer != NULL) { // get the dirty region @@ -888,6 +897,10 @@ sp<GraphicBuffer> Layer::BufferManager::getActiveBuffer() const { return result; } +bool Layer::BufferManager::hasActiveBuffer() const { + return mActiveBuffer >= 0; +} + sp<GraphicBuffer> Layer::BufferManager::detachBuffer(size_t index) { BufferData* const buffers = mBufferData; diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 30021d3a443d..c367a8dfe2e3 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -188,6 +188,8 @@ private: size_t getActiveBufferIndex() const; // return the active buffer sp<GraphicBuffer> getActiveBuffer() const; + // return wether we have an active buffer + bool hasActiveBuffer() const; // return the active texture (or fail-over) Texture getActiveTexture() const; // frees resources associated with all buffers |