SF: Use getVisibleLayers... in doComposeSurfaces

in b/114101122, it is discovered that there is a problem
in indexing the SF mCompositionInfo by displayId because
there are multiple displays that have the same id (-1).

This change uses getVisibleLayersSortedByZ in doComposeSurfaces
until we can fix the indexing of mCompositionInfo.

Bug: 114101122
Test: run cts -m CtsViewTestCases, CtsMediaTestCases

Change-Id: I90adb957c183400c396f25fa9583b668e1da8417
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index d963ab6..6b56ca4 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -500,6 +500,8 @@
             validateChange(compositionInfo.compositionType,
                     changedTypes[&*hwcLayer]);
             compositionInfo.compositionType = changedTypes[&*hwcLayer];
+            compositionInfo.layer->mLayer->setCompositionType(displayId,
+                    compositionInfo.compositionType, false);
         }
 
         switch (compositionInfo.compositionType) {
@@ -520,6 +522,7 @@
                 layerRequests[&*hwcLayer] ==
                         HWC2::LayerRequest::ClearClientTarget) {
             compositionInfo.hwc.clearClientTarget = true;
+            compositionInfo.layer->mLayer->setClearClientTarget(displayId, true);
         } else {
             if (layerRequests.count(&*hwcLayer) != 0) {
                 LOG_DISPLAY_ERROR(displayId,
@@ -527,6 +530,7 @@
                                           .c_str());
             }
             compositionInfo.hwc.clearClientTarget = false;
+            compositionInfo.layer->mLayer->setClearClientTarget(displayId, false);
         }
     }
 
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index a1e45b0..03b63bd 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -680,6 +680,10 @@
     engine.drawMesh(getBE().mMesh);
 }
 
+void Layer::clearWithOpenGL(const RenderArea& renderArea) const {
+    clearWithOpenGL(renderArea, 0, 0, 0, 0);
+}
+
 void Layer::setCompositionType(int32_t displayId, HWC2::Composition type, bool /*callIntoHwc*/) {
     if (getBE().mHwcLayers.count(displayId) == 0) {
         ALOGE("setCompositionType called without a valid HWC layer");
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 9bd28b8..23201aa 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -503,6 +503,7 @@
     }
 
     // -----------------------------------------------------------------------
+    void clearWithOpenGL(const RenderArea& renderArea) const;
 
     inline const State& getDrawingState() const { return mDrawingState; }
     inline const State& getCurrentState() const { return mCurrentState; }
diff --git a/services/surfaceflinger/LayerBE.h b/services/surfaceflinger/LayerBE.h
index f5150a7..a8bdec4 100644
--- a/services/surfaceflinger/LayerBE.h
+++ b/services/surfaceflinger/LayerBE.h
@@ -94,8 +94,8 @@
     void clear(renderengine::RenderEngine& renderEngine);
     renderengine::Mesh& getMesh() { return mMesh; }
 
-private:
     Layer*const mLayer;
+private:
     // The mesh used to draw the layer in GLES composition mode
     renderengine::Mesh mMesh;
 
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 9537ccc..f17710e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3218,30 +3218,29 @@
     ALOGV("Rendering client layers");
     const ui::Transform& displayTransform = display->getTransform();
     bool firstLayer = true;
-    for (auto& compositionInfo : getBE().mCompositionInfo[displayId]) {
-        const Region bounds(display->bounds());
+    for (auto& layer : display->getVisibleLayersSortedByZ()) {
         const Region clip(bounds.intersect(
-                displayTransform.transform(compositionInfo.layer->mLayer->visibleRegion)));
-        ALOGV("Layer: %s", compositionInfo.layerName.c_str());
+                displayTransform.transform(layer->visibleRegion)));
+        ALOGV("Layer: %s", layer->getName().string());
+        ALOGV("  Composition type: %s", to_string(layer->getCompositionType(displayId)).c_str());
         if (!clip.isEmpty()) {
-            switch (compositionInfo.compositionType) {
+            switch (layer->getCompositionType(displayId)) {
                 case HWC2::Composition::Cursor:
                 case HWC2::Composition::Device:
                 case HWC2::Composition::Sideband:
                 case HWC2::Composition::SolidColor: {
-                    const Layer::State& state(compositionInfo.layer->mLayer->getDrawingState());
-                    const bool opaque = compositionInfo.layer->mLayer->isOpaque(state) &&
-                                        compositionInfo.layer->mLayer->getAlpha() == 1.0f;
-                    if (compositionInfo.hwc.clearClientTarget && !firstLayer && opaque &&
-                            hasClientComposition) {
+                    const Layer::State& state(layer->getDrawingState());
+                    if (layer->getClearClientTarget(displayId) && !firstLayer &&
+                        layer->isOpaque(state) && (layer->getAlpha() == 1.0f) &&
+                        hasClientComposition) {
                         // never clear the very first layer since we're
                         // guaranteed the FB is already cleared
-                        compositionInfo.layer->clear(getRenderEngine());
+                        layer->clearWithOpenGL(renderArea);
                     }
                     break;
                 }
                 case HWC2::Composition::Client: {
-                    compositionInfo.layer->mLayer->draw(renderArea, clip);
+                    layer->draw(renderArea, clip);
                     break;
                 }
                 default: