summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/CompositionEngine/src
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/CompositionEngine/src')
-rw-r--r--services/surfaceflinger/CompositionEngine/src/Output.cpp16
-rw-r--r--services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp7
2 files changed, 19 insertions, 4 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::
diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
index 409a206ace..a458b5ebd0 100644
--- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
@@ -196,9 +196,14 @@ void CachedSet::render(renderengine::RenderEngine& renderEngine, TexturePool& te
std::vector<renderengine::LayerSettings> layerSettings;
renderengine::LayerSettings highlight;
for (const auto& layer : mLayers) {
+ auto blurSettings = targetSettings;
+ if (!layer.hasBlurBehind()) {
+ blurSettings.blurSetting =
+ LayerFE::ClientCompositionTargetSettings::BlurSetting::Disabled;
+ }
if (auto clientCompositionSettings =
layer.getState()->getOutputLayer()->getLayerFE().prepareClientComposition(
- targetSettings)) {
+ blurSettings)) {
layerSettings.push_back(std::move(*clientCompositionSettings));
}
}