summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/CompositionEngine/src/Output.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/CompositionEngine/src/Output.cpp')
-rw-r--r--services/surfaceflinger/CompositionEngine/src/Output.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index 00a61a5ab6..8a2b33bf68 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -776,6 +776,9 @@ void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
// one, or create a new one if we do not.
auto outputLayer = ensureOutputLayer(prevOutputLayerIndex, layerFE);
+ coverage.aboveBlurRequests += static_cast<int32_t>(layerFEState->backgroundBlurRadius > 0 ||
+ !layerFEState->blurRegions.empty());
+
// Store the layer coverage information into the layer state as some of it
// is useful later.
auto& outputLayerState = outputLayer->editState();
@@ -790,6 +793,11 @@ void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
? outputState.transform.transform(
transparentRegion.intersect(outputState.layerStackSpace.getContent()))
: Region();
+
+ // See b/399120953: blurs are so expensive that they may be susceptible to compression side
+ // channel attacks
+ static constexpr auto kMaxBlurRequests = 10;
+ outputLayerState.ignoreBlur = coverage.aboveBlurRequests > kMaxBlurRequests;
if (CC_UNLIKELY(computeAboveCoveredExcludingOverlays)) {
outputLayerState.coveredRegionExcludingDisplayOverlays =
std::move(coveredRegionExcludingDisplayOverlays);
@@ -1499,7 +1507,7 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
const Region viewportRegion(outputState.layerStackSpace.getContent());
bool firstLayer = true;
- bool disableBlurs = false;
+ bool disableBlursWholesale = false;
uint64_t previousOverrideBufferId = 0;
for (auto* layer : getOutputLayersOrderedByZ()) {
@@ -1516,7 +1524,8 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
continue;
}
- disableBlurs |= layerFEState->sidebandStream != nullptr;
+ disableBlursWholesale |= layerFEState->sidebandStream != nullptr;
+ bool disableBlurForLayer = layer->getState().ignoreBlur || disableBlursWholesale;
const bool clientComposition = layer->requiresClientComposition();
@@ -1546,7 +1555,8 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
layer->getLayerFE().getDebugName());
}
} else {
- LayerFE::ClientCompositionTargetSettings::BlurSetting blurSetting = disableBlurs
+ LayerFE::ClientCompositionTargetSettings::BlurSetting blurSetting =
+ disableBlurForLayer
? LayerFE::ClientCompositionTargetSettings::BlurSetting::Disabled
: (layer->getState().overrideInfo.disableBackgroundBlur
? LayerFE::ClientCompositionTargetSettings::BlurSetting::