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();