Merge "Dynamically disable blurs when tunnel mode is used"
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
index 5c7f12d..26f7f68 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
@@ -108,6 +108,9 @@
// If set to true, change the layer settings to render a clear output.
// This may be requested by the HWC
const bool clearContent;
+
+ // If set to true, change the layer settings to not use any blurs.
+ const bool disableBlurs;
};
// A superset of LayerSettings required by RenderEngine to compose a layer
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index 3852f45..43792dc 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -669,8 +669,14 @@
compositionengine::OutputLayer* Output::findLayerRequestingBackgroundComposition() const {
compositionengine::OutputLayer* layerRequestingBgComposition = nullptr;
for (auto* layer : getOutputLayersOrderedByZ()) {
- if (layer->getLayerFE().getCompositionState()->backgroundBlurRadius > 0 ||
- layer->getLayerFE().getCompositionState()->blurRegions.size() > 0) {
+ auto* compState = layer->getLayerFE().getCompositionState();
+
+ // If any layer has a sideband stream, we will disable blurs. In that case, we don't
+ // want to force client composition because of the blur.
+ if (compState->sidebandStream != nullptr) {
+ return nullptr;
+ }
+ if (compState->backgroundBlurRadius > 0 || compState->blurRegions.size() > 0) {
layerRequestingBgComposition = layer;
}
}
@@ -1022,6 +1028,8 @@
// Used when a layer clears part of the buffer.
Region stubRegion;
+ bool disableBlurs = false;
+
for (auto* layer : getOutputLayersOrderedByZ()) {
const auto& layerState = layer->getState();
const auto* layerFEState = layer->getLayerFE().getCompositionState();
@@ -1035,6 +1043,8 @@
continue;
}
+ disableBlurs |= layerFEState->sidebandStream != nullptr;
+
const bool clientComposition = layer->requiresClientComposition();
// We clear the client target for non-client composed layers if
@@ -1063,7 +1073,8 @@
.viewport = outputState.layerStackSpace.content,
.dataspace = outputDataspace,
.realContentIsVisible = realContentIsVisible,
- .clearContent = !clientComposition};
+ .clearContent = !clientComposition,
+ .disableBlurs = disableBlurs};
std::vector<LayerFE::LayerSettings> results =
layerFE.prepareClientCompositionList(targetSettings);
if (realContentIsVisible && !results.empty()) {
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 9badb99..1452192 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -3688,6 +3688,7 @@
kDisplayDataspace,
false /* realContentIsVisible */,
true /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3699,6 +3700,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
LayerFE::LayerSettings mBlackoutSettings = mLayers[1].mLayerSettings;
@@ -3742,6 +3744,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(Rect(0, 0, 30, 30)),
@@ -3753,6 +3756,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(Rect(0, 0, 40, 201)),
@@ -3764,6 +3768,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3795,6 +3800,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -3806,6 +3812,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3817,6 +3824,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3848,6 +3856,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
@@ -3860,6 +3869,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3871,6 +3881,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3901,6 +3912,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -3912,6 +3924,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3923,6 +3936,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3951,6 +3965,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
Region(kDisplayFrame),
@@ -3962,6 +3977,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
Region(kDisplayFrame),
@@ -3973,6 +3989,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4092,6 +4109,7 @@
kOutputDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(leftLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4109,6 +4127,7 @@
kOutputDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(rightLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4142,6 +4161,7 @@
kDisplayDataspace,
false /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
LayerFE::LayerSettings mShadowSettings;
@@ -4187,6 +4207,7 @@
kDisplayDataspace,
true /* realContentIsVisible */,
false /* clearContent */,
+ false /* disabledBlurs */,
};
EXPECT_CALL(mLayers[0].mOutputLayer, requiresClientComposition()).WillOnce(Return(false));
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index ab0d3df..90396dd 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -627,7 +627,7 @@
// ---------------------------------------------------------------------------
std::optional<compositionengine::LayerFE::LayerSettings> Layer::prepareClientComposition(
- compositionengine::LayerFE::ClientCompositionTargetSettings& /* targetSettings */) {
+ compositionengine::LayerFE::ClientCompositionTargetSettings& targetSettings) {
if (!getCompositionState()) {
return {};
}
@@ -649,8 +649,10 @@
layerSettings.alpha = alpha;
layerSettings.sourceDataspace = getDataSpace();
- layerSettings.backgroundBlurRadius = getBackgroundBlurRadius();
- layerSettings.blurRegions = getBlurRegions();
+ if (!targetSettings.disableBlurs) {
+ layerSettings.backgroundBlurRadius = getBackgroundBlurRadius();
+ layerSettings.blurRegions = getBlurRegions();
+ }
return layerSettings;
}
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 2fb3626..95c9982 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -5796,7 +5796,10 @@
const auto display = renderArea.getDisplayDevice();
std::vector<Layer*> renderedLayers;
Region clearRegion = Region::INVALID_REGION;
+ bool disableBlurs = false;
traverseLayers([&](Layer* layer) {
+ disableBlurs |= layer->getCurrentState().sidebandStream != nullptr;
+
Region clip(renderArea.getBounds());
compositionengine::LayerFE::ClientCompositionTargetSettings targetSettings{
clip,
@@ -5807,8 +5810,9 @@
clearRegion,
layerStackSpaceRect,
clientCompositionDisplay.outputDataspace,
- true, /* realContentIsVisible */
+ true, /* realContentIsVisible */
false, /* clearContent */
+ disableBlurs,
};
std::vector<compositionengine::LayerFE::LayerSettings> results =
layer->prepareClientCompositionList(targetSettings);
@@ -5823,11 +5827,13 @@
settings.backgroundBlurRadius = 0;
}
}
+
clientCompositionLayers.insert(clientCompositionLayers.end(),
std::make_move_iterator(results.begin()),
std::make_move_iterator(results.end()));
renderedLayers.push_back(layer);
}
+
});
std::vector<const renderengine::LayerSettings*> clientCompositionLayerPointers(