blob: 0ac25459a7fa2d00d972277784deda3f1214296e [file] [log] [blame]
Lloyd Pique32cbe282018-10-19 13:09:22 -07001/*
2 * Copyright 2019 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
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070019#include <compositionengine/CompositionEngine.h>
20#include <compositionengine/Output.h>
Vishnu Nair9b079a22020-01-21 14:36:08 -080021#include <compositionengine/impl/ClientCompositionRequestCache.h>
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070022#include <compositionengine/impl/OutputCompositionState.h>
Vishnu Nair9b079a22020-01-21 14:36:08 -080023#include <renderengine/DisplaySettings.h>
24#include <renderengine/LayerSettings.h>
Lloyd Pique32cbe282018-10-19 13:09:22 -070025#include <memory>
Lloyd Piquecc01a452018-12-04 17:24:00 -080026#include <utility>
27#include <vector>
Lloyd Pique32cbe282018-10-19 13:09:22 -070028
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070029namespace android::compositionengine::impl {
Lloyd Pique32cbe282018-10-19 13:09:22 -070030
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070031// The implementation class contains the common implementation, but does not
32// actually contain the final output state.
Lloyd Pique32cbe282018-10-19 13:09:22 -070033class Output : public virtual compositionengine::Output {
34public:
Lloyd Piquefeb73d72018-12-04 17:23:44 -080035 ~Output() override;
Lloyd Pique32cbe282018-10-19 13:09:22 -070036
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070037 // compositionengine::Output overrides
Lloyd Pique32cbe282018-10-19 13:09:22 -070038 bool isValid() const override;
Lloyd Pique6c564cf2019-05-17 17:31:36 -070039 std::optional<DisplayId> getDisplayId() const override;
Lloyd Pique32cbe282018-10-19 13:09:22 -070040 void setCompositionEnabled(bool) override;
Lloyd Pique0a456232020-01-16 17:51:13 -080041 void setProjection(const ui::Transform&, uint32_t orientation, const Rect& frame,
Marin Shalamanov06ca1632020-07-28 12:32:01 +020042 const Rect& viewport, const Rect& destinationClip,
Lloyd Piquee8fe4742020-01-21 15:26:18 -080043 bool needsFiltering) override;
Lloyd Pique31cb2942018-10-19 17:23:03 -070044 void setBounds(const ui::Size&) override;
Lloyd Piqueef36b002019-01-23 17:52:04 -080045 void setLayerStackFilter(uint32_t layerStackId, bool isInternal) override;
Lloyd Pique32cbe282018-10-19 13:09:22 -070046
Lloyd Pique3eb1b212019-03-07 21:15:40 -080047 void setColorTransform(const compositionengine::CompositionRefreshArgs&) override;
Lloyd Pique6a3b4462019-03-07 20:58:12 -080048 void setColorProfile(const ColorProfile&) override;
Lloyd Pique32cbe282018-10-19 13:09:22 -070049
50 void dump(std::string&) const override;
51
52 const std::string& getName() const override;
53 void setName(const std::string&) override;
54
Lloyd Pique3d0c02e2018-10-19 18:38:12 -070055 compositionengine::DisplayColorProfile* getDisplayColorProfile() const override;
56 void setDisplayColorProfile(std::unique_ptr<compositionengine::DisplayColorProfile>) override;
57
Lloyd Pique31cb2942018-10-19 17:23:03 -070058 compositionengine::RenderSurface* getRenderSurface() const override;
59 void setRenderSurface(std::unique_ptr<compositionengine::RenderSurface>) override;
60
Alec Mourie7d1d4a2019-02-05 01:13:46 +000061 Region getDirtyRegion(bool repaintEverything) const override;
Lloyd Piquec6687342019-03-07 21:34:57 -080062 bool belongsInOutput(std::optional<uint32_t>, bool) const override;
Lloyd Piquede196652020-01-22 17:29:58 -080063 bool belongsInOutput(const sp<LayerFE>&) const override;
Lloyd Pique32cbe282018-10-19 13:09:22 -070064
Lloyd Piquede196652020-01-22 17:29:58 -080065 compositionengine::OutputLayer* getOutputLayerForLayer(const sp<LayerFE>&) const override;
Lloyd Piquecc01a452018-12-04 17:24:00 -080066
Lloyd Piquec7ef21b2019-01-29 18:43:00 -080067 void setReleasedLayers(ReleasedLayers&&) override;
Lloyd Piquec7ef21b2019-01-29 18:43:00 -080068
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070069 void prepare(const CompositionRefreshArgs&, LayerFESet&) override;
70 void present(const CompositionRefreshArgs&) override;
Lloyd Piqued7b429f2019-03-07 21:11:02 -080071
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070072 void rebuildLayerStacks(const CompositionRefreshArgs&, LayerFESet&) override;
73 void collectVisibleLayers(const CompositionRefreshArgs&,
Lloyd Piquec29e4c62019-03-07 21:48:19 -080074 compositionengine::Output::CoverageState&) override;
Lloyd Piquede196652020-01-22 17:29:58 -080075 void ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>&,
Lloyd Pique01c77c12019-04-17 12:48:32 -070076 compositionengine::Output::CoverageState&) override;
Lloyd Piquec29e4c62019-03-07 21:48:19 -080077 void setReleasedLayers(const compositionengine::CompositionRefreshArgs&) override;
78
Lloyd Pique3eb1b212019-03-07 21:15:40 -080079 void updateLayerStateFromFE(const CompositionRefreshArgs&) const override;
80 void updateAndWriteCompositionState(const compositionengine::CompositionRefreshArgs&) override;
Lloyd Pique6a3b4462019-03-07 20:58:12 -080081 void updateColorProfile(const compositionengine::CompositionRefreshArgs&) override;
Lloyd Piqued0a92a02019-02-19 17:47:26 -080082 void beginFrame() override;
Lloyd Pique66d68602019-02-13 14:23:31 -080083 void prepareFrame() override;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -070084 void devOptRepaintFlash(const CompositionRefreshArgs&) override;
85 void finishFrame(const CompositionRefreshArgs&) override;
Lucas Dupin2dd6f392020-02-18 17:43:36 -080086 std::optional<base::unique_fd> composeSurfaces(
87 const Region&, const compositionengine::CompositionRefreshArgs& refreshArgs) override;
Lloyd Pique35fca9d2019-02-13 14:24:11 -080088 void postFramebuffer() override;
Vishnu Nair9b079a22020-01-21 14:36:08 -080089 void cacheClientCompositionRequests(uint32_t) override;
Lloyd Pique66d68602019-02-13 14:23:31 -080090
Lloyd Pique31cb2942018-10-19 17:23:03 -070091 // Testing
Lloyd Piquec29e4c62019-03-07 21:48:19 -080092 const ReleasedLayers& getReleasedLayersForTest() const;
Lloyd Pique3d0c02e2018-10-19 18:38:12 -070093 void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>);
Lloyd Pique31cb2942018-10-19 17:23:03 -070094 void setRenderSurfaceForTest(std::unique_ptr<compositionengine::RenderSurface>);
95
Lloyd Pique32cbe282018-10-19 13:09:22 -070096protected:
Lloyd Piquede196652020-01-22 17:29:58 -080097 std::unique_ptr<compositionengine::OutputLayer> createOutputLayer(const sp<LayerFE>&) const;
98 std::optional<size_t> findCurrentOutputLayerForLayer(
99 const sp<compositionengine::LayerFE>&) const;
Lloyd Pique66d68602019-02-13 14:23:31 -0800100 void chooseCompositionStrategy() override;
Lloyd Pique688abd42019-02-15 15:42:24 -0800101 bool getSkipColorTransform() const override;
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800102 compositionengine::Output::FrameFences presentAndGetFrameFences() override;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800103 std::vector<LayerFE::LayerSettings> generateClientCompositionRequests(
Vishnu Nair3a7346c2019-12-04 08:09:09 -0800104 bool supportsProtectedContent, Region& clearRegion,
105 ui::Dataspace outputDataspace) override;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800106 void appendRegionFlashRequests(const Region&, std::vector<LayerFE::LayerSettings>&) override;
Lloyd Pique688abd42019-02-15 15:42:24 -0800107 void setExpensiveRenderingExpected(bool enabled) override;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700108 void dumpBase(std::string&) const;
109
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700110 // Implemented by the final implementation for the final state it uses.
Lloyd Piquede196652020-01-22 17:29:58 -0800111 virtual compositionengine::OutputLayer* ensureOutputLayer(std::optional<size_t>,
112 const sp<LayerFE>&) = 0;
113 virtual compositionengine::OutputLayer* injectOutputLayerForTest(const sp<LayerFE>&) = 0;
Lloyd Pique01c77c12019-04-17 12:48:32 -0700114 virtual void finalizePendingOutputLayers() = 0;
115 virtual const compositionengine::CompositionEngine& getCompositionEngine() const = 0;
116 virtual void dumpState(std::string& out) const = 0;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700117
Lloyd Pique32cbe282018-10-19 13:09:22 -0700118private:
119 void dirtyEntireOutput();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800120 compositionengine::OutputLayer* findLayerRequestingBackgroundComposition() const;
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800121 ui::Dataspace getBestDataspace(ui::Dataspace*, bool*) const;
122 compositionengine::Output::ColorProfile pickColorProfile(
123 const compositionengine::CompositionRefreshArgs&) const;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700124
Lloyd Pique32cbe282018-10-19 13:09:22 -0700125 std::string mName;
126
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700127 std::unique_ptr<compositionengine::DisplayColorProfile> mDisplayColorProfile;
Lloyd Pique31cb2942018-10-19 17:23:03 -0700128 std::unique_ptr<compositionengine::RenderSurface> mRenderSurface;
Lloyd Piquecc01a452018-12-04 17:24:00 -0800129
Lloyd Piquec7ef21b2019-01-29 18:43:00 -0800130 ReleasedLayers mReleasedLayers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800131 OutputLayer* mLayerRequestingBackgroundBlur = nullptr;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800132 std::unique_ptr<ClientCompositionRequestCache> mClientCompositionRequestCache;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700133};
134
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700135// This template factory function standardizes the implementation details of the
136// final class using the types actually required by the implementation. This is
137// not possible to do in the base class as those types may not even be visible
138// to the base code.
139template <typename BaseOutput, typename CompositionEngine, typename... Args>
140std::shared_ptr<BaseOutput> createOutputTemplated(const CompositionEngine& compositionEngine,
141 Args... args) {
142 class Output final : public BaseOutput {
143 public:
144// Clang incorrectly complains that these are unused.
145#pragma clang diagnostic push
146#pragma clang diagnostic ignored "-Wunused-local-typedef"
147
148 using OutputCompositionState = std::remove_const_t<
149 std::remove_reference_t<decltype(std::declval<BaseOutput>().getState())>>;
Lloyd Pique01c77c12019-04-17 12:48:32 -0700150 using OutputLayer = std::remove_pointer_t<decltype(
151 std::declval<BaseOutput>().getOutputLayerOrderedByZByIndex(0))>;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700152
153#pragma clang diagnostic pop
154
155 explicit Output(const CompositionEngine& compositionEngine, Args... args)
156 : BaseOutput(std::forward<Args>(args)...), mCompositionEngine(compositionEngine) {}
157 ~Output() override = default;
158
159 private:
160 // compositionengine::Output overrides
161 const OutputCompositionState& getState() const override { return mState; }
Lloyd Pique01c77c12019-04-17 12:48:32 -0700162
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700163 OutputCompositionState& editState() override { return mState; }
164
Lloyd Pique01c77c12019-04-17 12:48:32 -0700165 size_t getOutputLayerCount() const override {
166 return mCurrentOutputLayersOrderedByZ.size();
167 }
168
169 OutputLayer* getOutputLayerOrderedByZByIndex(size_t index) const override {
170 if (index >= mCurrentOutputLayersOrderedByZ.size()) {
171 return nullptr;
172 }
173 return mCurrentOutputLayersOrderedByZ[index].get();
174 }
175
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700176 // compositionengine::impl::Output overrides
177 const CompositionEngine& getCompositionEngine() const override {
178 return mCompositionEngine;
179 };
Lloyd Pique01c77c12019-04-17 12:48:32 -0700180
181 OutputLayer* ensureOutputLayer(std::optional<size_t> prevIndex,
Lloyd Pique01c77c12019-04-17 12:48:32 -0700182 const sp<LayerFE>& layerFE) {
183 auto outputLayer = (prevIndex && *prevIndex <= mCurrentOutputLayersOrderedByZ.size())
184 ? std::move(mCurrentOutputLayersOrderedByZ[*prevIndex])
Lloyd Piquede196652020-01-22 17:29:58 -0800185 : BaseOutput::createOutputLayer(layerFE);
Lloyd Pique01c77c12019-04-17 12:48:32 -0700186 auto result = outputLayer.get();
187 mPendingOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));
188 return result;
189 }
190
191 void finalizePendingOutputLayers() override {
192 // The pending layers are added in reverse order. Reverse them to
193 // get the back-to-front ordered list of layers.
194 std::reverse(mPendingOutputLayersOrderedByZ.begin(),
195 mPendingOutputLayersOrderedByZ.end());
196
197 mCurrentOutputLayersOrderedByZ = std::move(mPendingOutputLayersOrderedByZ);
198 }
199
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700200 void dumpState(std::string& out) const override { mState.dump(out); }
201
Lloyd Piquede196652020-01-22 17:29:58 -0800202 OutputLayer* injectOutputLayerForTest(const sp<LayerFE>& layerFE) override {
203 auto outputLayer = BaseOutput::createOutputLayer(layerFE);
Lloyd Pique01c77c12019-04-17 12:48:32 -0700204 auto result = outputLayer.get();
205 mCurrentOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));
206 return result;
207 }
208
209 // Note: This is declared as a private virtual non-override so it can be
210 // an override implementation in the unit tests, but otherwise is not an
211 // accessible override for the normal implementation.
212 virtual void injectOutputLayerForTest(std::unique_ptr<OutputLayer> outputLayer) {
213 mCurrentOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));
214 }
215
216 void clearOutputLayers() override {
217 mCurrentOutputLayersOrderedByZ.clear();
218 mPendingOutputLayersOrderedByZ.clear();
219 }
220
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700221 const CompositionEngine& mCompositionEngine;
222 OutputCompositionState mState;
Lloyd Pique01c77c12019-04-17 12:48:32 -0700223 std::vector<std::unique_ptr<OutputLayer>> mCurrentOutputLayersOrderedByZ;
224 std::vector<std::unique_ptr<OutputLayer>> mPendingOutputLayersOrderedByZ;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700225 };
226
227 return std::make_shared<Output>(compositionEngine, std::forward<Args>(args)...);
228}
229
230std::shared_ptr<Output> createOutput(const compositionengine::CompositionEngine&);
231
232} // namespace android::compositionengine::impl