diff options
20 files changed, 117 insertions, 101 deletions
diff --git a/libs/renderengine/include/renderengine/LayerSettings.h b/libs/renderengine/include/renderengine/LayerSettings.h index 28aa4dd71d..8ac0af47c6 100644 --- a/libs/renderengine/include/renderengine/LayerSettings.h +++ b/libs/renderengine/include/renderengine/LayerSettings.h @@ -28,6 +28,7 @@ #include <ui/GraphicTypes.h> #include <ui/Rect.h> #include <ui/Region.h> +#include <ui/ShadowSettings.h> #include <ui/StretchEffect.h> #include <ui/Transform.h> @@ -97,36 +98,6 @@ struct PixelSource { half3 solidColor = half3(0.0f, 0.0f, 0.0f); }; -/* - * Contains the configuration for the shadows drawn by single layer. Shadow follows - * material design guidelines. - */ -struct ShadowSettings { - // Boundaries of the shadow. - FloatRect boundaries = FloatRect(); - - // Color to the ambient shadow. The alpha is premultiplied. - vec4 ambientColor = vec4(); - - // Color to the spot shadow. The alpha is premultiplied. The position of the spot shadow - // depends on the light position. - vec4 spotColor = vec4(); - - // Position of the light source used to cast the spot shadow. - vec3 lightPos = vec3(); - - // Radius of the spot light source. Smaller radius will have sharper edges, - // larger radius will have softer shadows - float lightRadius = 0.f; - - // Length of the cast shadow. If length is <= 0.f no shadows will be drawn. - float length = 0.f; - - // If true fill in the casting layer is translucent and the shadow needs to fill the bounds. - // Otherwise the shadow will only be drawn around the edges of the casting layer. - bool casterIsTranslucent = false; -}; - // The settings that RenderEngine requires for correctly rendering a Layer. struct LayerSettings { // Geometry information @@ -194,17 +165,6 @@ static inline bool operator==(const PixelSource& lhs, const PixelSource& rhs) { return lhs.buffer == rhs.buffer && lhs.solidColor == rhs.solidColor; } -static inline bool operator==(const ShadowSettings& lhs, const ShadowSettings& rhs) { - return lhs.boundaries == rhs.boundaries && lhs.ambientColor == rhs.ambientColor && - lhs.spotColor == rhs.spotColor && lhs.lightPos == rhs.lightPos && - lhs.lightRadius == rhs.lightRadius && lhs.length == rhs.length && - lhs.casterIsTranslucent == rhs.casterIsTranslucent; -} - -static inline bool operator!=(const ShadowSettings& lhs, const ShadowSettings& rhs) { - return !(operator==(lhs, rhs)); -} - static inline bool operator==(const LayerSettings& lhs, const LayerSettings& rhs) { if (lhs.blurRegions.size() != rhs.blurRegions.size()) { return false; diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index 7dde71632b..6023808aaf 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -403,7 +403,7 @@ public: } void expectShadowColor(const renderengine::LayerSettings& castingLayer, - const renderengine::ShadowSettings& shadow, const ubyte4& casterColor, + const ShadowSettings& shadow, const ubyte4& casterColor, const ubyte4& backgroundColor) { const Rect casterRect(castingLayer.geometry.boundaries); Region casterRegion = Region(casterRect); @@ -443,8 +443,7 @@ public: backgroundColor.a); } - void expectShadowColorWithoutCaster(const FloatRect& casterBounds, - const renderengine::ShadowSettings& shadow, + void expectShadowColorWithoutCaster(const FloatRect& casterBounds, const ShadowSettings& shadow, const ubyte4& backgroundColor) { const float shadowInset = shadow.length * -1.0f; const Rect casterRect(casterBounds); @@ -463,9 +462,9 @@ public: backgroundColor.a); } - static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength, - bool casterIsTranslucent) { - renderengine::ShadowSettings shadow; + static ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength, + bool casterIsTranslucent) { + ShadowSettings shadow; shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f}; shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f}; shadow.lightPos = vec3(casterPos.x, casterPos.y, 0); @@ -602,12 +601,10 @@ public: void fillGreenColorBufferThenClearRegion(); template <typename SourceVariant> - void drawShadow(const renderengine::LayerSettings& castingLayer, - const renderengine::ShadowSettings& shadow, const ubyte4& casterColor, - const ubyte4& backgroundColor); + void drawShadow(const renderengine::LayerSettings& castingLayer, const ShadowSettings& shadow, + const ubyte4& casterColor, const ubyte4& backgroundColor); - void drawShadowWithoutCaster(const FloatRect& castingBounds, - const renderengine::ShadowSettings& shadow, + void drawShadowWithoutCaster(const FloatRect& castingBounds, const ShadowSettings& shadow, const ubyte4& backgroundColor); // Tonemaps grey values from sourceDataspace -> Display P3 and checks that GPU and CPU @@ -1337,8 +1334,8 @@ void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() { template <typename SourceVariant> void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer, - const renderengine::ShadowSettings& shadow, - const ubyte4& casterColor, const ubyte4& backgroundColor) { + const ShadowSettings& shadow, const ubyte4& casterColor, + const ubyte4& backgroundColor) { renderengine::DisplaySettings settings; settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR; settings.physicalDisplay = fullscreenRect(); @@ -1374,7 +1371,7 @@ void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLaye } void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds, - const renderengine::ShadowSettings& shadow, + const ShadowSettings& shadow, const ubyte4& backgroundColor) { renderengine::DisplaySettings settings; settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR; @@ -2103,9 +2100,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) { const float shadowLength = 5.0f; Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f); casterBounds.offsetBy(shadowLength + 1, shadowLength + 1); - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - false /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, false /* casterIsTranslucent */); drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor); expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor); @@ -2127,9 +2123,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) { renderengine::LayerSettings castingLayer; castingLayer.geometry.boundaries = casterBounds.toFloatRect(); castingLayer.alpha = 1.0f; - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - false /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, false /* casterIsTranslucent */); drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor); expectShadowColor(castingLayer, settings, casterColor, backgroundColor); @@ -2152,9 +2147,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) { castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR; castingLayer.geometry.boundaries = casterBounds.toFloatRect(); castingLayer.alpha = 1.0f; - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - false /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, false /* casterIsTranslucent */); drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor); expectShadowColor(castingLayer, settings, casterColor, backgroundColor); @@ -2177,9 +2171,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) { castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR; castingLayer.geometry.boundaries = casterBounds.toFloatRect(); castingLayer.alpha = 1.0f; - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - false /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, false /* casterIsTranslucent */); drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor, backgroundColor); @@ -2204,9 +2197,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) { castingLayer.geometry.roundedCornersRadius = {3.0f, 3.0f}; castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect(); castingLayer.alpha = 1.0f; - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - false /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, false /* casterIsTranslucent */); drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor, backgroundColor); @@ -2227,9 +2219,8 @@ TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) { renderengine::LayerSettings castingLayer; castingLayer.geometry.boundaries = casterBounds.toFloatRect(); castingLayer.alpha = 0.5f; - renderengine::ShadowSettings settings = - getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength, - true /* casterIsTranslucent */); + ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top), + shadowLength, true /* casterIsTranslucent */); drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor, backgroundColor); diff --git a/libs/ui/include/ui/ShadowSettings.h b/libs/ui/include/ui/ShadowSettings.h new file mode 100644 index 0000000000..c0b83b8691 --- /dev/null +++ b/libs/ui/include/ui/ShadowSettings.h @@ -0,0 +1,65 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <math/vec4.h> +#include "FloatRect.h" + +namespace android { + +/* + * Contains the configuration for the shadows drawn by single layer. Shadow follows + * material design guidelines. + */ +struct ShadowSettings { + // Boundaries of the shadow. + FloatRect boundaries = FloatRect(); + + // Color to the ambient shadow. The alpha is premultiplied. + vec4 ambientColor = vec4(); + + // Color to the spot shadow. The alpha is premultiplied. The position of the spot shadow + // depends on the light position. + vec4 spotColor = vec4(); + + // Position of the light source used to cast the spot shadow. + vec3 lightPos = vec3(); + + // Radius of the spot light source. Smaller radius will have sharper edges, + // larger radius will have softer shadows + float lightRadius = 0.f; + + // Length of the cast shadow. If length is <= 0.f no shadows will be drawn. + float length = 0.f; + + // If true fill in the casting layer is translucent and the shadow needs to fill the bounds. + // Otherwise the shadow will only be drawn around the edges of the casting layer. + bool casterIsTranslucent = false; +}; + +static inline bool operator==(const ShadowSettings& lhs, const ShadowSettings& rhs) { + return lhs.boundaries == rhs.boundaries && lhs.ambientColor == rhs.ambientColor && + lhs.spotColor == rhs.spotColor && lhs.lightPos == rhs.lightPos && + lhs.lightRadius == rhs.lightRadius && lhs.length == rhs.length && + lhs.casterIsTranslucent == rhs.casterIsTranslucent; +} + +static inline bool operator!=(const ShadowSettings& lhs, const ShadowSettings& rhs) { + return !(operator==(lhs, rhs)); +} + +} // namespace android
\ No newline at end of file diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h index 35ca3a58d9..11759b855f 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h @@ -26,6 +26,7 @@ #include <ui/LayerStack.h> #include <ui/Rect.h> #include <ui/Region.h> +#include <ui/ShadowSettings.h> #include <ui/Transform.h> // TODO(b/129481165): remove the #pragma below and fix conversion issues @@ -132,8 +133,7 @@ struct LayerFECompositionState { // The bounds of the layer in layer local coordinates FloatRect geomLayerBounds; - // length of the shadow in screen space - float shadowRadius{0.f}; + ShadowSettings shadowSettings; // List of regions that require blur std::vector<BlurRegion> blurRegions; diff --git a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp index 426cc57db8..2d10866db3 100644 --- a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp +++ b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp @@ -68,7 +68,7 @@ void LayerFECompositionState::dump(std::string& out) const { dumpVal(out, "geomLayerBounds", geomLayerBounds); out.append(" "); - dumpVal(out, "shadowRadius", shadowRadius); + dumpVal(out, "shadowLength", shadowSettings.length); out.append("\n "); dumpVal(out, "blend", toString(blendMode), blendMode); diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index 775e6d5094..fa3733b540 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -588,10 +588,10 @@ void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE, const Rect visibleRect(tr.transform(layerFEState->geomLayerBounds)); visibleRegion.set(visibleRect); - if (layerFEState->shadowRadius > 0.0f) { + if (layerFEState->shadowSettings.length > 0.0f) { // if the layer casts a shadow, offset the layers visible region and // calculate the shadow region. - const auto inset = static_cast<int32_t>(ceilf(layerFEState->shadowRadius) * -1.0f); + const auto inset = static_cast<int32_t>(ceilf(layerFEState->shadowSettings.length) * -1.0f); Rect visibleRectWithShadows(visibleRect); visibleRectWithShadows.inset(inset, inset, inset, inset); visibleRegion.set(visibleRectWithShadows); diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index fe56969884..7fe3369f88 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -222,8 +222,8 @@ Rect OutputLayer::calculateOutputDisplayFrame() const { // Some HWCs may clip client composited input to its displayFrame. Make sure // that this does not cut off the shadow. - if (layerState.forceClientComposition && layerState.shadowRadius > 0.0f) { - const auto outset = layerState.shadowRadius; + if (layerState.forceClientComposition && layerState.shadowSettings.length > 0.0f) { + const auto outset = layerState.shadowSettings.length; geomLayerBounds.left -= outset; geomLayerBounds.top -= outset; geomLayerBounds.right += outset; diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp index 630906a5b7..1c54469cc0 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp @@ -334,7 +334,7 @@ TEST_F(OutputLayerDisplayFrameTest, outputTransformAffectsDisplayFrame) { TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame) { const int kShadowRadius = 5; - mLayerFEState.shadowRadius = kShadowRadius; + mLayerFEState.shadowSettings.length = kShadowRadius; mLayerFEState.forceClientComposition = true; mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f}; @@ -345,7 +345,7 @@ TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame) { TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame_onlyIfForcingClientComposition) { const int kShadowRadius = 5; - mLayerFEState.shadowRadius = kShadowRadius; + mLayerFEState.shadowSettings.length = kShadowRadius; mLayerFEState.forceClientComposition = false; mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f}; diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index ee6998aef8..cdcb68d9fc 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -1830,7 +1830,7 @@ TEST_F(OutputEnsureOutputLayerIfVisibleTest, coverageAccumulatesWithShadowsTest) ui::Transform translate; translate.set(50, 50); mLayer.layerFEState.geomLayerTransform = translate; - mLayer.layerFEState.shadowRadius = 10.0f; + mLayer.layerFEState.shadowSettings.length = 10.0f; mCoverageState.dirtyRegion = Region(Rect(0, 0, 500, 500)); // half of the layer including the casting shadow is covered and opaque @@ -1872,7 +1872,7 @@ TEST_F(OutputEnsureOutputLayerIfVisibleTest, shadowRegionOnlyTest) { ui::Transform translate; translate.set(50, 50); mLayer.layerFEState.geomLayerTransform = translate; - mLayer.layerFEState.shadowRadius = 10.0f; + mLayer.layerFEState.shadowSettings.length = 10.0f; mCoverageState.dirtyRegion = Region(Rect(0, 0, 500, 500)); // Casting layer is covered by an opaque region leaving only part of its shadow to be drawn @@ -1897,7 +1897,7 @@ TEST_F(OutputEnsureOutputLayerIfVisibleTest, takesNotSoEarlyOutifLayerWithShadow ui::Transform translate; translate.set(50, 50); mLayer.layerFEState.geomLayerTransform = translate; - mLayer.layerFEState.shadowRadius = 10.0f; + mLayer.layerFEState.shadowSettings.length = 10.0f; mCoverageState.dirtyRegion = Region(Rect(0, 0, 500, 500)); // Casting layer and its shadows are covered by an opaque region diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshot.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshot.cpp index f9c8e812dd..7a85da056e 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshot.cpp +++ b/services/surfaceflinger/FrontEnd/LayerSnapshot.cpp @@ -382,7 +382,6 @@ void LayerSnapshot::merge(const RequestedLayerState& requested, bool forceUpdate sidebandStream = requested.sidebandStream; } if (forceUpdate || requested.what & layer_state_t::eShadowRadiusChanged) { - shadowRadius = requested.shadowRadius; shadowSettings.length = requested.shadowRadius; } if (forceUpdate || requested.what & layer_state_t::eFrameRateSelectionPriority) { diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshot.h b/services/surfaceflinger/FrontEnd/LayerSnapshot.h index a1c72a94e0..80a51ea94c 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshot.h +++ b/services/surfaceflinger/FrontEnd/LayerSnapshot.h @@ -69,7 +69,6 @@ struct LayerSnapshot : public compositionengine::LayerFECompositionState { RoundedCornerState roundedCorner; FloatRect transformedBounds; Rect transformedBoundsWithoutTransparentRegion; - renderengine::ShadowSettings shadowSettings; bool premultipliedAlpha; ui::Transform parentTransform; Rect bufferSize; diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp index a1796e1eb0..03c09932d3 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp +++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp @@ -353,7 +353,7 @@ LayerSnapshot LayerSnapshotBuilder::getRootSnapshot() { snapshot.isSecure = false; snapshot.color.a = 1.0_hf; snapshot.colorTransformIsIdentity = true; - snapshot.shadowRadius = 0.f; + snapshot.shadowSettings.length = 0.f; snapshot.layerMetadata.mMap.clear(); snapshot.relativeLayerMetadata.mMap.clear(); snapshot.inputInfo.touchOcclusionMode = gui::TouchOcclusionMode::BLOCK_UNTRUSTED; @@ -990,9 +990,12 @@ void LayerSnapshotBuilder::updateLayerBounds(LayerSnapshot& snapshot, } void LayerSnapshotBuilder::updateShadows(LayerSnapshot& snapshot, const RequestedLayerState&, - const renderengine::ShadowSettings& globalShadowSettings) { - if (snapshot.shadowRadius > 0.f) { - snapshot.shadowSettings = globalShadowSettings; + const ShadowSettings& globalShadowSettings) { + if (snapshot.shadowSettings.length > 0.f) { + snapshot.shadowSettings.ambientColor = globalShadowSettings.ambientColor; + snapshot.shadowSettings.spotColor = globalShadowSettings.spotColor; + snapshot.shadowSettings.lightPos = globalShadowSettings.lightPos; + snapshot.shadowSettings.lightRadius = globalShadowSettings.lightRadius; // Note: this preserves existing behavior of shadowing the entire layer and not cropping // it if transparent regions are present. This may not be necessary since shadows are @@ -1006,7 +1009,6 @@ void LayerSnapshotBuilder::updateShadows(LayerSnapshot& snapshot, const Requeste snapshot.shadowSettings.ambientColor *= snapshot.alpha; snapshot.shadowSettings.spotColor *= snapshot.alpha; } - snapshot.shadowSettings.length = snapshot.shadowRadius; } void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot, diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h index 3d64b362ea..1506913e15 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h +++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h @@ -47,7 +47,7 @@ public: const DisplayInfos& displays; // Set to true if there were display changes since last update. bool displayChanges = false; - const renderengine::ShadowSettings& globalShadowSettings; + const ShadowSettings& globalShadowSettings; bool supportsBlur = true; bool forceFullDamage = false; std::optional<FloatRect> parentCrop = std::nullopt; @@ -108,7 +108,7 @@ private: void updateLayerBounds(LayerSnapshot& snapshot, const RequestedLayerState& layerState, const LayerSnapshot& parentSnapshot, uint32_t displayRotationFlags); static void updateShadows(LayerSnapshot& snapshot, const RequestedLayerState& requested, - const renderengine::ShadowSettings& globalShadowSettings); + const ShadowSettings& globalShadowSettings); void updateInput(LayerSnapshot& snapshot, const RequestedLayerState& requested, const LayerSnapshot& parentSnapshot, const LayerHierarchy::TraversalPath& path, const Args& args); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 33d1eeb7cc..2dc8758c3d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -572,7 +572,7 @@ void Layer::prepareBasicGeometryCompositionState() { snapshot->outputFilter = getOutputFilter(); snapshot->isVisible = isVisible(); snapshot->isOpaque = opaque && !usesRoundedCorners && alpha == 1.f; - snapshot->shadowRadius = mEffectiveShadowRadius; + snapshot->shadowSettings.length = mEffectiveShadowRadius; snapshot->contentDirty = contentDirty; contentDirty = false; diff --git a/services/surfaceflinger/LayerFE.cpp b/services/surfaceflinger/LayerFE.cpp index 97c4145dd1..48a9190794 100644 --- a/services/surfaceflinger/LayerFE.cpp +++ b/services/surfaceflinger/LayerFE.cpp @@ -310,7 +310,7 @@ void LayerFE::prepareBufferStateClientComposition( void LayerFE::prepareShadowClientComposition(LayerFE::LayerSettings& caster, const Rect& layerStackRect) const { - renderengine::ShadowSettings state = mSnapshot->shadowSettings; + ShadowSettings state = mSnapshot->shadowSettings; if (state.length <= 0.f || (state.ambientColor.a <= 0.f && state.spotColor.a <= 0.f)) { return; } diff --git a/services/surfaceflinger/LayerProtoHelper.cpp b/services/surfaceflinger/LayerProtoHelper.cpp index 144e1f5abf..aa6026ef79 100644 --- a/services/surfaceflinger/LayerProtoHelper.cpp +++ b/services/surfaceflinger/LayerProtoHelper.cpp @@ -402,7 +402,7 @@ void LayerProtoHelper::writeSnapshotToProto(perfetto::protos::LayerProto* layerI [&]() { return layerInfo->mutable_screen_bounds(); }); LayerProtoHelper::writeToProto(snapshot.roundedCorner.cropRect, [&]() { return layerInfo->mutable_corner_radius_crop(); }); - layerInfo->set_shadow_radius(snapshot.shadowRadius); + layerInfo->set_shadow_radius(snapshot.shadowSettings.length); layerInfo->set_id(snapshot.uniqueSequence); layerInfo->set_original_id(snapshot.sequence); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 7b2d5908e6..cbea31239a 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -419,7 +419,7 @@ private: bool colorMatrixChanged = true; mat4 colorMatrix; - renderengine::ShadowSettings globalShadowSettings; + ShadowSettings globalShadowSettings; void traverse(const LayerVector::Visitor& visitor) const; void traverseInZOrder(const LayerVector::Visitor& visitor) const; diff --git a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp index 23fe8fa886..c2d1954ee5 100644 --- a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp +++ b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp @@ -56,7 +56,7 @@ bool LayerTraceGenerator::generate(const perfetto::protos::TransactionTraceFile& frontend::LayerSnapshotBuilder snapshotBuilder; ui::DisplayMap<ui::LayerStack, frontend::DisplayInfo> displayInfos; - renderengine::ShadowSettings globalShadowSettings{.ambientColor = {1, 1, 1, 1}}; + ShadowSettings globalShadowSettings{.ambientColor = {1, 1, 1, 1}}; char value[PROPERTY_VALUE_MAX]; property_get("ro.surface_flinger.supports_background_blur", value, "0"); bool supportsBlur = atoi(value); diff --git a/services/surfaceflinger/tests/unittests/LayerHierarchyTest.h b/services/surfaceflinger/tests/unittests/LayerHierarchyTest.h index c47b0fc93c..d319dcc47e 100644 --- a/services/surfaceflinger/tests/unittests/LayerHierarchyTest.h +++ b/services/surfaceflinger/tests/unittests/LayerHierarchyTest.h @@ -19,6 +19,7 @@ #include <gui/fake/BufferData.h> #include <renderengine/mock/FakeExternalTexture.h> +#include <ui/ShadowSettings.h> #include "Client.h" // temporarily needed for LayerCreationArgs #include "FrontEnd/LayerCreationArgs.h" @@ -488,7 +489,7 @@ protected: DisplayInfos mFrontEndDisplayInfos; bool mHasDisplayChanges = false; - renderengine::ShadowSettings globalShadowSettings; + ShadowSettings globalShadowSettings; }; } // namespace android::surfaceflinger::frontend diff --git a/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp b/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp index 956c0ebca2..50dfcaac5f 100644 --- a/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp +++ b/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp @@ -859,7 +859,6 @@ TEST_F(LayerSnapshotTest, setShadowRadius) { setShadowRadius(1, SHADOW_RADIUS); UPDATE_AND_VERIFY(mSnapshotBuilder, STARTING_ZORDER); EXPECT_EQ(getSnapshot(1)->shadowSettings.length, SHADOW_RADIUS); - EXPECT_EQ(getSnapshot(1)->shadowRadius, SHADOW_RADIUS); } } // namespace android::surfaceflinger::frontend |