fix [3385504] Surface flinger hang when adding dim surface
Change-Id: I8e0cda414bcad5854d2ca5dde8370bfd8b2e5ea4
This commit is contained in:
parent
83af225202
commit
0d1561275e
@ -563,10 +563,15 @@ sp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
|
|||||||
if (s == 0) {
|
if (s == 0) {
|
||||||
s = createSurface();
|
s = createSurface();
|
||||||
mClientSurface = s;
|
mClientSurface = s;
|
||||||
|
mClientSurfaceBinder = s->asBinder();
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wp<IBinder> LayerBaseClient::getSurfaceBinder() const {
|
||||||
|
return mClientSurfaceBinder;
|
||||||
|
}
|
||||||
|
|
||||||
sp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
|
sp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
|
||||||
{
|
{
|
||||||
return new Surface(mFlinger, mIdentity,
|
return new Surface(mFlinger, mIdentity,
|
||||||
|
@ -285,6 +285,7 @@ public:
|
|||||||
virtual ~LayerBaseClient();
|
virtual ~LayerBaseClient();
|
||||||
|
|
||||||
sp<Surface> getSurface();
|
sp<Surface> getSurface();
|
||||||
|
wp<IBinder> getSurfaceBinder() const;
|
||||||
virtual sp<Surface> createSurface() const;
|
virtual sp<Surface> createSurface() const;
|
||||||
virtual sp<LayerBaseClient> getLayerBaseClient() const {
|
virtual sp<LayerBaseClient> getLayerBaseClient() const {
|
||||||
return const_cast<LayerBaseClient*>(this); }
|
return const_cast<LayerBaseClient*>(this); }
|
||||||
@ -325,6 +326,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
mutable Mutex mLock;
|
mutable Mutex mLock;
|
||||||
mutable wp<Surface> mClientSurface;
|
mutable wp<Surface> mClientSurface;
|
||||||
|
wp<IBinder> mClientSurfaceBinder;
|
||||||
const wp<Client> mClientRef;
|
const wp<Client> mClientRef;
|
||||||
// only read
|
// only read
|
||||||
const uint32_t mIdentity;
|
const uint32_t mIdentity;
|
||||||
|
@ -67,8 +67,14 @@ void LayerDim::onDraw(const Region& clip) const
|
|||||||
const GLfloat alpha = s.alpha/255.0f;
|
const GLfloat alpha = s.alpha/255.0f;
|
||||||
const uint32_t fbHeight = hw.getHeight();
|
const uint32_t fbHeight = hw.getHeight();
|
||||||
glDisable(GL_DITHER);
|
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);
|
glColor4f(0, 0, 0, alpha);
|
||||||
|
|
||||||
#if defined(GL_OES_EGL_image_external)
|
#if defined(GL_OES_EGL_image_external)
|
||||||
|
@ -1088,7 +1088,7 @@ status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase)
|
|||||||
{
|
{
|
||||||
sp<LayerBaseClient> lbc(layerBase->getLayerBaseClient());
|
sp<LayerBaseClient> lbc(layerBase->getLayerBaseClient());
|
||||||
if (lbc != 0) {
|
if (lbc != 0) {
|
||||||
mLayerMap.removeItem( lbc->getSurface()->asBinder() );
|
mLayerMap.removeItem( lbc->getSurfaceBinder() );
|
||||||
}
|
}
|
||||||
ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
|
ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user