DisplayDevice.cpp revision 7501ed66a05f530062925011d1342e8651216051
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
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
32c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h"
401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h"
42875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
44da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h"
450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
46c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
4713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h"
481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
49720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
50720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <configstore/Utils.h>
51720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee
52fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linnamespace android {
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore
55720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore;
56720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0;
57fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linusing android::ui::ColorMode;
586266589793ddd9769a649a6b5f61ef115179572bPeiyong Linusing android::ui::Hdr;
59dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linusing android::ui::RenderIntent;
60720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0;
67021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
685d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off
690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
71dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
72ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
74dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
750959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique        const sp<ANativeWindow>& nativeWindow,
7699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
770959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique        std::unique_ptr<RE::Surface> renderSurface,
780959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique        int displayWidth,
790959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique        int displayHeight,
80dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin        bool hasWideColorGamut,
816266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin        const HdrCapabilities& hdrCapabilities,
822c327ac2840b34848543cc961d16d3dbad102f16Peiyong Lin        const int32_t supportedPerFrameMetadata,
83d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin        const std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>>& hdrAndRenderIntents,
840959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique        int initialPowerMode)
85b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall    : lastCompositionHadVisibleLayers(false),
86b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall      mFlinger(flinger),
879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mType(type),
889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mHwcDisplayId(hwcId),
8927e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
900959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mNativeWindow(nativeWindow),
9199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
920959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mSurface{std::move(renderSurface)},
930959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mDisplayWidth(displayWidth),
940959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mDisplayHeight(displayHeight),
950959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mPageFlipCount(0),
96dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
9701e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
982c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
990959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mViewport(Rect::INVALID_RECT),
1000959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mFrame(Rect::INVALID_RECT),
1010959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mPowerMode(initialPowerMode),
1020959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mActiveConfig(0),
1030959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique      mActiveColorMode(ColorMode::NATIVE),
1047c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang      mColorTransform(HAL_COLOR_TRANSFORM_IDENTITY),
105dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin      mHasWideColorGamut(hasWideColorGamut),
1066266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin      mHasHdr10(false),
1076266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin      mHasHLG(false),
1082c327ac2840b34848543cc961d16d3dbad102f16Peiyong Lin      mHasDolbyVision(false),
109d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin      mSupportedPerFrameMetadata(supportedPerFrameMetadata),
110d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin      mHasBT2100PQColorimetric(false),
111d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin      mHasBT2100PQEnhance(false),
112d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin      mHasBT2100HLGColorimetric(false),
113d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin      mHasBT2100HLGEnhance(false)
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1155d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // clang-format on
116fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    std::vector<Hdr> types = hdrCapabilities.getSupportedHdrTypes();
117fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    for (Hdr hdrType : types) {
1186266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin        switch (hdrType) {
1196266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin            case Hdr::HDR10:
1206266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                mHasHdr10 = true;
1216266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                break;
1226266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin            case Hdr::HLG:
1236266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                mHasHLG = true;
1246266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                break;
1256266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin            case Hdr::DOLBY_VISION:
1266266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                mHasDolbyVision = true;
1276266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                break;
1286266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin            default:
1296266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin                ALOGE("UNKNOWN HDR capability: %d", static_cast<int32_t>(hdrType));
1306266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin        }
1316266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin    }
1325f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
133fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    float minLuminance = hdrCapabilities.getDesiredMinLuminance();
134fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    float maxLuminance = hdrCapabilities.getDesiredMaxLuminance();
135fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    float maxAverageLuminance = hdrCapabilities.getDesiredMaxAverageLuminance();
136fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin
137fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    minLuminance = minLuminance <= 0.0 ? sDefaultMinLumiance : minLuminance;
138fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    maxLuminance = maxLuminance <= 0.0 ? sDefaultMaxLumiance : maxLuminance;
139fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    maxAverageLuminance = maxAverageLuminance <= 0.0 ? sDefaultMaxLumiance : maxAverageLuminance;
140fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    if (this->hasWideColorGamut()) {
141fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        // insert HDR10/HLG as we will force client composition for HDR10/HLG
142fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        // layers
143fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        if (!hasHDR10Support()) {
144fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin          types.push_back(Hdr::HDR10);
145fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        }
146fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin
147fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        if (!hasHLGSupport()) {
148fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin          types.push_back(Hdr::HLG);
149fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin        }
150fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    }
151fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin    mHdrCapabilities = HdrCapabilities(types, maxLuminance, maxAverageLuminance, minLuminance);
152fb069305e90947aeb76b72527f23aa24564f3c87Peiyong Lin
153d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    auto iter = hdrAndRenderIntents.find(ColorMode::BT2100_PQ);
154d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    if (iter != hdrAndRenderIntents.end()) {
155d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin        hasToneMapping(iter->second,
156d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                       &mHasBT2100PQColorimetric, &mHasBT2100PQEnhance);
157d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    }
158d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin
159d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    iter = hdrAndRenderIntents.find(ColorMode::BT2100_HLG);
160d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    if (iter != hdrAndRenderIntents.end()) {
161d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin        hasToneMapping(iter->second,
162d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                       &mHasBT2100HLGColorimetric, &mHasBT2100HLGEnhance);
163d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    }
164d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin
16598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
167a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
168a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1690959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd PiqueDisplayDevice::~DisplayDevice() = default;
170ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
17102d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
17202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
17302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
17402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
17502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
17602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
17702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
178ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
179566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin    return mFlinger != nullptr;
180ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
181ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
182ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
183ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
184ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
185ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
186ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
187ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
188ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
189ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
1909e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1919e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1929e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1939e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1949e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1959e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1969e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1970f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
198076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
201b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
203875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2077143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2087143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
209028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
210028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) {
2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t error = hwc.prepare(*this);
2139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != NO_ERROR) {
2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return error;
2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    DisplaySurface::CompositionType compositionType;
2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasClient = hwc.hasClientComposition(mHwcDisplayId);
2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId);
2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hasClient && hasDevice) {
2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_MIXED;
2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasClient) {
2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_GLES;
2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasDevice) {
2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // Nothing to do -- when turning the screen off we get a frame like
2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // this. Call it a HWC frame since we won't be doing any GLES work but
2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // will do a prepare/set cycle.
2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->prepareFrame(compositionType);
2339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
23438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
235da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
23688a905b9aff600150916a644d5bfd01a31c0ba82Madhuri Athota    if (hwc.hasClientComposition(mHwcDisplayId) || hwc.hasFlipClientTargetRequest(mHwcDisplayId)) {
237144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique        mSurface->swapBuffers();
238da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
23952e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
24099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
24432341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
245da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
246da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const {
2489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mDisplaySurface->onFrameCommitted();
2499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
251f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wubool DisplayDevice::makeCurrent() const {
252144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    bool success = mFlinger->getRenderEngine().setCurrentSurface(*mSurface);
253931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
254f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wu    return success;
25552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
25652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
257875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
258875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
259875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
260c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
261c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h,
262c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        false, Transform::ROT_0);
263bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
264bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const {
2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->getClientTargetAcquireFence();
2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
27113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
2723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
2733b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2743b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
27513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
27983806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) {
28083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    mLayersNeedingFences = layers;
28183806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu}
28283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu
28383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const {
28483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    return mLayersNeedingFences;
28583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu}
28683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu
287cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
288cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
289cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
290cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
291cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
292da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
293cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
294cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
295cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
296cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
297cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
298cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
2993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
3002c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) {
3012c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = mode;
302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
3042c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode()  const {
3052c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return mPowerMode;
306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
3082c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const {
3092c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return (mPowerMode != HWC_POWER_MODE_OFF);
310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3136c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) {
3146c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    mActiveConfig = mode;
3156c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
3166c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
3176c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig()  const {
3186c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    return mActiveConfig;
3196c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
3206c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
3216c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ----------------------------------------------------------------------------
322a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Linvoid DisplayDevice::setActiveColorMode(ColorMode mode) {
32328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    mActiveColorMode = mode;
32428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
32528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
326a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong LinColorMode DisplayDevice::getActiveColorMode() const {
32728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    return mActiveColorMode;
32828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
32979d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter
330dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong LinRenderIntent DisplayDevice::getActiveRenderIntent() const {
331dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin    return mActiveRenderIntent;
332dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin}
333dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin
334dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linvoid DisplayDevice::setActiveRenderIntent(RenderIntent renderIntent) {
335dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin    mActiveRenderIntent = renderIntent;
336dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin}
337dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin
3387c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangvoid DisplayDevice::setColorTransform(const mat4& transform) {
3397c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang    const bool isIdentity = (transform == mat4());
3407c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang    mColorTransform =
3417c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang            isIdentity ? HAL_COLOR_TRANSFORM_IDENTITY : HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
3427c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang}
3437c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang
3447c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangandroid_color_transform_t DisplayDevice::getColorTransform() const {
3457c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang    return mColorTransform;
3467c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang}
3477c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang
34834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linvoid DisplayDevice::setCompositionDataSpace(ui::Dataspace dataspace) {
349dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin    mCompositionDataSpace = dataspace;
35079d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter    ANativeWindow* const window = mNativeWindow.get();
35134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    native_window_set_buffers_data_space(window, static_cast<android_dataspace>(dataspace));
35279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter}
35328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
354dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linui::Dataspace DisplayDevice::getCompositionDataSpace() const {
355dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin    return mCompositionDataSpace;
356dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin}
357dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin
35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ----------------------------------------------------------------------------
3593b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
36028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
36128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
36228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
36328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
36428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
36528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
36628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
367c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
368c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
369c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
370c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
371c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
372c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
373c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
374c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
375c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
376c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
377c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
378c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
379c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
380c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
381c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
382c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
383c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
384c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
385c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
3860f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3913165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3943165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3973165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4003165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
4021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
4041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
4051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
4071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
41047e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) {
41147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    dirtyRegion.set(getBounds());
41247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
413144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setNativeWindow(nullptr);
414f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine
41547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mDisplaySurface->resizeBuffers(newWidth, newHeight);
41647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
41747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    ANativeWindow* const window = mNativeWindow.get();
418144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setNativeWindow(window);
419144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayWidth = mSurface->queryWidth();
420144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayHeight = mSurface->queryHeight();
42147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
42247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayWidth != newWidth,
42347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new width to %d", newWidth);
42447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayHeight != newHeight,
42547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new height to %d", newHeight);
42647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine}
42747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
42800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
432da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
435da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
4381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
4446360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
451f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
454f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
455766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
4561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
457f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
458f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
459f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
460f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
462f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
463f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
464f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
465f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
466f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
467f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
468f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
469f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
470f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
471f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
472f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
473f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
474f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
475f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
476f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
477f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
4787501ed66a05f530062925011d1342e8651216051Iris Chang    // need to take care of primary display rotation for mGlobalTransform
4797501ed66a05f530062925011d1342e8651216051Iris Chang    // for case if the panel is not installed aligned with device orientation
4807501ed66a05f530062925011d1342e8651216051Iris Chang    if (mType == DisplayType::DISPLAY_PRIMARY) {
4817501ed66a05f530062925011d1342e8651216051Iris Chang        int primaryDisplayOrientation = mFlinger->getPrimaryDisplayOrientation();
4827501ed66a05f530062925011d1342e8651216051Iris Chang        DisplayDevice::orientationToTransfrom(
4837501ed66a05f530062925011d1342e8651216051Iris Chang                (orientation + primaryDisplayOrientation) % (DisplayState::eOrientation270 + 1),
4847501ed66a05f530062925011d1342e8651216051Iris Chang                w, h, &R);
4857501ed66a05f530062925011d1342e8651216051Iris Chang    }
4867501ed66a05f530062925011d1342e8651216051Iris Chang
487f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
488f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
489f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
490f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
491f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
492f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
493f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
494f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
495f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
496f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
497f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
4986c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
499f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
500f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
501f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
502021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    if (mType == DisplayType::DISPLAY_PRIMARY) {
503021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t transform = 0;
504021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        switch (mOrientation) {
505021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientationDefault:
506021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_0;
507021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
508021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation90:
509021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_90;
510021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
511021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation180:
512021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_180;
513021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
514021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation270:
515021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_270;
516021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
517021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        }
518021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        sPrimaryDisplayOrientation = transform;
519021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    }
520f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
521f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
5221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
5231d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
524021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() {
525021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    return sPrimaryDisplayOrientation;
526021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos}
527021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
52874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
5291d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
530152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    ANativeWindow* const window = mNativeWindow.get();
5310ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string());
5320ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p "
5330ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "(%d:%d:%d:%d), orient=%2d (type=%08x), "
5340ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n",
535152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter                        mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window,
536144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        mSurface->queryRedSize(), mSurface->queryGreenSize(),
537144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        mSurface->queryBlueSize(), mSurface->queryAlphaSize(), mOrientation,
538144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig,
5390ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mVisibleLayersSortedByZ.size());
5400ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
5410ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
5420ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
5430ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left,
5440ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0],
5450ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]);
546152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    auto const surface = static_cast<Surface*>(window);
54734beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    ui::Dataspace dataspace = surface->getBuffersDataSpace();
548dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin    result.appendFormat("   wideColorGamut=%d, hdr10=%d, colorMode=%s, dataspace: %s (%d)\n",
549dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin                        mHasWideColorGamut, mHasHdr10,
5501e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu                        decodeColorMode(mActiveColorMode).c_str(),
55134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin                        dataspaceDetails(static_cast<android_dataspace>(dataspace)).c_str(), dataspace);
5521d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
55399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
554f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    mDisplaySurface->dumpAsString(surfaceDump);
55599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
5561d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
557ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
558d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Linvoid DisplayDevice::hasToneMapping(const std::vector<RenderIntent>& renderIntents,
559d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                                   bool* outColorimetric, bool *outEnhance) {
560d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    for (auto intent : renderIntents) {
561d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin        switch (intent) {
562d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin            case RenderIntent::TONE_MAP_COLORIMETRIC:
563d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                *outColorimetric = true;
564d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                break;
565d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin            case RenderIntent::TONE_MAP_ENHANCE:
566d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                *outEnhance = true;
567d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                break;
568d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin            default:
569d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin                break;
570d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin        }
571d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin    }
572d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin}
573d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin
574ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1);
575ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
576ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure)
577ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    : type(type),
578ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      layerStack(DisplayDevice::NO_LAYER_STACK),
579ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      orientation(0),
580ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      width(0),
581ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      height(0),
582ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      isSecure(isSecure)
583ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{
584ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    viewport.makeInvalid();
585ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    frame.makeInvalid();
586ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel}
587fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin
588fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin}  // namespace android
589