sf: Fix issue with dequeueBuffer when multiple display present
swapBuffers is called even for device composition when a flip client
target request is present. dequeueBuffer call is skipped
as there is no client composition. This is fine for single display
but if multiple display i.e. vds is present, this will be an issue
as current surface will not be switched and swapBuffers will fail
When flip client target request is present, make sure buffer is
dequeued before swapBuffers.
Bug: 151698217
Test: atest libsurfaceflinger_unittest
Change-Id: I933cbae2f09f81eef6555b1bb1e5991d2c450930
Merged-In: Ia8a1470affb2596b27986cc4153417f48cf4ed1c
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index c463c4e..f4fc747 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -470,7 +470,7 @@
Error Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
std::unordered_map<HWC2::Layer*, LayerRequest>* outLayerRequests) {
- uint32_t intDisplayRequests;
+ uint32_t intDisplayRequests = 0;
std::vector<Hwc2::Layer> layerIds;
std::vector<uint32_t> layerRequests;
auto intError = mComposer.getDisplayRequests(
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 9661e39..a6d3167 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3424,6 +3424,7 @@
const Region bounds(displayState.bounds);
const DisplayRenderArea renderArea(displayDevice);
const bool hasClientComposition = getHwComposer().hasClientComposition(displayId);
+ const bool hasFlipClientTargetRequest = getHwComposer().hasFlipClientTargetRequest(displayId);
ATRACE_INT("hasClientComposition", hasClientComposition);
bool applyColorMatrix = false;
@@ -3489,6 +3490,15 @@
if (applyColorMatrix) {
clientCompositionDisplay.colorTransform = displayState.colorTransformMat;
}
+ } else if (hasFlipClientTargetRequest) {
+ buf = display->getRenderSurface()->dequeueBuffer(&fd);
+
+ if (buf == nullptr) {
+ ALOGW("Dequeuing buffer for display [%s] failed, bailing out of "
+ "client composition for this frame",
+ displayDevice->getDisplayName().c_str());
+ return false;
+ }
}
/*