diff options
author | 2023-10-06 04:05:45 +0000 | |
---|---|---|
committer | 2023-10-06 20:11:44 +0000 | |
commit | d9e4f46cc957205d9a583f0dbccbcefeb66cf9bf (patch) | |
tree | 6909c6ef8718fa53e85afada2886e9b2ea904250 | |
parent | 6c0e32c07ecd09cdba722da4c94256cade0b42d7 (diff) |
Clean up duplicate shadow lengths in layer snapshot
The shadow length is currently tracked in both the LayerFE
CompositionState and the shadow settings, which are used by the
RenderEngine. We can consolidate these fields and track shadow
settings in the LayerFE CompositionState. This makes sense because
we want the LayerFE CompositionState to contain all relevant
information that it can pass to the RenderEngine without calling
back into the frontend.
Bug: 302551905
Test: presubmit
Change-Id: I583c43993cf73784c6fec9ec2d40f2c76d21adeb
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 |