blob: b76ace8752364173ce23c142aeb3c02936f99707 [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
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080016// TODO(b/129481165): remove the #pragma below and fix conversion issues
17#pragma clang diagnostic push
18#pragma clang diagnostic ignored "-Wconversion"
19
Marissa Wall273b1df2016-12-15 12:28:47 -080020#include <sstream>
21#include <gtest/gtest.h>
22
23#include "Hwc2TestLayers.h"
24
25Hwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
Marissa Wall600a73b2016-12-15 12:30:39 -080026 Hwc2TestCoverage coverage, const Area& displayArea)
Marissa Wall563030b2017-02-21 14:01:05 -080027 : Hwc2TestLayers(layers, coverage, displayArea,
28 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { }
29
30Hwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
31 Hwc2TestCoverage coverage, const Area& displayArea,
32 const std::unordered_map<Hwc2TestPropertyName,
33 Hwc2TestCoverage>& coverageExceptions)
Marissa Wall1cd789c2017-01-27 12:55:36 -080034 : mDisplayArea(displayArea)
Marissa Wall273b1df2016-12-15 12:28:47 -080035{
Marissa Wall273b1df2016-12-15 12:28:47 -080036 for (auto layer : layers) {
37 mTestLayers.emplace(std::piecewise_construct,
38 std::forward_as_tuple(layer),
Marissa Wall563030b2017-02-21 14:01:05 -080039 std::forward_as_tuple(coverage, displayArea, coverageExceptions));
Marissa Wall273b1df2016-12-15 12:28:47 -080040 }
Marissa Wallf7618ed2016-12-15 12:34:39 -080041
42 /* Iterate over the layers in order and assign z orders in the same order.
43 * This allows us to iterate over z orders in the same way when computing
44 * visible regions */
45 uint32_t nextZOrder = layers.size();
46
47 for (auto& testLayer : mTestLayers) {
48 testLayer.second.setZOrder(nextZOrder--);
49 }
50
51 setVisibleRegions();
Marissa Wall273b1df2016-12-15 12:28:47 -080052}
53
54std::string Hwc2TestLayers::dump() const
55{
56 std::stringstream dmp;
57 for (auto& testLayer : mTestLayers) {
58 dmp << testLayer.second.dump();
59 }
60 return dmp.str();
61}
62
63void Hwc2TestLayers::reset()
64{
65 for (auto& testLayer : mTestLayers) {
66 testLayer.second.reset();
67 }
Marissa Wallf7618ed2016-12-15 12:34:39 -080068
69 setVisibleRegions();
70}
71
Marissa Wall1cd789c2017-01-27 12:55:36 -080072bool Hwc2TestLayers::advance()
73{
Marissa Wallf18cfb02017-02-21 14:01:05 -080074 auto itr = mTestLayers.begin();
75 bool optimized;
76
77 while (itr != mTestLayers.end()) {
78 if (itr->second.advance()) {
79 optimized = setVisibleRegions();
80 if (!mOptimize || optimized)
81 return true;
82 itr = mTestLayers.begin();
83 } else {
84 itr->second.reset();
85 ++itr;
Marissa Wall1cd789c2017-01-27 12:55:36 -080086 }
Marissa Wall1cd789c2017-01-27 12:55:36 -080087 }
88 return false;
89}
90
Marissa Wallf7618ed2016-12-15 12:34:39 -080091bool Hwc2TestLayers::advanceVisibleRegions()
92{
Marissa Wallf18cfb02017-02-21 14:01:05 -080093 auto itr = mTestLayers.begin();
94 bool optimized;
95
96 while (itr != mTestLayers.end()) {
97 if (itr->second.advanceVisibleRegion()) {
98 optimized = setVisibleRegions();
99 if (!mOptimize || optimized)
100 return true;
101 itr = mTestLayers.begin();
102 } else {
103 itr->second.reset();
104 ++itr;
Marissa Wallf7618ed2016-12-15 12:34:39 -0800105 }
Marissa Wallf7618ed2016-12-15 12:34:39 -0800106 }
107 return false;
108}
109
Marissa Wallf18cfb02017-02-21 14:01:05 -0800110/* Removes layouts that do not cover the entire display.
111 * Also removes layouts where a layer is completely blocked from view.
112 */
113bool Hwc2TestLayers::optimizeLayouts()
114{
115 mOptimize = true;
116
117 if (setVisibleRegions())
118 return true;
119 return advance();
120}
121
Marissa Wall1cd789c2017-01-27 12:55:36 -0800122bool Hwc2TestLayers::contains(hwc2_layer_t layer) const
123{
124 return mTestLayers.count(layer) != 0;
125}
126
127int Hwc2TestLayers::getBuffer(hwc2_layer_t layer, buffer_handle_t* outHandle,
128 int32_t* outAcquireFence)
129{
130 if (mTestLayers.count(layer) == 0) {
131 []() { GTEST_FAIL(); }();
132 }
133 return mTestLayers.at(layer).getBuffer(outHandle, outAcquireFence);
134}
135
136hwc2_blend_mode_t Hwc2TestLayers::getBlendMode(hwc2_layer_t layer) const
137{
138 if (mTestLayers.count(layer) == 0) {
139 []() { GTEST_FAIL(); }();
140 }
141 return mTestLayers.at(layer).getBlendMode();
142}
143
Marissa Wallf18cfb02017-02-21 14:01:05 -0800144Area Hwc2TestLayers::getBufferArea(hwc2_layer_t layer) const
145{
146 auto testLayer = mTestLayers.find(layer);
147 if (testLayer == mTestLayers.end())
148 [] () { GTEST_FAIL(); }();
149 return testLayer->second.getBufferArea();
150}
151
Marissa Wall1cd789c2017-01-27 12:55:36 -0800152hwc_color_t Hwc2TestLayers::getColor(hwc2_layer_t layer) const
153{
154 if (mTestLayers.count(layer) == 0) {
155 []() { GTEST_FAIL(); }();
156 }
157 return mTestLayers.at(layer).getColor();
158}
159
160hwc2_composition_t Hwc2TestLayers::getComposition(hwc2_layer_t layer) const
161{
162 if (mTestLayers.count(layer) == 0) {
163 []() { GTEST_FAIL(); }();
164 }
165 return mTestLayers.at(layer).getComposition();
166}
167
168hwc_rect_t Hwc2TestLayers::getCursorPosition(hwc2_layer_t layer) const
169{
170 if (mTestLayers.count(layer) == 0) {
171 []() { GTEST_FAIL(); }();
172 }
173 return mTestLayers.at(layer).getCursorPosition();
174}
175
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700176android::ui::Dataspace Hwc2TestLayers::getDataspace(hwc2_layer_t layer) const
Marissa Wall1cd789c2017-01-27 12:55:36 -0800177{
178 if (mTestLayers.count(layer) == 0) {
179 []() { GTEST_FAIL(); }();
180 }
181 return mTestLayers.at(layer).getDataspace();
182}
183
184hwc_rect_t Hwc2TestLayers::getDisplayFrame(hwc2_layer_t layer) const
185{
186 if (mTestLayers.count(layer) == 0) {
187 []() { GTEST_FAIL(); }();
188 }
189 return mTestLayers.at(layer).getDisplayFrame();
190}
191
192float Hwc2TestLayers::getPlaneAlpha(hwc2_layer_t layer) const
193{
194 if (mTestLayers.count(layer) == 0) {
195 []() { GTEST_FAIL(); }();
196 }
197 return mTestLayers.at(layer).getPlaneAlpha();
198}
199
200hwc_frect_t Hwc2TestLayers::getSourceCrop(hwc2_layer_t layer) const
201{
202 if (mTestLayers.count(layer) == 0) {
203 []() { GTEST_FAIL(); }();
204 }
205 return mTestLayers.at(layer).getSourceCrop();
206}
207
208hwc_region_t Hwc2TestLayers::getSurfaceDamage(hwc2_layer_t layer) const
209{
210 if (mTestLayers.count(layer) == 0) {
211 []() { GTEST_FAIL(); }();
212 }
213 return mTestLayers.at(layer).getSurfaceDamage();
214}
215
216hwc_transform_t Hwc2TestLayers::getTransform(hwc2_layer_t layer) const
217{
218 if (mTestLayers.count(layer) == 0) {
219 []() { GTEST_FAIL(); }();
220 }
221 return mTestLayers.at(layer).getTransform();
222}
223
Marissa Wallf7618ed2016-12-15 12:34:39 -0800224hwc_region_t Hwc2TestLayers::getVisibleRegion(hwc2_layer_t layer) const
225{
226 if (mTestLayers.count(layer) == 0) {
227 []() { GTEST_FAIL(); }();
228 }
229 return mTestLayers.at(layer).getVisibleRegion();
Marissa Wall273b1df2016-12-15 12:28:47 -0800230}
231
232uint32_t Hwc2TestLayers::getZOrder(hwc2_layer_t layer) const
233{
234 if (mTestLayers.count(layer) == 0) {
235 []() { GTEST_FAIL(); }();
236 }
237 return mTestLayers.at(layer).getZOrder();
238}
Marissa Wallf7618ed2016-12-15 12:34:39 -0800239
Marissa Wallf18cfb02017-02-21 14:01:05 -0800240/* Sets the visible regions for a display. Returns false if the layers do not
241 * cover the entire display or if a layer is not visible */
242bool Hwc2TestLayers::setVisibleRegions()
Marissa Wallf7618ed2016-12-15 12:34:39 -0800243{
244 /* The region of the display that is covered by layers above the current
245 * layer */
246 android::Region aboveOpaqueLayers;
247
Marissa Wallf18cfb02017-02-21 14:01:05 -0800248 bool optimized = true;
249
Marissa Wallf7618ed2016-12-15 12:34:39 -0800250 /* Iterate over test layers from max z order to min z order. */
251 for (auto& testLayer : mTestLayers) {
252 android::Region visibleRegion;
253
254 /* Set the visible region of this layer */
255 const hwc_rect_t displayFrame = testLayer.second.getDisplayFrame();
256
257 visibleRegion.set(android::Rect(displayFrame.left, displayFrame.top,
258 displayFrame.right, displayFrame.bottom));
259
260 /* Remove the area covered by opaque layers above this layer
261 * from this layer's visible region */
262 visibleRegion.subtractSelf(aboveOpaqueLayers);
263
264 testLayer.second.setVisibleRegion(visibleRegion);
265
Marissa Wallf18cfb02017-02-21 14:01:05 -0800266 /* If a layer is not visible, return false */
267 if (visibleRegion.isEmpty())
268 optimized = false;
269
Marissa Wallf7618ed2016-12-15 12:34:39 -0800270 /* If this layer is opaque, store the region it covers */
271 if (testLayer.second.getPlaneAlpha() == 1.0f)
272 aboveOpaqueLayers.orSelf(visibleRegion);
273 }
Marissa Wallf18cfb02017-02-21 14:01:05 -0800274
275 /* If the opaque region does not cover the entire display return false */
276 if (!aboveOpaqueLayers.isRect())
277 return false;
278
279 const auto rect = aboveOpaqueLayers.begin();
280 if (rect->left != 0 || rect->top != 0 || rect->right != mDisplayArea.width
281 || rect->bottom != mDisplayArea.height)
282 return false;
283
284 return optimized;
Marissa Wallf7618ed2016-12-15 12:34:39 -0800285}
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800286
287// TODO(b/129481165): remove the #pragma below and fix conversion issues
288#pragma clang diagnostic pop // ignored "-Wconversion"