blob: 658f949640c2c202c2b74db855dd87329f4b406f [file] [log] [blame]
Vishnu Naire14c6b32022-08-06 04:20:15 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Alec Mourif4af03e2023-02-11 00:25:24 +000019#include <android/gui/CachingHint.h>
Vishnu Naire14c6b32022-08-06 04:20:15 +000020#include <gui/LayerMetadata.h>
Vishnu Nair8fc721b2022-12-22 20:06:32 +000021#include "FrontEnd/LayerSnapshot.h"
Vishnu Naire14c6b32022-08-06 04:20:15 +000022#include "compositionengine/LayerFE.h"
23#include "compositionengine/LayerFECompositionState.h"
24#include "renderengine/LayerSettings.h"
Melody Hsu793f8362024-01-08 20:00:35 +000025#include "ui/LayerStack.h"
26
27#include <ftl/future.h>
Vishnu Naire14c6b32022-08-06 04:20:15 +000028
29namespace android {
Vishnu Naire14c6b32022-08-06 04:20:15 +000030
31struct CompositionResult {
Vishnu Nair7ee4f462023-04-19 09:54:09 -070032 std::vector<std::pair<ftl::SharedFuture<FenceResult>, ui::LayerStack>> releaseFences;
Vishnu Naire14c6b32022-08-06 04:20:15 +000033 sp<Fence> lastClientCompositionFence = nullptr;
34};
35
36class LayerFE : public virtual RefBase, public virtual compositionengine::LayerFE {
37public:
38 LayerFE(const std::string& name);
Melody Hsu5aeb8162024-03-25 22:09:10 +000039 virtual ~LayerFE();
Vishnu Naire14c6b32022-08-06 04:20:15 +000040
41 // compositionengine::LayerFE overrides
42 const compositionengine::LayerFECompositionState* getCompositionState() const override;
Melody Hsuc949cde2024-03-12 01:43:34 +000043 bool onPreComposition(bool updatingOutputGeometryThisFrame) override;
Vishnu Nair7ee4f462023-04-19 09:54:09 -070044 void onLayerDisplayed(ftl::SharedFuture<FenceResult>, ui::LayerStack) override;
Vishnu Naire14c6b32022-08-06 04:20:15 +000045 const char* getDebugName() const override;
46 int32_t getSequence() const override;
47 bool hasRoundedCorners() const override;
48 void setWasClientComposed(const sp<Fence>&) override;
49 const gui::LayerMetadata* getMetadata() const override;
50 const gui::LayerMetadata* getRelativeMetadata() const override;
51 std::optional<compositionengine::LayerFE::LayerSettings> prepareClientComposition(
52 compositionengine::LayerFE::ClientCompositionTargetSettings&) const;
53 CompositionResult&& stealCompositionResult();
Melody Hsu793f8362024-01-08 20:00:35 +000054 ftl::Future<FenceResult> createReleaseFenceFuture() override;
55 void setReleaseFence(const FenceResult& releaseFence) override;
56 LayerFE::ReleaseFencePromiseStatus getReleaseFencePromiseStatus() override;
Vishnu Naire14c6b32022-08-06 04:20:15 +000057
Vishnu Nair8fc721b2022-12-22 20:06:32 +000058 std::unique_ptr<surfaceflinger::frontend::LayerSnapshot> mSnapshot;
Vishnu Naire14c6b32022-08-06 04:20:15 +000059
60private:
61 std::optional<compositionengine::LayerFE::LayerSettings> prepareClientCompositionInternal(
62 compositionengine::LayerFE::ClientCompositionTargetSettings&) const;
63 // Modifies the passed in layer settings to clear the contents. If the blackout flag is set,
64 // the settings clears the content with a solid black fill.
65 void prepareClearClientComposition(LayerFE::LayerSettings&, bool blackout) const;
66 void prepareShadowClientComposition(LayerFE::LayerSettings& caster,
67 const Rect& layerStackRect) const;
68 void prepareBufferStateClientComposition(
69 compositionengine::LayerFE::LayerSettings&,
70 compositionengine::LayerFE::ClientCompositionTargetSettings&) const;
71 void prepareEffectsClientComposition(
72 compositionengine::LayerFE::LayerSettings&,
73 compositionengine::LayerFE::ClientCompositionTargetSettings&) const;
74
75 bool hasEffect() const { return fillsColor() || drawShadows() || hasBlur(); }
76 bool hasBufferOrSidebandStream() const;
77
78 bool fillsColor() const;
79 bool hasBlur() const;
80 bool drawShadows() const;
81
82 const sp<GraphicBuffer> getBuffer() const;
83
84 CompositionResult mCompositionResult;
85 std::string mName;
Melody Hsu793f8362024-01-08 20:00:35 +000086 std::promise<FenceResult> mReleaseFence;
87 ReleaseFencePromiseStatus mReleaseFencePromiseStatus = ReleaseFencePromiseStatus::UNINITIALIZED;
Vishnu Naire14c6b32022-08-06 04:20:15 +000088};
89
90} // namespace android