fix [3385504] Surface flinger hang when adding dim surface

Change-Id: I8e0cda414bcad5854d2ca5dde8370bfd8b2e5ea4
This commit is contained in:
Mathias Agopian 2011-01-25 20:17:45 -08:00
parent 83af225202
commit 0d1561275e
4 changed files with 16 additions and 3 deletions

View File

@ -563,10 +563,15 @@ sp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
if (s == 0) {
s = createSurface();
mClientSurface = s;
mClientSurfaceBinder = s->asBinder();
}
return s;
}
wp<IBinder> LayerBaseClient::getSurfaceBinder() const {
return mClientSurfaceBinder;
}
sp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
{
return new Surface(mFlinger, mIdentity,

View File

@ -285,6 +285,7 @@ public:
virtual ~LayerBaseClient();
sp<Surface> getSurface();
wp<IBinder> getSurfaceBinder() const;
virtual sp<Surface> createSurface() const;
virtual sp<LayerBaseClient> getLayerBaseClient() const {
return const_cast<LayerBaseClient*>(this); }
@ -325,6 +326,7 @@ protected:
private:
mutable Mutex mLock;
mutable wp<Surface> mClientSurface;
wp<IBinder> mClientSurfaceBinder;
const wp<Client> mClientRef;
// only read
const uint32_t mIdentity;

View File

@ -67,8 +67,14 @@ void LayerDim::onDraw(const Region& clip) const
const GLfloat alpha = s.alpha/255.0f;
const uint32_t fbHeight = hw.getHeight();
glDisable(GL_DITHER);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
if (s.alpha == 0xFF) {
glDisable(GL_BLEND);
} else {
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
glColor4f(0, 0, 0, alpha);
#if defined(GL_OES_EGL_image_external)

View File

@ -1088,7 +1088,7 @@ status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase)
{
sp<LayerBaseClient> lbc(layerBase->getLayerBaseClient());
if (lbc != 0) {
mLayerMap.removeItem( lbc->getSurface()->asBinder() );
mLayerMap.removeItem( lbc->getSurfaceBinder() );
}
ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
if (index >= 0) {