1/*
2 * Copyright (C) 2016 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#include <sstream>
18
19#include "Hwc2TestLayer.h"
20
21Hwc2TestCoverage getCoverage(Hwc2TestPropertyName property,
22        Hwc2TestCoverage coverage, const std::unordered_map<Hwc2TestPropertyName,
23        Hwc2TestCoverage>& coverageExceptions) {
24    auto exception = coverageExceptions.find(property);
25    return (exception != coverageExceptions.end())? exception->second : coverage;
26}
27
28Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage,
29        const Area& displayArea)
30    : Hwc2TestLayer(coverage, displayArea,
31            std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { }
32
33Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage,
34        const Area& displayArea, const std::unordered_map<Hwc2TestPropertyName,
35        Hwc2TestCoverage>& coverageExceptions)
36    : mBlendMode(getCoverage(Hwc2TestPropertyName::BlendMode, coverage,
37           coverageExceptions)),
38      mBufferArea(getCoverage(Hwc2TestPropertyName::BufferArea, coverage,
39           coverageExceptions), displayArea),
40      mColor(getCoverage(Hwc2TestPropertyName::Color, coverage,
41           coverageExceptions)),
42      mComposition(getCoverage(Hwc2TestPropertyName::Composition, coverage,
43           coverageExceptions)),
44      mDataspace(getCoverage(Hwc2TestPropertyName::Dataspace, coverage,
45           coverageExceptions)),
46      mDisplayFrame(getCoverage(Hwc2TestPropertyName::DisplayFrame, coverage,
47           coverageExceptions), displayArea),
48      mPlaneAlpha(getCoverage(Hwc2TestPropertyName::PlaneAlpha, coverage,
49           coverageExceptions)),
50      mSourceCrop(getCoverage(Hwc2TestPropertyName::SourceCrop, coverage,
51           coverageExceptions)),
52      mSurfaceDamage(getCoverage(Hwc2TestPropertyName::SurfaceDamage, coverage,
53           coverageExceptions)),
54      mTransform(getCoverage(Hwc2TestPropertyName::Transform, coverage,
55           coverageExceptions))
56{
57    mBufferArea.setDependent(&mBuffer);
58    mBufferArea.setDependent(&mSourceCrop);
59    mBufferArea.setDependent(&mSurfaceDamage);
60    mBlendMode.setDependent(&mColor);
61}
62
63std::string Hwc2TestLayer::dump() const
64{
65    std::stringstream dmp;
66
67    dmp << "layer: \n";
68
69    for (auto property : mProperties) {
70        dmp << property->dump();
71    }
72
73    dmp << mVisibleRegion.dump();
74    dmp << "\tz order: " << mZOrder << "\n";
75
76    return dmp.str();
77}
78
79int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle,
80        android::base::unique_fd* outAcquireFence)
81{
82    int32_t acquireFence;
83    int ret = mBuffer.get(outHandle, &acquireFence);
84    outAcquireFence->reset(acquireFence);
85    return ret;
86}
87
88int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle,
89        int32_t* outAcquireFence)
90{
91    return mBuffer.get(outHandle, outAcquireFence);
92}
93
94void Hwc2TestLayer::setZOrder(uint32_t zOrder)
95{
96    mZOrder = zOrder;
97}
98
99void Hwc2TestLayer::setVisibleRegion(const android::Region& region)
100{
101    return mVisibleRegion.set(region);
102}
103
104void Hwc2TestLayer::reset()
105{
106    mVisibleRegion.release();
107
108    for (auto property : mProperties) {
109        property->reset();
110    }
111}
112
113bool Hwc2TestLayer::advance()
114{
115    for (auto property : mProperties) {
116        if (property->isSupported(mComposition.get()))
117            if (property->advance())
118                return true;
119    }
120    return false;
121}
122
123hwc2_blend_mode_t Hwc2TestLayer::getBlendMode() const
124{
125    return mBlendMode.get();
126}
127
128Area Hwc2TestLayer::getBufferArea() const
129{
130    return mBufferArea.get();
131}
132
133hwc_color_t Hwc2TestLayer::getColor() const
134{
135    return mColor.get();
136}
137
138hwc2_composition_t Hwc2TestLayer::getComposition() const
139{
140    return mComposition.get();
141}
142
143/* The cursor position corresponds to {displayFrame.left, displayFrame.top} */
144hwc_rect_t Hwc2TestLayer::getCursorPosition() const
145{
146    return mDisplayFrame.get();
147}
148
149android_dataspace_t Hwc2TestLayer::getDataspace() const
150{
151    return mDataspace.get();
152}
153
154hwc_rect_t Hwc2TestLayer::getDisplayFrame() const
155{
156    return mDisplayFrame.get();
157}
158
159float Hwc2TestLayer::getPlaneAlpha() const
160{
161    return mPlaneAlpha.get();
162}
163
164hwc_frect_t Hwc2TestLayer::getSourceCrop() const
165{
166    return mSourceCrop.get();
167}
168
169hwc_region_t Hwc2TestLayer::getSurfaceDamage() const
170{
171    return mSurfaceDamage.get();
172}
173
174hwc_transform_t Hwc2TestLayer::getTransform() const
175{
176    return mTransform.get();
177}
178
179hwc_region_t Hwc2TestLayer::getVisibleRegion() const
180{
181    return mVisibleRegion.get();
182}
183
184uint32_t Hwc2TestLayer::getZOrder() const
185{
186    return mZOrder;
187}
188
189bool Hwc2TestLayer::advanceBlendMode()
190{
191    return mBlendMode.advance();
192}
193
194bool Hwc2TestLayer::advanceBufferArea()
195{
196    return mBufferArea.advance();
197}
198
199bool Hwc2TestLayer::advanceColor()
200{
201    return mColor.advance();
202}
203
204bool Hwc2TestLayer::advanceComposition()
205{
206    return mComposition.advance();
207}
208
209bool Hwc2TestLayer::advanceCursorPosition()
210{
211    return mDisplayFrame.advance();
212}
213
214bool Hwc2TestLayer::advanceDataspace()
215{
216    return mDataspace.advance();
217}
218
219bool Hwc2TestLayer::advanceDisplayFrame()
220{
221    return mDisplayFrame.advance();
222}
223
224bool Hwc2TestLayer::advancePlaneAlpha()
225{
226    return mPlaneAlpha.advance();
227}
228
229bool Hwc2TestLayer::advanceSourceCrop()
230{
231    return mSourceCrop.advance();
232}
233
234bool Hwc2TestLayer::advanceSurfaceDamage()
235{
236    return mSurfaceDamage.advance();
237}
238
239bool Hwc2TestLayer::advanceTransform()
240{
241    return mTransform.advance();
242}
243
244bool Hwc2TestLayer::advanceVisibleRegion()
245{
246    if (mPlaneAlpha.advance())
247        return true;
248    return mDisplayFrame.advance();
249}
250