am fd7a411a: Merge "partially fix [3306150] HTML5 video with H/W acceleration blackout" into honeycomb

* commit 'fd7a411aef7e1c7722456de09b3f3234bbb914d4':
  partially fix [3306150] HTML5 video with H/W acceleration blackout
This commit is contained in:
Mathias Agopian 2011-01-14 19:29:44 -08:00 committed by Android Git Automerger
commit f2c8275042
2 changed files with 19 additions and 1 deletions

View File

@ -1109,8 +1109,12 @@ status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase)
status_t SurfaceFlinger::purgatorizeLayer_l(const sp<LayerBase>& layerBase) status_t SurfaceFlinger::purgatorizeLayer_l(const sp<LayerBase>& layerBase)
{ {
// remove the layer from the main list (through a transaction). // First add the layer to the purgatory list, which makes sure it won't
// go away, then remove it from the main list (through a transaction).
ssize_t err = removeLayer_l(layerBase); ssize_t err = removeLayer_l(layerBase);
if (err >= 0) {
mLayerPurgatory.add(layerBase);
}
layerBase->onRemoved(); layerBase->onRemoved();
@ -1359,6 +1363,19 @@ status_t SurfaceFlinger::destroySurface(const sp<LayerBaseClient>& layer)
* to use the purgatory. * to use the purgatory.
*/ */
status_t err = flinger->removeLayer_l(l); status_t err = flinger->removeLayer_l(l);
if (err == NAME_NOT_FOUND) {
// The surface wasn't in the current list, which means it was
// removed already, which means it is in the purgatory,
// and need to be removed from there.
// This needs to happen from the main thread since its dtor
// must run from there (b/c of OpenGL ES). Additionally, we
// can't really acquire our internal lock from
// destroySurface() -- see postMessage() below.
ssize_t idx = flinger->mLayerPurgatory.remove(l);
LOGE_IF(idx < 0,
"layer=%p is not in the purgatory list", l.get());
}
LOGE_IF(err<0 && err != NAME_NOT_FOUND, LOGE_IF(err<0 && err != NAME_NOT_FOUND,
"error removing layer=%p (%s)", l.get(), strerror(-err)); "error removing layer=%p (%s)", l.get(), strerror(-err));
return true; return true;

View File

@ -375,6 +375,7 @@ private:
volatile int32_t mTransactionFlags; volatile int32_t mTransactionFlags;
volatile int32_t mTransactionCount; volatile int32_t mTransactionCount;
Condition mTransactionCV; Condition mTransactionCV;
SortedVector< sp<LayerBase> > mLayerPurgatory;
bool mResizeTransationPending; bool mResizeTransationPending;
// protected by mStateLock (but we could use another lock) // protected by mStateLock (but we could use another lock)