1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza// #define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "DisplayDevice" 209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 210607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu#include <array> 220607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu#include <unordered_set> 230607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 35c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 40076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h" 431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h" 45875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 47da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 480f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 49c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 5013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h" 511f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 52720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 53720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <configstore/Utils.h> 54720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 55fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linnamespace android { 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore 58720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore; 59720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0; 60fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linusing android::ui::ColorMode; 610607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuusing android::ui::Dataspace; 626266589793ddd9769a649a6b5f61ef115179572bPeiyong Linusing android::ui::Hdr; 63dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linusing android::ui::RenderIntent; 64720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 71021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 720607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wunamespace { 730607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 740607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// ordered list of known SDR color modes 750607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuconst std::array<ColorMode, 2> sSdrColorModes = { 760607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ColorMode::DISPLAY_P3, 770607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ColorMode::SRGB, 780607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu}; 790607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 800607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// ordered list of known HDR color modes 810607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuconst std::array<ColorMode, 2> sHdrColorModes = { 820607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ColorMode::BT2100_PQ, 830607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ColorMode::BT2100_HLG, 840607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu}; 850607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 860607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// ordered list of known SDR render intents 870607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuconst std::array<RenderIntent, 2> sSdrRenderIntents = { 880607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu RenderIntent::ENHANCE, 890607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu RenderIntent::COLORIMETRIC, 900607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu}; 910607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 920607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// ordered list of known HDR render intents 930607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuconst std::array<RenderIntent, 2> sHdrRenderIntents = { 940607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu RenderIntent::TONE_MAP_ENHANCE, 950607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu RenderIntent::TONE_MAP_COLORIMETRIC, 960607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu}; 970607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 980607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// map known color mode to dataspace 990607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I WuDataspace colorModeToDataspace(ColorMode mode) { 1000607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu switch (mode) { 1010607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu case ColorMode::SRGB: 1020607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return Dataspace::SRGB; 1030607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu case ColorMode::DISPLAY_P3: 1040607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return Dataspace::DISPLAY_P3; 1050607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu case ColorMode::BT2100_HLG: 1060607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return Dataspace::BT2020_HLG; 1070607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu case ColorMode::BT2100_PQ: 1080607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return Dataspace::BT2020_PQ; 1090607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu default: 1100607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return Dataspace::UNKNOWN; 1110607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1120607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 1130607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1140607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// Return a list of candidate color modes. 1150607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wustd::vector<ColorMode> getColorModeCandidates(ColorMode mode) { 1160607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu std::vector<ColorMode> candidates; 1170607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1180607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // add mode itself 1190607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu candidates.push_back(mode); 1200607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1210607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // check if mode is HDR 1220607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu bool isHdr = false; 1230607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto hdrMode : sHdrColorModes) { 1240607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (hdrMode == mode) { 1250607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu isHdr = true; 1260607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu break; 1270607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1280607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1290607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1300607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // add other HDR candidates when mode is HDR 1310607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (isHdr) { 1320607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto hdrMode : sHdrColorModes) { 1330607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (hdrMode != mode) { 1340607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu candidates.push_back(hdrMode); 1350607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1360607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1370607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1380607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1390607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // add other SDR candidates 1400607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto sdrMode : sSdrColorModes) { 1410607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (sdrMode != mode) { 1420607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu candidates.push_back(sdrMode); 1430607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1440607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1450607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1460607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return candidates; 1470607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 1480607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1490607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// Return a list of candidate render intents. 1500607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wustd::vector<RenderIntent> getRenderIntentCandidates(RenderIntent intent) { 1510607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu std::vector<RenderIntent> candidates; 1520607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1530607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // add intent itself 1540607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu candidates.push_back(intent); 1550607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1560607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // check if intent is HDR 1570607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu bool isHdr = false; 1580607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto hdrIntent : sHdrRenderIntents) { 1590607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (hdrIntent == intent) { 1600607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu isHdr = true; 1610607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu break; 1620607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1630607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1640607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1650607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (isHdr) { 166c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu // add other HDR candidates when intent is HDR 1670607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto hdrIntent : sHdrRenderIntents) { 1680607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (hdrIntent != intent) { 1690607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu candidates.push_back(hdrIntent); 1700607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1710607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 172c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu } else { 173c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu // add other SDR candidates when intent is SDR 174c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu for (auto sdrIntent : sSdrRenderIntents) { 175c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu if (sdrIntent != intent) { 176c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu candidates.push_back(sdrIntent); 177c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu } 178c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu } 1790607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1800607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1810607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return candidates; 1820607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 1830607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1840607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// Return the best color mode supported by HWC. 1850607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I WuColorMode getHwcColorMode( 1860607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const std::unordered_map<ColorMode, std::vector<RenderIntent>>& hwcColorModes, 1870607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ColorMode mode) { 1880607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu std::vector<ColorMode> candidates = getColorModeCandidates(mode); 1890607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto candidate : candidates) { 1900607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu auto iter = hwcColorModes.find(candidate); 1910607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (iter != hwcColorModes.end()) { 1920607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return candidate; 1930607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1940607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 1950607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1960607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return ColorMode::NATIVE; 1970607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 1980607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 1990607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// Return the best render intent supported by HWC. 2000607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I WuRenderIntent getHwcRenderIntent(const std::vector<RenderIntent>& hwcIntents, RenderIntent intent) { 2010607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu std::vector<RenderIntent> candidates = getRenderIntentCandidates(intent); 2020607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto candidate : candidates) { 2030607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto hwcIntent : hwcIntents) { 2040607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (candidate == hwcIntent) { 2050607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return candidate; 2060607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 2070607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 2080607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 2090607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 2100607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return RenderIntent::COLORIMETRIC; 2110607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 2120607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 2130607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} // anonymous namespace 2140607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 2155d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off 2160f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 218dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 219ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 220dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 221dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 2220959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique const sp<ANativeWindow>& nativeWindow, 22399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 2240959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique std::unique_ptr<RE::Surface> renderSurface, 2250959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique int displayWidth, 2260959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique int displayHeight, 227dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin bool hasWideColorGamut, 2286266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin const HdrCapabilities& hdrCapabilities, 2292c327ac2840b34848543cc961d16d3dbad102f16Peiyong Lin const int32_t supportedPerFrameMetadata, 2300607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const std::unordered_map<ColorMode, std::vector<RenderIntent>>& hwcColorModes, 2310959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique int initialPowerMode) 232b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 233b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 2349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 2359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 23627e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 2370959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mNativeWindow(nativeWindow), 23899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 2390959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mSurface{std::move(renderSurface)}, 2400959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mDisplayWidth(displayWidth), 2410959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mDisplayHeight(displayHeight), 2420959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mPageFlipCount(0), 243dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 24401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 2452c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 2460959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mViewport(Rect::INVALID_RECT), 2470959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mFrame(Rect::INVALID_RECT), 2480959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mPowerMode(initialPowerMode), 2490959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mActiveConfig(0), 2507c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang mColorTransform(HAL_COLOR_TRANSFORM_IDENTITY), 251dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mHasWideColorGamut(hasWideColorGamut), 2526266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHdr10(false), 2536266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHLG(false), 2542c327ac2840b34848543cc961d16d3dbad102f16Peiyong Lin mHasDolbyVision(false), 2550607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu mSupportedPerFrameMetadata(supportedPerFrameMetadata) 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2575d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 2580607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu populateColorModes(hwcColorModes); 2590607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 260fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin std::vector<Hdr> types = hdrCapabilities.getSupportedHdrTypes(); 261fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin for (Hdr hdrType : types) { 2626266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin switch (hdrType) { 2636266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::HDR10: 2646266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHdr10 = true; 2656266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 2666266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::HLG: 2676266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHLG = true; 2686266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 2696266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::DOLBY_VISION: 2706266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasDolbyVision = true; 2716266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 2726266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin default: 2736266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin ALOGE("UNKNOWN HDR capability: %d", static_cast<int32_t>(hdrType)); 2746266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin } 2756266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin } 2765f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 277fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin float minLuminance = hdrCapabilities.getDesiredMinLuminance(); 278fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin float maxLuminance = hdrCapabilities.getDesiredMaxLuminance(); 279fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin float maxAverageLuminance = hdrCapabilities.getDesiredMaxAverageLuminance(); 280fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin 281fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin minLuminance = minLuminance <= 0.0 ? sDefaultMinLumiance : minLuminance; 282fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin maxLuminance = maxLuminance <= 0.0 ? sDefaultMaxLumiance : maxLuminance; 283fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin maxAverageLuminance = maxAverageLuminance <= 0.0 ? sDefaultMaxLumiance : maxAverageLuminance; 284fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin if (this->hasWideColorGamut()) { 285fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin // insert HDR10/HLG as we will force client composition for HDR10/HLG 286fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin // layers 287fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin if (!hasHDR10Support()) { 288fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin types.push_back(Hdr::HDR10); 289fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin } 290fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin 291fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin if (!hasHLGSupport()) { 292fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin types.push_back(Hdr::HLG); 293fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin } 294fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin } 295fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin mHdrCapabilities = HdrCapabilities(types, maxLuminance, maxAverageLuminance, minLuminance); 296fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin 29798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 29800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 299a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 300a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 3010959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd PiqueDisplayDevice::~DisplayDevice() = default; 302ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 30302d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 30402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 30502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 30602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 30702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 30802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 30902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 310ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 311566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin return mFlinger != nullptr; 312ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 313ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 314ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 315ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 316ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 317ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 318ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 319ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 320ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 321ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 3229e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 3239e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 3249e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 3259e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 3269e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 3279e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 3289e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 3290f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 330076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 333b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 335875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3397143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 3407143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 341028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 342028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 3439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 3449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 3459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 3469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 3479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 3489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 3509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 3519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 3529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 3539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 3549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 3559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 3569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 3579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 3589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 3599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 3609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 3619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 3629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 3639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 3649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 3659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 36638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 367da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 36888a905b9aff600150916a644d5bfd01a31c0ba82Madhuri Athota if (hwc.hasClientComposition(mHwcDisplayId) || hwc.hasFlipClientTargetRequest(mHwcDisplayId)) { 369144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->swapBuffers(); 370da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 37152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 37299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 37399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 37499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 37599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 37632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 377da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 378da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 3809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 3819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 382da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 383f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wubool DisplayDevice::makeCurrent() const { 384144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique bool success = mFlinger->getRenderEngine().setCurrentSurface(*mSurface); 385931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 386f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wu return success; 38752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 38852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 389875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 390875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 391875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 392c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 393c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 394c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 395bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 396bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 3979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 3989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 3999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 4009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 4021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 40313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 4043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 4053b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 4063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 40713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 4083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 4093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 4103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 41183806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { 41283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu mLayersNeedingFences = layers; 41383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 41483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 41583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { 41683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return mLayersNeedingFences; 41783806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 41883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 419cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 420cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 421cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 422cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 423cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 424da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 425cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 426cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 427cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 428cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 429cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 430cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 4313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 4322c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 4332c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 434d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 435d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4362c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 4372c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 438d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 439d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4402c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 4412c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 442d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 443d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 444d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 4456c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 4466c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 4476c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4486c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4496c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 4506c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 4516c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4526c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4536c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 454a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Linvoid DisplayDevice::setActiveColorMode(ColorMode mode) { 45528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 45628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 45728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 458a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong LinColorMode DisplayDevice::getActiveColorMode() const { 45928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 46028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 46179d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 462dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong LinRenderIntent DisplayDevice::getActiveRenderIntent() const { 463dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin return mActiveRenderIntent; 464dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 465dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 466dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linvoid DisplayDevice::setActiveRenderIntent(RenderIntent renderIntent) { 467dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mActiveRenderIntent = renderIntent; 468dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 469dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 4707c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangvoid DisplayDevice::setColorTransform(const mat4& transform) { 4717c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang const bool isIdentity = (transform == mat4()); 4727c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang mColorTransform = 4737c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang isIdentity ? HAL_COLOR_TRANSFORM_IDENTITY : HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX; 4747c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang} 4757c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 4767c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangandroid_color_transform_t DisplayDevice::getColorTransform() const { 4777c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang return mColorTransform; 4787c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang} 4797c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 48034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linvoid DisplayDevice::setCompositionDataSpace(ui::Dataspace dataspace) { 481dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mCompositionDataSpace = dataspace; 48279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 48334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin native_window_set_buffers_data_space(window, static_cast<android_dataspace>(dataspace)); 48479d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 48528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 486dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linui::Dataspace DisplayDevice::getCompositionDataSpace() const { 487dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin return mCompositionDataSpace; 488dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 489dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 49028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 4913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 49228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 49328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 49428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 49528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 49628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 49728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 49828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 499c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 500c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 501c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 502c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 503c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 504c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 505c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 506c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 507c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 508c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 509c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 510c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 511c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 512c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 513c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 514c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 515c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 516c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 517c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 5180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 5191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 5201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 5211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 5221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 5233165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 5241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 5251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 5263165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 5271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 5281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 5293165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 5301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 5311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 5323165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 5331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 5341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 5351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 5361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 5371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 5381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 5391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 5401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 5411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 54247e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 54347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 54447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 545144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(nullptr); 546f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 54747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 54847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 54947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 550144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(window); 551144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayWidth = mSurface->queryWidth(); 552144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayHeight = mSurface->queryHeight(); 55347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 55447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 55547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 55647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 55747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 55847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 55947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 56000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 561f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 562f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 563f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 564da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 565f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 566f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 567da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 568f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 569f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 5701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 571f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 572f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 575f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 5766360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 577f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 578f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 579f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 580f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 581f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 582f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 583f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 584f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 585f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 586f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 587766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 5881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 589f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 590f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 591f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 592f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 593f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 594f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 595f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 596f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 597f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 598f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 599f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 600f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 601f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 602f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 603f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 604f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 605f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 606f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 607f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 608f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 609f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 6107501ed66a05f530062925011d1342e8651216051Iris Chang // need to take care of primary display rotation for mGlobalTransform 6117501ed66a05f530062925011d1342e8651216051Iris Chang // for case if the panel is not installed aligned with device orientation 6127501ed66a05f530062925011d1342e8651216051Iris Chang if (mType == DisplayType::DISPLAY_PRIMARY) { 6137501ed66a05f530062925011d1342e8651216051Iris Chang int primaryDisplayOrientation = mFlinger->getPrimaryDisplayOrientation(); 6147501ed66a05f530062925011d1342e8651216051Iris Chang DisplayDevice::orientationToTransfrom( 6157501ed66a05f530062925011d1342e8651216051Iris Chang (orientation + primaryDisplayOrientation) % (DisplayState::eOrientation270 + 1), 6167501ed66a05f530062925011d1342e8651216051Iris Chang w, h, &R); 6177501ed66a05f530062925011d1342e8651216051Iris Chang } 6187501ed66a05f530062925011d1342e8651216051Iris Chang 619f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 620f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 621f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 622f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 623f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 624f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 625f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 626f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 627f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 628f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 629f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 6306c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 631f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 632f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 633f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 634021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 635021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 636021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 637021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 638021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 639021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 640021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 641021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 642021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 643021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 644021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 645021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 646021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 647021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 648021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 649021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 650021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 651021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 652f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 653f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 6541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 6551d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 656021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 657021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 658021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 659021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 66074d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 6611d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 662152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 6630ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 6640ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 6650ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 6660ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 667152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window, 668144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryRedSize(), mSurface->queryGreenSize(), 669144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryBlueSize(), mSurface->queryAlphaSize(), mOrientation, 670144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 6710ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 6720ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 6730ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 6740ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 6750ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 6760ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 6770ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 678152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter auto const surface = static_cast<Surface*>(window); 67934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin ui::Dataspace dataspace = surface->getBuffersDataSpace(); 680dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin result.appendFormat(" wideColorGamut=%d, hdr10=%d, colorMode=%s, dataspace: %s (%d)\n", 681dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mHasWideColorGamut, mHasHdr10, 6821e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu decodeColorMode(mActiveColorMode).c_str(), 68334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin dataspaceDetails(static_cast<android_dataspace>(dataspace)).c_str(), dataspace); 6841d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 68599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 686f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 68799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 6881d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 689ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 6900607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// Map dataspace/intent to the best matched dataspace/colorMode/renderIntent 6910607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu// supported by HWC. 6920607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuvoid DisplayDevice::addColorMode( 6930607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const std::unordered_map<ColorMode, std::vector<RenderIntent>>& hwcColorModes, 6940607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const ColorMode mode, const RenderIntent intent) { 6950607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // find the best color mode 6960607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const ColorMode hwcColorMode = getHwcColorMode(hwcColorModes, mode); 6970607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 6980607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // find the best render intent 6990607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu auto iter = hwcColorModes.find(hwcColorMode); 7000607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const auto& hwcIntents = 7010607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu iter != hwcColorModes.end() ? iter->second : std::vector<RenderIntent>(); 7020607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const RenderIntent hwcIntent = getHwcRenderIntent(hwcIntents, intent); 7030607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7040607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const Dataspace dataspace = colorModeToDataspace(mode); 7050607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const Dataspace hwcDataspace = colorModeToDataspace(hwcColorMode); 7060607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7070607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ALOGV("DisplayDevice %d/%d: map (%s, %s) to (%s, %s, %s)", mType, mHwcDisplayId, 7080607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu dataspaceDetails(static_cast<android_dataspace_t>(dataspace)).c_str(), 7090607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu decodeRenderIntent(intent).c_str(), 7100607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu dataspaceDetails(static_cast<android_dataspace_t>(hwcDataspace)).c_str(), 7110607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu decodeColorMode(hwcColorMode).c_str(), decodeRenderIntent(hwcIntent).c_str()); 7120607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7130607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu mColorModes[getColorModeKey(dataspace, intent)] = {hwcDataspace, hwcColorMode, hwcIntent}; 7140607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 7150607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7160607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuvoid DisplayDevice::populateColorModes( 7170607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu const std::unordered_map<ColorMode, std::vector<RenderIntent>>& hwcColorModes) { 7180607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (!hasWideColorGamut()) { 7190607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return; 7200607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 7210607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7220d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu // collect all known SDR render intents 7230d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu std::unordered_set<RenderIntent> sdrRenderIntents(sSdrRenderIntents.begin(), 7240d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu sSdrRenderIntents.end()); 7250d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu auto iter = hwcColorModes.find(ColorMode::SRGB); 7260d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu if (iter != hwcColorModes.end()) { 7270d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu for (auto intent : iter->second) { 7280d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu sdrRenderIntents.insert(intent); 7290d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu } 7300d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu } 7310d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu 732c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu // add all known SDR combinations 7330d711268fe57b73a38ec3590b6e67f03ff789fa1Chia-I Wu for (auto intent : sdrRenderIntents) { 7340607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto mode : sSdrColorModes) { 7350607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu addColorMode(hwcColorModes, mode, intent); 736d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin } 737d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin } 7380607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 739c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu // collect all known HDR render intents 740c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu std::unordered_set<RenderIntent> hdrRenderIntents(sHdrRenderIntents.begin(), 741c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu sHdrRenderIntents.end()); 742c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu iter = hwcColorModes.find(ColorMode::BT2100_PQ); 743c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu if (iter != hwcColorModes.end()) { 744c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu for (auto intent : iter->second) { 745c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu hdrRenderIntents.insert(intent); 746c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu } 747c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu } 748c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu 749c4b08bde2aaa455a7f789eb2858863d19563b949Chia-I Wu // add all known HDR combinations 7500607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto intent : sHdrRenderIntents) { 7510607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu for (auto mode : sHdrColorModes) { 7520607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu addColorMode(hwcColorModes, mode, intent); 7530607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 7540607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 7550607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 7560607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7570607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wubool DisplayDevice::hasRenderIntent(RenderIntent intent) const { 7580607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // assume a render intent is supported when SRGB supports it; we should 7590607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu // get rid of that assumption. 7600607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu auto iter = mColorModes.find(getColorModeKey(Dataspace::SRGB, intent)); 7610607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return iter != mColorModes.end() && iter->second.renderIntent == intent; 7620607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 7630607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7643c6b7efc5204eab5701d5ab2f0ff87763cc322faPeiyong Linbool DisplayDevice::hasLegacyHdrSupport(Dataspace dataspace) const { 7650607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if ((dataspace == Dataspace::BT2020_PQ && hasHDR10Support()) || 7660607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu (dataspace == Dataspace::BT2020_HLG && hasHLGSupport())) { 7670607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu auto iter = 7680607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu mColorModes.find(getColorModeKey(dataspace, RenderIntent::TONE_MAP_COLORIMETRIC)); 7693c6b7efc5204eab5701d5ab2f0ff87763cc322faPeiyong Lin return iter == mColorModes.end() || iter->second.dataspace != dataspace; 7700607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 7710607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7720607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu return false; 7730607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu} 7740607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7750607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wuvoid DisplayDevice::getBestColorMode(Dataspace dataspace, RenderIntent intent, 7760607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu Dataspace* outDataspace, ColorMode* outMode, 7770607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu RenderIntent* outIntent) const { 7780607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu auto iter = mColorModes.find(getColorModeKey(dataspace, intent)); 7790607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu if (iter != mColorModes.end()) { 7800607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outDataspace = iter->second.dataspace; 7810607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outMode = iter->second.colorMode; 7820607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outIntent = iter->second.renderIntent; 7830607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } else { 7840607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu ALOGE("map unknown (%s)/(%s) to default color mode", 7850607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu dataspaceDetails(static_cast<android_dataspace_t>(dataspace)).c_str(), 7860607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu decodeRenderIntent(intent).c_str()); 7870607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu 7880607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outDataspace = Dataspace::UNKNOWN; 7890607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outMode = ColorMode::NATIVE; 7900607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu *outIntent = RenderIntent::COLORIMETRIC; 7910607fbe8956a64151b165ac88ef9f3cf9b4ece5dChia-I Wu } 792d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin} 793d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin 794ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 795ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 796ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 797ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 798ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 799ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 800ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 801ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 802ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 803ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 804ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 805ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 806ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 807fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin 808fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin} // namespace android 809