OSDN Git Service

fix [3385504] Surface flinger hang when adding dim surface
authorMathias Agopian <mathias@google.com>
Wed, 26 Jan 2011 04:17:45 +0000 (20:17 -0800)
committerMathias Agopian <mathias@google.com>
Wed, 26 Jan 2011 04:52:46 +0000 (20:52 -0800)
Change-Id: I8e0cda414bcad5854d2ca5dde8370bfd8b2e5ea4

services/java/com/android/server/ScreenRotationAnimation.java
services/surfaceflinger/LayerBase.cpp
services/surfaceflinger/LayerBase.h
services/surfaceflinger/LayerDim.cpp
services/surfaceflinger/SurfaceFlinger.cpp

index bef64b3..90318f1 100644 (file)
@@ -102,7 +102,7 @@ class ScreenRotationAnimation {
                 Slog.w(TAG, "Unable to allocate freeze surface", e);
             }
 
-            if (false) {
+            if (true) {
                 try {
                     int size = mOriginalWidth > mOriginalHeight ? mOriginalWidth : mOriginalHeight;
                     mBlackSurface = new Surface(session, 0, "BlackSurface",
index 464841b..8d83f0b 100644 (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,
index 1a34f52..8ed4749 100644 (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;
index 80cc52c..11f8feb 100644 (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)
index 291ebc5..87b66ea 100644 (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) {