diff options
Diffstat (limited to 'services/surfaceflinger/CompositionEngine/src/Output.cpp')
| -rw-r--r-- | services/surfaceflinger/CompositionEngine/src/Output.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index 1598fd135a..66ec2f75ce 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -706,6 +706,9 @@ void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE, // one, or create a new one if we do not. auto result = 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 = result->editState(); @@ -720,6 +723,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; } void Output::setReleasedLayers(const compositionengine::CompositionRefreshArgs&) { @@ -1333,7 +1341,7 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests( const Region viewportRegion(outputState.layerStackSpace.getContent()); bool firstLayer = true; - bool disableBlurs = false; + bool disableBlursWholesale = false; sp<GraphicBuffer> previousOverrideBuffer = nullptr; for (auto* layer : getOutputLayersOrderedByZ()) { @@ -1350,7 +1358,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(); @@ -1381,7 +1390,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:: |
