blob: 96cd98d0a73313d44ffce84440b923756f352d74 [file] [log] [blame]
Marissa Wall273b1df2016-12-15 12:28:47 -08001/* * Copyright (C) 2016 The Android Open Source Project
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <sstream>
17#include <gtest/gtest.h>
18
19#include "Hwc2TestLayers.h"
20
21Hwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
Marissa Wall600a73b2016-12-15 12:30:39 -080022 Hwc2TestCoverage coverage, const Area& displayArea)
Marissa Wall1cd789c2017-01-27 12:55:36 -080023 : mDisplayArea(displayArea)
Marissa Wall273b1df2016-12-15 12:28:47 -080024{
Marissa Wall273b1df2016-12-15 12:28:47 -080025 for (auto layer : layers) {
26 mTestLayers.emplace(std::piecewise_construct,
27 std::forward_as_tuple(layer),
Marissa Wallf7618ed2016-12-15 12:34:39 -080028 std::forward_as_tuple(coverage, displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -080029 }
Marissa Wallf7618ed2016-12-15 12:34:39 -080030
31 /* Iterate over the layers in order and assign z orders in the same order.
32 * This allows us to iterate over z orders in the same way when computing
33 * visible regions */
34 uint32_t nextZOrder = layers.size();
35
36 for (auto& testLayer : mTestLayers) {
37 testLayer.second.setZOrder(nextZOrder--);
38 }
39
40 setVisibleRegions();
Marissa Wall273b1df2016-12-15 12:28:47 -080041}
42
43std::string Hwc2TestLayers::dump() const
44{
45 std::stringstream dmp;
46 for (auto& testLayer : mTestLayers) {
47 dmp << testLayer.second.dump();
48 }
49 return dmp.str();
50}
51
52void Hwc2TestLayers::reset()
53{
54 for (auto& testLayer : mTestLayers) {
55 testLayer.second.reset();
56 }
Marissa Wallf7618ed2016-12-15 12:34:39 -080057
58 setVisibleRegions();
59}
60
Marissa Wall1cd789c2017-01-27 12:55:36 -080061bool Hwc2TestLayers::advance()
62{
Marissa Wallf18cfb02017-02-21 14:01:05 -080063 auto itr = mTestLayers.begin();
64 bool optimized;
65
66 while (itr != mTestLayers.end()) {
67 if (itr->second.advance()) {
68 optimized = setVisibleRegions();
69 if (!mOptimize || optimized)
70 return true;
71 itr = mTestLayers.begin();
72 } else {
73 itr->second.reset();
74 ++itr;
Marissa Wall1cd789c2017-01-27 12:55:36 -080075 }
Marissa Wall1cd789c2017-01-27 12:55:36 -080076 }
77 return false;
78}
79
Marissa Wallf7618ed2016-12-15 12:34:39 -080080bool Hwc2TestLayers::advanceVisibleRegions()
81{
Marissa Wallf18cfb02017-02-21 14:01:05 -080082 auto itr = mTestLayers.begin();
83 bool optimized;
84
85 while (itr != mTestLayers.end()) {
86 if (itr->second.advanceVisibleRegion()) {
87 optimized = setVisibleRegions();
88 if (!mOptimize || optimized)
89 return true;
90 itr = mTestLayers.begin();
91 } else {
92 itr->second.reset();
93 ++itr;
Marissa Wallf7618ed2016-12-15 12:34:39 -080094 }
Marissa Wallf7618ed2016-12-15 12:34:39 -080095 }
96 return false;
97}
98
Marissa Wallf18cfb02017-02-21 14:01:05 -080099/* Removes layouts that do not cover the entire display.
100 * Also removes layouts where a layer is completely blocked from view.
101 */
102bool Hwc2TestLayers::optimizeLayouts()
103{
104 mOptimize = true;
105
106 if (setVisibleRegions())
107 return true;
108 return advance();
109}
110
Marissa Wall1cd789c2017-01-27 12:55:36 -0800111bool Hwc2TestLayers::contains(hwc2_layer_t layer) const
112{
113 return mTestLayers.count(layer) != 0;
114}
115
116int Hwc2TestLayers::getBuffer(hwc2_layer_t layer, buffer_handle_t* outHandle,
117 int32_t* outAcquireFence)
118{
119 if (mTestLayers.count(layer) == 0) {
120 []() { GTEST_FAIL(); }();
121 }
122 return mTestLayers.at(layer).getBuffer(outHandle, outAcquireFence);
123}
124
125hwc2_blend_mode_t Hwc2TestLayers::getBlendMode(hwc2_layer_t layer) const
126{
127 if (mTestLayers.count(layer) == 0) {
128 []() { GTEST_FAIL(); }();
129 }
130 return mTestLayers.at(layer).getBlendMode();
131}
132
Marissa Wallf18cfb02017-02-21 14:01:05 -0800133Area Hwc2TestLayers::getBufferArea(hwc2_layer_t layer) const
134{
135 auto testLayer = mTestLayers.find(layer);
136 if (testLayer == mTestLayers.end())
137 [] () { GTEST_FAIL(); }();
138 return testLayer->second.getBufferArea();
139}
140
Marissa Wall1cd789c2017-01-27 12:55:36 -0800141hwc_color_t Hwc2TestLayers::getColor(hwc2_layer_t layer) const
142{
143 if (mTestLayers.count(layer) == 0) {
144 []() { GTEST_FAIL(); }();
145 }
146 return mTestLayers.at(layer).getColor();
147}
148
149hwc2_composition_t Hwc2TestLayers::getComposition(hwc2_layer_t layer) const
150{
151 if (mTestLayers.count(layer) == 0) {
152 []() { GTEST_FAIL(); }();
153 }
154 return mTestLayers.at(layer).getComposition();
155}
156
157hwc_rect_t Hwc2TestLayers::getCursorPosition(hwc2_layer_t layer) const
158{
159 if (mTestLayers.count(layer) == 0) {
160 []() { GTEST_FAIL(); }();
161 }
162 return mTestLayers.at(layer).getCursorPosition();
163}
164
165android_dataspace_t Hwc2TestLayers::getDataspace(hwc2_layer_t layer) const
166{
167 if (mTestLayers.count(layer) == 0) {
168 []() { GTEST_FAIL(); }();
169 }
170 return mTestLayers.at(layer).getDataspace();
171}
172
173hwc_rect_t Hwc2TestLayers::getDisplayFrame(hwc2_layer_t layer) const
174{
175 if (mTestLayers.count(layer) == 0) {
176 []() { GTEST_FAIL(); }();
177 }
178 return mTestLayers.at(layer).getDisplayFrame();
179}
180
181float Hwc2TestLayers::getPlaneAlpha(hwc2_layer_t layer) const
182{
183 if (mTestLayers.count(layer) == 0) {
184 []() { GTEST_FAIL(); }();
185 }
186 return mTestLayers.at(layer).getPlaneAlpha();
187}
188
189hwc_frect_t Hwc2TestLayers::getSourceCrop(hwc2_layer_t layer) const
190{
191 if (mTestLayers.count(layer) == 0) {
192 []() { GTEST_FAIL(); }();
193 }
194 return mTestLayers.at(layer).getSourceCrop();
195}
196
197hwc_region_t Hwc2TestLayers::getSurfaceDamage(hwc2_layer_t layer) const
198{
199 if (mTestLayers.count(layer) == 0) {
200 []() { GTEST_FAIL(); }();
201 }
202 return mTestLayers.at(layer).getSurfaceDamage();
203}
204
205hwc_transform_t Hwc2TestLayers::getTransform(hwc2_layer_t layer) const
206{
207 if (mTestLayers.count(layer) == 0) {
208 []() { GTEST_FAIL(); }();
209 }
210 return mTestLayers.at(layer).getTransform();
211}
212
Marissa Wallf7618ed2016-12-15 12:34:39 -0800213hwc_region_t Hwc2TestLayers::getVisibleRegion(hwc2_layer_t layer) const
214{
215 if (mTestLayers.count(layer) == 0) {
216 []() { GTEST_FAIL(); }();
217 }
218 return mTestLayers.at(layer).getVisibleRegion();
Marissa Wall273b1df2016-12-15 12:28:47 -0800219}
220
221uint32_t Hwc2TestLayers::getZOrder(hwc2_layer_t layer) const
222{
223 if (mTestLayers.count(layer) == 0) {
224 []() { GTEST_FAIL(); }();
225 }
226 return mTestLayers.at(layer).getZOrder();
227}
Marissa Wallf7618ed2016-12-15 12:34:39 -0800228
Marissa Wallf18cfb02017-02-21 14:01:05 -0800229/* Sets the visible regions for a display. Returns false if the layers do not
230 * cover the entire display or if a layer is not visible */
231bool Hwc2TestLayers::setVisibleRegions()
Marissa Wallf7618ed2016-12-15 12:34:39 -0800232{
233 /* The region of the display that is covered by layers above the current
234 * layer */
235 android::Region aboveOpaqueLayers;
236
Marissa Wallf18cfb02017-02-21 14:01:05 -0800237 bool optimized = true;
238
Marissa Wallf7618ed2016-12-15 12:34:39 -0800239 /* Iterate over test layers from max z order to min z order. */
240 for (auto& testLayer : mTestLayers) {
241 android::Region visibleRegion;
242
243 /* Set the visible region of this layer */
244 const hwc_rect_t displayFrame = testLayer.second.getDisplayFrame();
245
246 visibleRegion.set(android::Rect(displayFrame.left, displayFrame.top,
247 displayFrame.right, displayFrame.bottom));
248
249 /* Remove the area covered by opaque layers above this layer
250 * from this layer's visible region */
251 visibleRegion.subtractSelf(aboveOpaqueLayers);
252
253 testLayer.second.setVisibleRegion(visibleRegion);
254
Marissa Wallf18cfb02017-02-21 14:01:05 -0800255 /* If a layer is not visible, return false */
256 if (visibleRegion.isEmpty())
257 optimized = false;
258
Marissa Wallf7618ed2016-12-15 12:34:39 -0800259 /* If this layer is opaque, store the region it covers */
260 if (testLayer.second.getPlaneAlpha() == 1.0f)
261 aboveOpaqueLayers.orSelf(visibleRegion);
262 }
Marissa Wallf18cfb02017-02-21 14:01:05 -0800263
264 /* If the opaque region does not cover the entire display return false */
265 if (!aboveOpaqueLayers.isRect())
266 return false;
267
268 const auto rect = aboveOpaqueLayers.begin();
269 if (rect->left != 0 || rect->top != 0 || rect->right != mDisplayArea.width
270 || rect->bottom != mDisplayArea.height)
271 return false;
272
273 return optimized;
Marissa Wallf7618ed2016-12-15 12:34:39 -0800274}