From 15fb96e63f2de336bb01e0824cc85141e5edfdea Mon Sep 17 00:00:00 2001 From: David Sodman Date: Sun, 7 Jan 2018 10:23:24 -0800 Subject: SF: Track compositionType across displayId's Make sure that compositionType tracks displayId's Bug: 112259502 Test: cts -m CtsViewTestCases SurfaceFlinger_test vrflinger_test Change-Id: I748ef1a6da8257e780daf89af06d76f29d19ad6f --- services/surfaceflinger/Layer.cpp | 8 ++------ services/surfaceflinger/LayerBE.h | 1 + services/surfaceflinger/SurfaceFlinger.cpp | 13 +++++++++---- services/surfaceflinger/SurfaceFlinger.h | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 8e6cf99279..1bb72326d9 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -772,16 +772,12 @@ void Layer::setCompositionType(int32_t displayId, HWC2::Composition type, bool c } HWC2::Composition Layer::getCompositionType(int32_t displayId) const { - if (displayId == DisplayDevice::DISPLAY_ID_INVALID) { + if (getBE().mHwcLayers.count(displayId) == 0) { // If we're querying the composition type for a display that does not // have a HWC counterpart, then it will always be Client return HWC2::Composition::Client; } - if (getBE().mHwcLayers.count(displayId) == 0) { - ALOGE("getCompositionType called with an invalid HWC layer"); - return HWC2::Composition::Invalid; - } - return getBE().mHwcLayers.at(displayId).compositionType; + return getBE().mHwcLayers[displayId].compositionType; } void Layer::setClearClientTarget(int32_t displayId, bool clear) { diff --git a/services/surfaceflinger/LayerBE.h b/services/surfaceflinger/LayerBE.h index 0413a459df..dacdc06e19 100644 --- a/services/surfaceflinger/LayerBE.h +++ b/services/surfaceflinger/LayerBE.h @@ -40,6 +40,7 @@ struct CompositionInfo { std::shared_ptr layer; struct { std::shared_ptr hwcLayer; + int32_t displayId = -1; sp fence; HWC2::BlendMode blendMode = HWC2::BlendMode::Invalid; Rect displayFrame; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c0c684a502..8cee8d7801 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1464,8 +1464,11 @@ void SurfaceFlinger::handleMessageRefresh() { mVsyncModulator.onRefreshed(mHadClientComposition); mLayersWithQueuedFrames.clear(); - for (auto& compositionInfo : getBE().mCompositionInfo) { - compositionInfo.hwc.hwcLayer = nullptr; + for (const auto& [token, display] : mDisplays) { + const auto displayId = display->getId(); + for (auto& compositionInfo : getBE().mCompositionInfo[displayId]) { + compositionInfo.hwc.hwcLayer = nullptr; + } } } @@ -1551,16 +1554,18 @@ void SurfaceFlinger::calculateWorkingSet() { } mDrawingState.colorMatrixChanged = false; - getBE().mCompositionInfo.clear(); for (const auto& [token, display] : mDisplays) { + const auto displayId = display->getId(); + getBE().mCompositionInfo[displayId].clear(); for (auto& layer : display->getVisibleLayersSortedByZ()) { auto displayId = display->getId(); layer->getBE().compositionInfo.compositionType = layer->getCompositionType(displayId); if (!layer->setHwcLayer(displayId)) { ALOGV("Need to create HWCLayer for %s", layer->getName().string()); } - getBE().mCompositionInfo.push_back(layer->getBE().compositionInfo); + layer->getBE().compositionInfo.hwc.displayId = displayId; + getBE().mCompositionInfo[displayId].push_back(layer->getBE().compositionInfo); layer->getBE().compositionInfo.hwc.hwcLayer = nullptr; } } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index c06c74fad2..bdbd6ab750 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -226,7 +226,7 @@ public: // instances. Each hardware composer instance gets a different sequence id. int32_t mComposerSequenceId; - std::vector mCompositionInfo; + std::unordered_map> mCompositionInfo; }; -- cgit v1.2.3-59-g8ed1b