don't call hwc with non-empty layer lists for blanked displays

we now make sure to take the blanked state of a display into
account when we build its list of visible layers, this ensures
that we won't call prepare/set with a non-empty list when the
display is blanked.

Possibly fixes 7075380, 7103553, 7130187, 7016215

Bug: 7075380
Change-Id: I9fdd2e73d1b7621eaeca3d4ac2ae60d9fb1b3631
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 058ba45..6542acd 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -753,27 +753,29 @@
         ATRACE_CALL();
         mVisibleRegionsDirty = false;
         invalidateHwcGeometry();
+
         const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
+            Region opaqueRegion;
+            Region dirtyRegion;
+            Vector< sp<LayerBase> > layersSortedByZ;
             const sp<DisplayDevice>& hw(mDisplays[dpy]);
             const Transform& tr(hw->getTransform());
             const Rect bounds(hw->getBounds());
+            if (hw->canDraw()) {
+                SurfaceFlinger::computeVisibleRegions(currentLayers,
+                        hw->getLayerStack(), dirtyRegion, opaqueRegion);
 
-            Region opaqueRegion;
-            Region dirtyRegion;
-            computeVisibleRegions(currentLayers,
-                    hw->getLayerStack(), dirtyRegion, opaqueRegion);
-
-            Vector< sp<LayerBase> > layersSortedByZ;
-            const size_t count = currentLayers.size();
-            for (size_t i=0 ; i<count ; i++) {
-                const sp<LayerBase>& layer(currentLayers[i]);
-                const Layer::State& s(layer->drawingState());
-                if (s.layerStack == hw->getLayerStack()) {
-                    Region visibleRegion(tr.transform(layer->visibleRegion));
-                    visibleRegion.andSelf(bounds);
-                    if (!visibleRegion.isEmpty()) {
-                        layersSortedByZ.add(layer);
+                const size_t count = currentLayers.size();
+                for (size_t i=0 ; i<count ; i++) {
+                    const sp<LayerBase>& layer(currentLayers[i]);
+                    const Layer::State& s(layer->drawingState());
+                    if (s.layerStack == hw->getLayerStack()) {
+                        Region visibleRegion(tr.transform(layer->visibleRegion));
+                        visibleRegion.andSelf(bounds);
+                        if (!visibleRegion.isEmpty()) {
+                            layersSortedByZ.add(layer);
+                        }
                     }
                 }
             }
@@ -1776,6 +1778,7 @@
         mEventThread->onScreenReleased();
         hw->releaseScreen();
         getHwComposer().release();
+        mVisibleRegionsDirty = true;
         // from this point on, SF will stop drawing
     }
 }
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index ea03e2d..ffe68c6 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -351,8 +351,8 @@
      * Compositing
      */
     void invalidateHwcGeometry();
-    void computeVisibleRegions(const LayerVector& currentLayers,
-            uint32_t layerStack,
+    static void computeVisibleRegions(
+            const LayerVector& currentLayers, uint32_t layerStack,
             Region& dirtyRegion, Region& opaqueRegion);
 
     void preComposition();