1 /* * 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 
Hwc2TestLayers(const std::vector<hwc2_layer_t> & layers,Hwc2TestCoverage coverage,const Area & displayArea)21 Hwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
22         Hwc2TestCoverage coverage, const Area& displayArea)
23     : Hwc2TestLayers(layers, coverage, displayArea,
24             std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { }
25 
Hwc2TestLayers(const std::vector<hwc2_layer_t> & layers,Hwc2TestCoverage coverage,const Area & displayArea,const std::unordered_map<Hwc2TestPropertyName,Hwc2TestCoverage> & coverageExceptions)26 Hwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
27         Hwc2TestCoverage coverage, const Area& displayArea,
28         const std::unordered_map<Hwc2TestPropertyName,
29         Hwc2TestCoverage>& coverageExceptions)
30     : mDisplayArea(displayArea)
31 {
32     for (auto layer : layers) {
33         mTestLayers.emplace(std::piecewise_construct,
34                 std::forward_as_tuple(layer),
35                 std::forward_as_tuple(coverage, displayArea, coverageExceptions));
36     }
37 
38     /* Iterate over the layers in order and assign z orders in the same order.
39      * This allows us to iterate over z orders in the same way when computing
40      * visible regions */
41     uint32_t nextZOrder = layers.size();
42 
43     for (auto& testLayer : mTestLayers) {
44         testLayer.second.setZOrder(nextZOrder--);
45     }
46 
47     setVisibleRegions();
48 }
49 
dump() const50 std::string Hwc2TestLayers::dump() const
51 {
52     std::stringstream dmp;
53     for (auto& testLayer : mTestLayers) {
54         dmp << testLayer.second.dump();
55     }
56     return dmp.str();
57 }
58 
reset()59 void Hwc2TestLayers::reset()
60 {
61     for (auto& testLayer : mTestLayers) {
62         testLayer.second.reset();
63     }
64 
65     setVisibleRegions();
66 }
67 
advance()68 bool Hwc2TestLayers::advance()
69 {
70     auto itr = mTestLayers.begin();
71     bool optimized;
72 
73     while (itr != mTestLayers.end()) {
74         if (itr->second.advance()) {
75             optimized = setVisibleRegions();
76             if (!mOptimize || optimized)
77                 return true;
78             itr = mTestLayers.begin();
79         } else {
80             itr->second.reset();
81             ++itr;
82         }
83     }
84     return false;
85 }
86 
advanceVisibleRegions()87 bool Hwc2TestLayers::advanceVisibleRegions()
88 {
89     auto itr = mTestLayers.begin();
90     bool optimized;
91 
92     while (itr != mTestLayers.end()) {
93         if (itr->second.advanceVisibleRegion()) {
94             optimized = setVisibleRegions();
95             if (!mOptimize || optimized)
96                 return true;
97             itr = mTestLayers.begin();
98         } else {
99             itr->second.reset();
100             ++itr;
101         }
102     }
103     return false;
104 }
105 
106 /* Removes layouts that do not cover the entire display.
107  * Also removes layouts where a layer is completely blocked from view.
108  */
optimizeLayouts()109 bool Hwc2TestLayers::optimizeLayouts()
110 {
111     mOptimize = true;
112 
113     if (setVisibleRegions())
114         return true;
115     return advance();
116 }
117 
contains(hwc2_layer_t layer) const118 bool Hwc2TestLayers::contains(hwc2_layer_t layer) const
119 {
120     return mTestLayers.count(layer) != 0;
121 }
122 
getBuffer(hwc2_layer_t layer,buffer_handle_t * outHandle,int32_t * outAcquireFence)123 int Hwc2TestLayers::getBuffer(hwc2_layer_t layer, buffer_handle_t* outHandle,
124         int32_t* outAcquireFence)
125 {
126     if (mTestLayers.count(layer) == 0) {
127         []() { GTEST_FAIL(); }();
128     }
129     return mTestLayers.at(layer).getBuffer(outHandle, outAcquireFence);
130 }
131 
getBlendMode(hwc2_layer_t layer) const132 hwc2_blend_mode_t Hwc2TestLayers::getBlendMode(hwc2_layer_t layer) const
133 {
134     if (mTestLayers.count(layer) == 0) {
135         []() { GTEST_FAIL(); }();
136     }
137     return mTestLayers.at(layer).getBlendMode();
138 }
139 
getBufferArea(hwc2_layer_t layer) const140 Area Hwc2TestLayers::getBufferArea(hwc2_layer_t layer) const
141 {
142     auto testLayer = mTestLayers.find(layer);
143     if (testLayer == mTestLayers.end())
144         [] () { GTEST_FAIL(); }();
145     return testLayer->second.getBufferArea();
146 }
147 
getColor(hwc2_layer_t layer) const148 hwc_color_t Hwc2TestLayers::getColor(hwc2_layer_t layer) const
149 {
150     if (mTestLayers.count(layer) == 0) {
151         []() { GTEST_FAIL(); }();
152     }
153     return mTestLayers.at(layer).getColor();
154 }
155 
getComposition(hwc2_layer_t layer) const156 hwc2_composition_t Hwc2TestLayers::getComposition(hwc2_layer_t layer) const
157 {
158     if (mTestLayers.count(layer) == 0) {
159         []() { GTEST_FAIL(); }();
160     }
161     return mTestLayers.at(layer).getComposition();
162 }
163 
getCursorPosition(hwc2_layer_t layer) const164 hwc_rect_t Hwc2TestLayers::getCursorPosition(hwc2_layer_t layer) const
165 {
166     if (mTestLayers.count(layer) == 0) {
167         []() { GTEST_FAIL(); }();
168     }
169     return mTestLayers.at(layer).getCursorPosition();
170 }
171 
getDataspace(hwc2_layer_t layer) const172 android::ui::Dataspace Hwc2TestLayers::getDataspace(hwc2_layer_t layer) const
173 {
174     if (mTestLayers.count(layer) == 0) {
175         []() { GTEST_FAIL(); }();
176     }
177     return mTestLayers.at(layer).getDataspace();
178 }
179 
getDisplayFrame(hwc2_layer_t layer) const180 hwc_rect_t Hwc2TestLayers::getDisplayFrame(hwc2_layer_t layer) const
181 {
182     if (mTestLayers.count(layer) == 0) {
183         []() { GTEST_FAIL(); }();
184     }
185     return mTestLayers.at(layer).getDisplayFrame();
186 }
187 
getPlaneAlpha(hwc2_layer_t layer) const188 float Hwc2TestLayers::getPlaneAlpha(hwc2_layer_t layer) const
189 {
190     if (mTestLayers.count(layer) == 0) {
191         []() { GTEST_FAIL(); }();
192     }
193     return mTestLayers.at(layer).getPlaneAlpha();
194 }
195 
getSourceCrop(hwc2_layer_t layer) const196 hwc_frect_t Hwc2TestLayers::getSourceCrop(hwc2_layer_t layer) const
197 {
198     if (mTestLayers.count(layer) == 0) {
199         []() { GTEST_FAIL(); }();
200     }
201     return mTestLayers.at(layer).getSourceCrop();
202 }
203 
getSurfaceDamage(hwc2_layer_t layer) const204 hwc_region_t Hwc2TestLayers::getSurfaceDamage(hwc2_layer_t layer) const
205 {
206     if (mTestLayers.count(layer) == 0) {
207         []() { GTEST_FAIL(); }();
208     }
209     return mTestLayers.at(layer).getSurfaceDamage();
210 }
211 
getTransform(hwc2_layer_t layer) const212 hwc_transform_t Hwc2TestLayers::getTransform(hwc2_layer_t layer) const
213 {
214     if (mTestLayers.count(layer) == 0) {
215         []() { GTEST_FAIL(); }();
216     }
217     return mTestLayers.at(layer).getTransform();
218 }
219 
getVisibleRegion(hwc2_layer_t layer) const220 hwc_region_t Hwc2TestLayers::getVisibleRegion(hwc2_layer_t layer) const
221 {
222     if (mTestLayers.count(layer) == 0) {
223         []() { GTEST_FAIL(); }();
224     }
225     return mTestLayers.at(layer).getVisibleRegion();
226 }
227 
getZOrder(hwc2_layer_t layer) const228 uint32_t Hwc2TestLayers::getZOrder(hwc2_layer_t layer) const
229 {
230     if (mTestLayers.count(layer) == 0) {
231         []() { GTEST_FAIL(); }();
232     }
233     return mTestLayers.at(layer).getZOrder();
234 }
235 
236 /* Sets the visible regions for a display. Returns false if the layers do not
237  * cover the entire display or if a layer is not visible */
setVisibleRegions()238 bool Hwc2TestLayers::setVisibleRegions()
239 {
240     /* The region of the display that is covered by layers above the current
241      * layer */
242     android::Region aboveOpaqueLayers;
243 
244     bool optimized = true;
245 
246     /* Iterate over test layers from max z order to min z order. */
247     for (auto& testLayer : mTestLayers) {
248         android::Region visibleRegion;
249 
250         /* Set the visible region of this layer */
251         const hwc_rect_t displayFrame = testLayer.second.getDisplayFrame();
252 
253         visibleRegion.set(android::Rect(displayFrame.left, displayFrame.top,
254                 displayFrame.right, displayFrame.bottom));
255 
256         /* Remove the area covered by opaque layers above this layer
257          * from this layer's visible region */
258         visibleRegion.subtractSelf(aboveOpaqueLayers);
259 
260         testLayer.second.setVisibleRegion(visibleRegion);
261 
262         /* If a layer is not visible, return false */
263         if (visibleRegion.isEmpty())
264             optimized = false;
265 
266         /* If this layer is opaque, store the region it covers */
267         if (testLayer.second.getPlaneAlpha() == 1.0f)
268             aboveOpaqueLayers.orSelf(visibleRegion);
269     }
270 
271     /* If the opaque region does not cover the entire display return false */
272     if (!aboveOpaqueLayers.isRect())
273         return false;
274 
275     const auto rect = aboveOpaqueLayers.begin();
276     if (rect->left != 0 || rect->top != 0 || rect->right != mDisplayArea.width
277             || rect->bottom != mDisplayArea.height)
278         return false;
279 
280     return optimized;
281 }
282