| /* |
| * Copyright 2022 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 <gui/LayerMetadata.h> |
| |
| #include "compositionengine/LayerFE.h" |
| #include "compositionengine/LayerFECompositionState.h" |
| #include "renderengine/LayerSettings.h" |
| |
| namespace android { |
| struct RoundedCornerState { |
| RoundedCornerState() = default; |
| RoundedCornerState(const FloatRect& cropRect, const vec2& radius) |
| : cropRect(cropRect), radius(radius) {} |
| |
| // Rounded rectangle in local layer coordinate space. |
| FloatRect cropRect = FloatRect(); |
| // Radius of the rounded rectangle. |
| vec2 radius; |
| bool hasRoundedCorners() const { return radius.x > 0.0f && radius.y > 0.0f; } |
| }; |
| |
| // LayerSnapshot stores Layer state used by CompositionEngine and RenderEngine. Composition |
| // Engine uses a pointer to LayerSnapshot (as LayerFECompositionState*) and the LayerSettings |
| // passed to Render Engine are created using properties stored on this struct. |
| struct LayerSnapshot : public compositionengine::LayerFECompositionState { |
| int32_t sequence; |
| std::string name; |
| uint32_t textureName; |
| bool contentOpaque; |
| RoundedCornerState roundedCorner; |
| StretchEffect stretchEffect; |
| FloatRect transformedBounds; |
| renderengine::ShadowSettings shadowSettings; |
| bool premultipliedAlpha; |
| bool isHdrY410; |
| bool bufferNeedsFiltering; |
| ui::Transform transform; |
| Rect bufferSize; |
| std::shared_ptr<renderengine::ExternalTexture> externalTexture; |
| gui::LayerMetadata layerMetadata; |
| gui::LayerMetadata relativeLayerMetadata; |
| bool contentDirty; |
| bool hasReadyFrame; |
| ui::Transform blurRegionTransform; |
| }; |
| |
| struct CompositionResult { |
| // TODO(b/238781169) update CE to no longer pass refreshStartTime to LayerFE::onPreComposition |
| // and remove this field. |
| nsecs_t refreshStartTime = 0; |
| std::vector<ftl::SharedFuture<FenceResult>> releaseFences; |
| sp<Fence> lastClientCompositionFence = nullptr; |
| }; |
| |
| class LayerFE : public virtual RefBase, public virtual compositionengine::LayerFE { |
| public: |
| LayerFE(const std::string& name); |
| |
| // compositionengine::LayerFE overrides |
| const compositionengine::LayerFECompositionState* getCompositionState() const override; |
| bool onPreComposition(nsecs_t refreshStartTime, bool updatingOutputGeometryThisFrame) override; |
| void onLayerDisplayed(ftl::SharedFuture<FenceResult>) override; |
| const char* getDebugName() const override; |
| int32_t getSequence() const override; |
| bool hasRoundedCorners() const override; |
| void setWasClientComposed(const sp<Fence>&) override; |
| const gui::LayerMetadata* getMetadata() const override; |
| const gui::LayerMetadata* getRelativeMetadata() const override; |
| std::optional<compositionengine::LayerFE::LayerSettings> prepareClientComposition( |
| compositionengine::LayerFE::ClientCompositionTargetSettings&) const; |
| CompositionResult&& stealCompositionResult(); |
| |
| std::unique_ptr<LayerSnapshot> mSnapshot; |
| |
| private: |
| std::optional<compositionengine::LayerFE::LayerSettings> prepareClientCompositionInternal( |
| compositionengine::LayerFE::ClientCompositionTargetSettings&) const; |
| // Modifies the passed in layer settings to clear the contents. If the blackout flag is set, |
| // the settings clears the content with a solid black fill. |
| void prepareClearClientComposition(LayerFE::LayerSettings&, bool blackout) const; |
| void prepareShadowClientComposition(LayerFE::LayerSettings& caster, |
| const Rect& layerStackRect) const; |
| void prepareBufferStateClientComposition( |
| compositionengine::LayerFE::LayerSettings&, |
| compositionengine::LayerFE::ClientCompositionTargetSettings&) const; |
| void prepareEffectsClientComposition( |
| compositionengine::LayerFE::LayerSettings&, |
| compositionengine::LayerFE::ClientCompositionTargetSettings&) const; |
| |
| bool hasEffect() const { return fillsColor() || drawShadows() || hasBlur(); } |
| bool hasBufferOrSidebandStream() const; |
| |
| bool fillsColor() const; |
| bool hasBlur() const; |
| bool drawShadows() const; |
| |
| const sp<GraphicBuffer> getBuffer() const; |
| |
| CompositionResult mCompositionResult; |
| std::string mName; |
| }; |
| |
| } // namespace android |