blob: 9d91f88da18ad007d6c18af94995d4d38b834606 [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{
63 for (auto& testLayer : mTestLayers) {
64 if (testLayer.second.advance()) {
65 setVisibleRegions();
66 return true;
67 }
68 testLayer.second.reset();
69 }
70 return false;
71}
72
Marissa Wallf7618ed2016-12-15 12:34:39 -080073bool Hwc2TestLayers::advanceVisibleRegions()
74{
75 for (auto& testLayer : mTestLayers) {
76 if (testLayer.second.advanceVisibleRegion()) {
77 setVisibleRegions();
78 return true;
79 }
80 testLayer.second.reset();
81 }
82 return false;
83}
84
Marissa Wall1cd789c2017-01-27 12:55:36 -080085bool Hwc2TestLayers::contains(hwc2_layer_t layer) const
86{
87 return mTestLayers.count(layer) != 0;
88}
89
90int Hwc2TestLayers::getBuffer(hwc2_layer_t layer, buffer_handle_t* outHandle,
91 int32_t* outAcquireFence)
92{
93 if (mTestLayers.count(layer) == 0) {
94 []() { GTEST_FAIL(); }();
95 }
96 return mTestLayers.at(layer).getBuffer(outHandle, outAcquireFence);
97}
98
99hwc2_blend_mode_t Hwc2TestLayers::getBlendMode(hwc2_layer_t layer) const
100{
101 if (mTestLayers.count(layer) == 0) {
102 []() { GTEST_FAIL(); }();
103 }
104 return mTestLayers.at(layer).getBlendMode();
105}
106
107hwc_color_t Hwc2TestLayers::getColor(hwc2_layer_t layer) const
108{
109 if (mTestLayers.count(layer) == 0) {
110 []() { GTEST_FAIL(); }();
111 }
112 return mTestLayers.at(layer).getColor();
113}
114
115hwc2_composition_t Hwc2TestLayers::getComposition(hwc2_layer_t layer) const
116{
117 if (mTestLayers.count(layer) == 0) {
118 []() { GTEST_FAIL(); }();
119 }
120 return mTestLayers.at(layer).getComposition();
121}
122
123hwc_rect_t Hwc2TestLayers::getCursorPosition(hwc2_layer_t layer) const
124{
125 if (mTestLayers.count(layer) == 0) {
126 []() { GTEST_FAIL(); }();
127 }
128 return mTestLayers.at(layer).getCursorPosition();
129}
130
131android_dataspace_t Hwc2TestLayers::getDataspace(hwc2_layer_t layer) const
132{
133 if (mTestLayers.count(layer) == 0) {
134 []() { GTEST_FAIL(); }();
135 }
136 return mTestLayers.at(layer).getDataspace();
137}
138
139hwc_rect_t Hwc2TestLayers::getDisplayFrame(hwc2_layer_t layer) const
140{
141 if (mTestLayers.count(layer) == 0) {
142 []() { GTEST_FAIL(); }();
143 }
144 return mTestLayers.at(layer).getDisplayFrame();
145}
146
147float Hwc2TestLayers::getPlaneAlpha(hwc2_layer_t layer) const
148{
149 if (mTestLayers.count(layer) == 0) {
150 []() { GTEST_FAIL(); }();
151 }
152 return mTestLayers.at(layer).getPlaneAlpha();
153}
154
155hwc_frect_t Hwc2TestLayers::getSourceCrop(hwc2_layer_t layer) const
156{
157 if (mTestLayers.count(layer) == 0) {
158 []() { GTEST_FAIL(); }();
159 }
160 return mTestLayers.at(layer).getSourceCrop();
161}
162
163hwc_region_t Hwc2TestLayers::getSurfaceDamage(hwc2_layer_t layer) const
164{
165 if (mTestLayers.count(layer) == 0) {
166 []() { GTEST_FAIL(); }();
167 }
168 return mTestLayers.at(layer).getSurfaceDamage();
169}
170
171hwc_transform_t Hwc2TestLayers::getTransform(hwc2_layer_t layer) const
172{
173 if (mTestLayers.count(layer) == 0) {
174 []() { GTEST_FAIL(); }();
175 }
176 return mTestLayers.at(layer).getTransform();
177}
178
Marissa Wallf7618ed2016-12-15 12:34:39 -0800179hwc_region_t Hwc2TestLayers::getVisibleRegion(hwc2_layer_t layer) const
180{
181 if (mTestLayers.count(layer) == 0) {
182 []() { GTEST_FAIL(); }();
183 }
184 return mTestLayers.at(layer).getVisibleRegion();
Marissa Wall273b1df2016-12-15 12:28:47 -0800185}
186
187uint32_t Hwc2TestLayers::getZOrder(hwc2_layer_t layer) const
188{
189 if (mTestLayers.count(layer) == 0) {
190 []() { GTEST_FAIL(); }();
191 }
192 return mTestLayers.at(layer).getZOrder();
193}
Marissa Wallf7618ed2016-12-15 12:34:39 -0800194
195void Hwc2TestLayers::setVisibleRegions()
196{
197 /* The region of the display that is covered by layers above the current
198 * layer */
199 android::Region aboveOpaqueLayers;
200
201 /* Iterate over test layers from max z order to min z order. */
202 for (auto& testLayer : mTestLayers) {
203 android::Region visibleRegion;
204
205 /* Set the visible region of this layer */
206 const hwc_rect_t displayFrame = testLayer.second.getDisplayFrame();
207
208 visibleRegion.set(android::Rect(displayFrame.left, displayFrame.top,
209 displayFrame.right, displayFrame.bottom));
210
211 /* Remove the area covered by opaque layers above this layer
212 * from this layer's visible region */
213 visibleRegion.subtractSelf(aboveOpaqueLayers);
214
215 testLayer.second.setVisibleRegion(visibleRegion);
216
217 /* If this layer is opaque, store the region it covers */
218 if (testLayer.second.getPlaneAlpha() == 1.0f)
219 aboveOpaqueLayers.orSelf(visibleRegion);
220 }
221}