1 /*
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 
19 #include <memory>
20 #include <utility>
21 #include <vector>
22 
23 #include <compositionengine/Output.h>
24 #include <compositionengine/impl/OutputCompositionState.h>
25 
26 namespace android::compositionengine {
27 
28 class CompositionEngine;
29 class Layer;
30 class OutputLayer;
31 
32 namespace impl {
33 
34 class Output : public virtual compositionengine::Output {
35 public:
36     Output(const CompositionEngine&);
37     ~Output() override;
38 
39     bool isValid() const override;
40 
41     void setCompositionEnabled(bool) override;
42     void setProjection(const ui::Transform&, int32_t orientation, const Rect& frame,
43                        const Rect& viewport, const Rect& scissor, bool needsFiltering) override;
44     void setBounds(const ui::Size&) override;
45     void setLayerStackFilter(uint32_t layerStackId, bool isInternal) override;
46 
47     void setColorTransform(const mat4&) override;
48     void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent) override;
49 
50     void dump(std::string&) const override;
51 
52     const std::string& getName() const override;
53     void setName(const std::string&) override;
54 
55     compositionengine::DisplayColorProfile* getDisplayColorProfile() const override;
56     void setDisplayColorProfile(std::unique_ptr<compositionengine::DisplayColorProfile>) override;
57 
58     compositionengine::RenderSurface* getRenderSurface() const override;
59     void setRenderSurface(std::unique_ptr<compositionengine::RenderSurface>) override;
60 
61     const OutputCompositionState& getState() const override;
62     OutputCompositionState& editState() override;
63 
64     Region getDirtyRegion(bool repaintEverything) const override;
65     bool belongsInOutput(uint32_t, bool) const override;
66 
67     compositionengine::OutputLayer* getOutputLayerForLayer(
68             compositionengine::Layer*) const override;
69     std::unique_ptr<compositionengine::OutputLayer> getOrCreateOutputLayer(
70             std::optional<DisplayId>, std::shared_ptr<compositionengine::Layer>,
71             sp<LayerFE>) override;
72     void setOutputLayersOrderedByZ(OutputLayers&&) override;
73     const OutputLayers& getOutputLayersOrderedByZ() const override;
74 
75     // Testing
76     void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>);
77     void setRenderSurfaceForTest(std::unique_ptr<compositionengine::RenderSurface>);
78 
79 protected:
80     const CompositionEngine& getCompositionEngine() const;
81     void dumpBase(std::string&) const;
82 
83 private:
84     void dirtyEntireOutput();
85 
86     const CompositionEngine& mCompositionEngine;
87 
88     std::string mName;
89 
90     OutputCompositionState mState;
91 
92     std::unique_ptr<compositionengine::DisplayColorProfile> mDisplayColorProfile;
93     std::unique_ptr<compositionengine::RenderSurface> mRenderSurface;
94 
95     OutputLayers mOutputLayersOrderedByZ;
96 };
97 
98 } // namespace impl
99 } // namespace android::compositionengine
100