blob: 10da49dc5c6c4360c087e235a1eae39d8779932b [file] [log] [blame]
Lloyd Piquecc01a452018-12-04 17:24:00 -08001/*
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
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080017#include <android-base/stringprintf.h>
Lloyd Pique07e33212018-12-18 16:33:37 -080018#include <compositionengine/CompositionEngine.h>
Lloyd Piquecc01a452018-12-04 17:24:00 -080019#include <compositionengine/Layer.h>
20#include <compositionengine/LayerFE.h>
21#include <compositionengine/Output.h>
22#include <compositionengine/impl/OutputLayer.h>
23
Lloyd Pique07e33212018-12-18 16:33:37 -080024#include "DisplayHardware/HWComposer.h"
25
Lloyd Piquecc01a452018-12-04 17:24:00 -080026namespace android::compositionengine {
27
28OutputLayer::~OutputLayer() = default;
29
30namespace impl {
31
32std::unique_ptr<compositionengine::OutputLayer> createOutputLayer(
Lloyd Pique07e33212018-12-18 16:33:37 -080033 const CompositionEngine& compositionEngine, std::optional<DisplayId> displayId,
34 const compositionengine::Output& output, std::shared_ptr<compositionengine::Layer> layer,
Lloyd Piquecc01a452018-12-04 17:24:00 -080035 sp<compositionengine::LayerFE> layerFE) {
Lloyd Pique07e33212018-12-18 16:33:37 -080036 auto result = std::make_unique<OutputLayer>(output, layer, layerFE);
37 result->initialize(compositionEngine, displayId);
38 return result;
Lloyd Piquecc01a452018-12-04 17:24:00 -080039}
40
41OutputLayer::OutputLayer(const Output& output, std::shared_ptr<Layer> layer, sp<LayerFE> layerFE)
42 : mOutput(output), mLayer(layer), mLayerFE(layerFE) {}
43
44OutputLayer::~OutputLayer() = default;
45
Lloyd Pique07e33212018-12-18 16:33:37 -080046void OutputLayer::initialize(const CompositionEngine& compositionEngine,
47 std::optional<DisplayId> displayId) {
48 if (!displayId) {
49 return;
50 }
51
52 auto& hwc = compositionEngine.getHwComposer();
53
54 mState.hwc.emplace(std::shared_ptr<HWC2::Layer>(hwc.createLayer(*displayId),
55 [&hwc, displayId](HWC2::Layer* layer) {
56 hwc.destroyLayer(*displayId, layer);
57 }));
58}
59
Lloyd Piquecc01a452018-12-04 17:24:00 -080060const compositionengine::Output& OutputLayer::getOutput() const {
61 return mOutput;
62}
63
64compositionengine::Layer& OutputLayer::getLayer() const {
65 return *mLayer;
66}
67
68compositionengine::LayerFE& OutputLayer::getLayerFE() const {
69 return *mLayerFE;
70}
71
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080072const OutputLayerCompositionState& OutputLayer::getState() const {
73 return mState;
74}
75
76OutputLayerCompositionState& OutputLayer::editState() {
77 return mState;
78}
79
80void OutputLayer::dump(std::string& out) const {
81 using android::base::StringAppendF;
82
83 StringAppendF(&out, " Output Layer %p\n", this);
84 mState.dump(out);
85}
86
Lloyd Piquecc01a452018-12-04 17:24:00 -080087} // namespace impl
88} // namespace android::compositionengine