SF: Separate out render surface code

This creates a new class for the purpose of holding all the
functionality related to flipping the output display surface.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: I108ccb75f3cd6aa1204487b0aed7c67d9fe1b85f
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index fb15b24..89129e9 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -37,6 +37,7 @@
 
 #include <compositionengine/CompositionEngine.h>
 #include <compositionengine/Display.h>
+#include <compositionengine/RenderSurface.h>
 #include <compositionengine/impl/OutputCompositionState.h>
 #include <dvr/vr_flinger.h>
 #include <gui/BufferQueue.h>
@@ -1042,7 +1043,6 @@
             ALOGW("Attempt to set active color mode %s (%d) for virtual display",
                   decodeColorMode(mode).c_str(), mode);
         } else {
-            display->setCompositionDataSpace(Dataspace::UNKNOWN);
             display->getCompositionDisplay()->setColorMode(mode, Dataspace::UNKNOWN,
                                                            RenderIntent::COLORIMETRIC);
         }
@@ -1760,7 +1760,6 @@
             Dataspace dataSpace;
             RenderIntent renderIntent;
             pickColorMode(displayDevice, &colorMode, &dataSpace, &renderIntent);
-            displayDevice->setCompositionDataSpace(dataSpace);
             display->setColorMode(colorMode, dataSpace, renderIntent);
         }
     }
@@ -1805,7 +1804,7 @@
             auto& engine(getRenderEngine());
             engine.fillRegionWithColor(dirtyRegion, 1, 0, 1, 1);
 
-            displayDevice->queueBuffer(getHwComposer());
+            display->getRenderSurface()->queueBuffer();
         }
     }
 
@@ -1989,7 +1988,9 @@
 
     if (displayDevice && getHwComposer().hasClientComposition(displayDevice->getId())) {
         glCompositionDoneFenceTime =
-                std::make_shared<FenceTime>(displayDevice->getClientTargetAcquireFence());
+                std::make_shared<FenceTime>(displayDevice->getCompositionDisplay()
+                                                    ->getRenderSurface()
+                                                    ->getClientTargetAcquireFence());
         getBE().mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
     } else {
         glCompositionDoneFenceTime = FenceTime::NO_FENCE;
@@ -2340,7 +2341,7 @@
              displayDevice->getDebugName().c_str(), flagPrefix[dirty], flagPrefix[empty],
              flagPrefix[wasEmpty]);
 
-    displayDevice->beginFrame(mustRecompose);
+    display->getRenderSurface()->beginFrame(mustRecompose);
 
     if (mustRecompose) {
         display->editState().lastCompositionHadVisibleLayers = !empty;
@@ -2355,9 +2356,8 @@
         return;
     }
 
-    status_t result =
-            displayDevice->prepareFrame(getHwComposer(),
-                                        getBE().mCompositionInfo[displayDevice->getDisplayToken()]);
+    status_t result = display->getRenderSurface()->prepareFrame(
+            getBE().mCompositionInfo[displayDevice->getDisplayToken()]);
     ALOGE_IF(result != NO_ERROR, "prepareFrame failed for %s: %d (%s)",
              displayDevice->getDebugName().c_str(), result, strerror(-result));
 }
@@ -2377,7 +2377,7 @@
         doDisplayComposition(displayDevice, dirtyRegion);
 
         display->editState().dirtyRegion.clear();
-        displayDevice->flip();
+        display->getRenderSurface()->flip();
     }
     postFramebuffer(displayDevice);
 }
@@ -2408,7 +2408,7 @@
         if (displayId) {
             getHwComposer().presentAndGetReleaseFences(*displayId);
         }
-        displayDevice->onPresentDisplayCompleted();
+        display->getRenderSurface()->onPresentDisplayCompleted();
         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
             sp<Fence> releaseFence = Fence::NO_FENCE;
 
@@ -2426,8 +2426,9 @@
             // client target acquire fence when it is available, even though
             // this is suboptimal.
             if (layer->getCompositionType(displayId) == HWC2::Composition::Client) {
-                releaseFence = Fence::merge("LayerRelease", releaseFence,
-                                            displayDevice->getClientTargetAcquireFence());
+                releaseFence =
+                        Fence::merge("LayerRelease", releaseFence,
+                                     display->getRenderSurface()->getClientTargetAcquireFence());
             }
 
             layer->getBE().onLayerDisplayed(releaseFence);
@@ -2581,7 +2582,6 @@
         defaultColorMode = ColorMode::SRGB;
         defaultDataSpace = Dataspace::V0_SRGB;
     }
-    display->setCompositionDataSpace(defaultDataSpace);
     display->getCompositionDisplay()->setColorMode(defaultColorMode, defaultDataSpace,
                                                    RenderIntent::COLORIMETRIC);
     if (!state.isVirtual()) {
@@ -3256,7 +3256,7 @@
     if (!doComposeSurfaces(displayDevice)) return;
 
     // swap buffers (presentation)
-    displayDevice->queueBuffer(getHwComposer());
+    display->getRenderSurface()->queueBuffer();
 }
 
 bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& displayDevice) {
@@ -3280,7 +3280,7 @@
     if (hasClientComposition) {
         ALOGV("hasClientComposition");
 
-        sp<GraphicBuffer> buf = displayDevice->dequeueBuffer();
+        sp<GraphicBuffer> buf = display->getRenderSurface()->dequeueBuffer();
 
         if (buf == nullptr) {
             ALOGW("Dequeuing buffer for display [%s] failed, bailing out of "
@@ -3319,7 +3319,7 @@
             colorMatrix = mDrawingState.colorMatrix;
         }
 
-        displayDevice->setViewportAndProjection();
+        display->getRenderSurface()->setViewportAndProjection();
 
         // Never touch the framebuffer if we don't have any framebuffer layers
         if (hasDeviceComposition) {
@@ -3413,7 +3413,7 @@
     if (hasClientComposition) {
         getRenderEngine().setColorTransform(mat4());
         getRenderEngine().disableScissor();
-        displayDevice->finishBuffer();
+        display->getRenderSurface()->finishBuffer();
         // Clear out error flags here so that we don't wait until next
         // composition to log.
         getRenderEngine().checkErrors();