1273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* * Copyright (C) 2016 The Android Open Source Project
2273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall *
3273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
4273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * you may not use this file except in compliance with the License.
5273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * You may obtain a copy of the License at
6273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall *
7273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
8273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall *
9273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * Unless required by applicable law or agreed to in writing, software
10273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
11273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * See the License for the specific language governing permissions and
13273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * limitations under the License.
14273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall */
15273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
16273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include <sstream>
17273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include <gtest/gtest.h>
18273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
19273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
20273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
21273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallHwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
22600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        Hwc2TestCoverage coverage, const Area& displayArea)
23563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    : Hwc2TestLayers(layers, coverage, displayArea,
24563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { }
25563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
26563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallHwc2TestLayers::Hwc2TestLayers(const std::vector<hwc2_layer_t>& layers,
27563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        Hwc2TestCoverage coverage, const Area& displayArea,
28563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        const std::unordered_map<Hwc2TestPropertyName,
29563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        Hwc2TestCoverage>& coverageExceptions)
301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : mDisplayArea(displayArea)
31273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
32273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto layer : layers) {
33273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        mTestLayers.emplace(std::piecewise_construct,
34273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::forward_as_tuple(layer),
35563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::forward_as_tuple(coverage, displayArea, coverageExceptions));
36f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
37f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
38f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Iterate over the layers in order and assign z orders in the same order.
39f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall     * This allows us to iterate over z orders in the same way when computing
40f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall     * visible regions */
41f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    uint32_t nextZOrder = layers.size();
42f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
43f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    for (auto& testLayer : mTestLayers) {
44f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        testLayer.second.setZOrder(nextZOrder--);
45273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
46f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
47f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    setVisibleRegions();
48273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
49273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
50273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallstd::string Hwc2TestLayers::dump() const
51273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
52273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    std::stringstream dmp;
53273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto& testLayer : mTestLayers) {
54273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        dmp << testLayer.second.dump();
55273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
56273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    return dmp.str();
57273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
58273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
59273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid Hwc2TestLayers::reset()
60273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
61273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto& testLayer : mTestLayers) {
62273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        testLayer.second.reset();
63273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
64f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
65f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    setVisibleRegions();
66f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
67f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallbool Hwc2TestLayers::advance()
691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
70f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    auto itr = mTestLayers.begin();
71f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool optimized;
72f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
73f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    while (itr != mTestLayers.end()) {
74f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (itr->second.advance()) {
75f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            optimized = setVisibleRegions();
76f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!mOptimize || optimized)
77f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return true;
78f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            itr = mTestLayers.begin();
79f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
80f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            itr->second.reset();
81f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ++itr;
821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return false;
851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
87f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool Hwc2TestLayers::advanceVisibleRegions()
88f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
89f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    auto itr = mTestLayers.begin();
90f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool optimized;
91f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
92f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    while (itr != mTestLayers.end()) {
93f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (itr->second.advanceVisibleRegion()) {
94f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            optimized = setVisibleRegions();
95f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!mOptimize || optimized)
96f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return true;
97f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            itr = mTestLayers.begin();
98f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
99f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            itr->second.reset();
100f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ++itr;
101f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
102f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
103f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return false;
104f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
105f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
106f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* Removes layouts that do not cover the entire display.
107f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * Also removes layouts where a layer is completely blocked from view.
108f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall */
109f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool Hwc2TestLayers::optimizeLayouts()
110f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
111f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    mOptimize = true;
112f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
113f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (setVisibleRegions())
114f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        return true;
115f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return advance();
116f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
117f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallbool Hwc2TestLayers::contains(hwc2_layer_t layer) const
1191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.count(layer) != 0;
1211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallint Hwc2TestLayers::getBuffer(hwc2_layer_t layer, buffer_handle_t* outHandle,
1241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t* outAcquireFence)
1251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getBuffer(outHandle, outAcquireFence);
1301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc2_blend_mode_t Hwc2TestLayers::getBlendMode(hwc2_layer_t layer) const
1331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getBlendMode();
1381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
140f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallArea Hwc2TestLayers::getBufferArea(hwc2_layer_t layer) const
141f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
142f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    auto testLayer = mTestLayers.find(layer);
143f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (testLayer == mTestLayers.end())
144f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        [] () { GTEST_FAIL(); }();
145f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return testLayer->second.getBufferArea();
146f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
147f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_color_t Hwc2TestLayers::getColor(hwc2_layer_t layer) const
1491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getColor();
1541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc2_composition_t Hwc2TestLayers::getComposition(hwc2_layer_t layer) const
1571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getComposition();
1621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_rect_t Hwc2TestLayers::getCursorPosition(hwc2_layer_t layer) const
1651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getCursorPosition();
1701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallandroid_dataspace_t Hwc2TestLayers::getDataspace(hwc2_layer_t layer) const
1731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getDataspace();
1781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_rect_t Hwc2TestLayers::getDisplayFrame(hwc2_layer_t layer) const
1811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getDisplayFrame();
1861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallfloat Hwc2TestLayers::getPlaneAlpha(hwc2_layer_t layer) const
1891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
1921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
1931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getPlaneAlpha();
1941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
1951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_frect_t Hwc2TestLayers::getSourceCrop(hwc2_layer_t layer) const
1971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
1981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
1991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
2001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
2011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getSourceCrop();
2021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
2031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
2041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_region_t Hwc2TestLayers::getSurfaceDamage(hwc2_layer_t layer) const
2051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
2061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
2071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
2081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
2091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getSurfaceDamage();
2101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
2111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
2121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallhwc_transform_t Hwc2TestLayers::getTransform(hwc2_layer_t layer) const
2131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
2141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    if (mTestLayers.count(layer) == 0) {
2151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        []() { GTEST_FAIL(); }();
2161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
2171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    return mTestLayers.at(layer).getTransform();
2181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
2191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
220f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallhwc_region_t Hwc2TestLayers::getVisibleRegion(hwc2_layer_t layer) const
221f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
222f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    if (mTestLayers.count(layer) == 0) {
223f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        []() { GTEST_FAIL(); }();
224f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
225f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return mTestLayers.at(layer).getVisibleRegion();
226273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
227273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
228273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Walluint32_t Hwc2TestLayers::getZOrder(hwc2_layer_t layer) const
229273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
230273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    if (mTestLayers.count(layer) == 0) {
231273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        []() { GTEST_FAIL(); }();
232273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
233273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    return mTestLayers.at(layer).getZOrder();
234273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
235f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
236f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* Sets the visible regions for a display. Returns false if the layers do not
237f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * cover the entire display or if a layer is not visible */
238f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool Hwc2TestLayers::setVisibleRegions()
239f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
240f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* The region of the display that is covered by layers above the current
241f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall     * layer */
242f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    android::Region aboveOpaqueLayers;
243f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
244f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool optimized = true;
245f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
246f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Iterate over test layers from max z order to min z order. */
247f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    for (auto& testLayer : mTestLayers) {
248f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        android::Region visibleRegion;
249f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
250f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        /* Set the visible region of this layer */
251f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        const hwc_rect_t displayFrame = testLayer.second.getDisplayFrame();
252f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
253f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        visibleRegion.set(android::Rect(displayFrame.left, displayFrame.top,
254f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                displayFrame.right, displayFrame.bottom));
255f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
256f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        /* Remove the area covered by opaque layers above this layer
257f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall         * from this layer's visible region */
258f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        visibleRegion.subtractSelf(aboveOpaqueLayers);
259f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
260f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        testLayer.second.setVisibleRegion(visibleRegion);
261f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
262f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        /* If a layer is not visible, return false */
263f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (visibleRegion.isEmpty())
264f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            optimized = false;
265f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
266f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        /* If this layer is opaque, store the region it covers */
267f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        if (testLayer.second.getPlaneAlpha() == 1.0f)
268f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            aboveOpaqueLayers.orSelf(visibleRegion);
269f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
270f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
271f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* If the opaque region does not cover the entire display return false */
272f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (!aboveOpaqueLayers.isRect())
273f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        return false;
274f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
275f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const auto rect = aboveOpaqueLayers.begin();
276f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (rect->left != 0 || rect->top != 0 || rect->right != mDisplayArea.width
277f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            || rect->bottom != mDisplayArea.height)
278f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        return false;
279f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
280f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return optimized;
281f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
282