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