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