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