DisplayDevice.cpp revision 6266589793ddd9769a649a6b5f61ef115179572b
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, 820959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique int initialPowerMode) 83b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 84b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 8727e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 880959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mNativeWindow(nativeWindow), 8999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 900959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mSurface{std::move(renderSurface)}, 910959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mDisplayWidth(displayWidth), 920959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mDisplayHeight(displayHeight), 930959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mPageFlipCount(0), 94dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 9501e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 962c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 970959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mViewport(Rect::INVALID_RECT), 980959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mFrame(Rect::INVALID_RECT), 990959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mPowerMode(initialPowerMode), 1000959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mActiveConfig(0), 1010959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique mActiveColorMode(ColorMode::NATIVE), 1027c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang mColorTransform(HAL_COLOR_TRANSFORM_IDENTITY), 103dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mHasWideColorGamut(hasWideColorGamut), 1046266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHdr10(false), 1056266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHLG(false), 1066266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasDolbyVision(false) 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1085d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 1096266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin for (Hdr hdrType : hdrCapabilities.getSupportedHdrTypes()) { 1106266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin switch (hdrType) { 1116266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::HDR10: 1126266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHdr10 = true; 1136266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 1146266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::HLG: 1156266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasHLG = true; 1166266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 1176266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin case Hdr::DOLBY_VISION: 1186266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin mHasDolbyVision = true; 1196266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin break; 1206266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin default: 1216266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin ALOGE("UNKNOWN HDR capability: %d", static_cast<int32_t>(hdrType)); 1226266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin } 1236266589793ddd9769a649a6b5f61ef115179572bPeiyong Lin } 1245f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 12598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 12600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 127a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 128a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1290959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd PiqueDisplayDevice::~DisplayDevice() = default; 130ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 13102d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 13202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 13302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 13402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 13502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 13602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 13702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 139566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin return mFlinger != nullptr; 140ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 144ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 145ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 146ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 147ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 148ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1509e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1519e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1529e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1539e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1549e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1559e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1569e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1570f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 161b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 163875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1677143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 1687143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 169028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 170028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 1719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 1729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 1739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 1749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 1759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 1789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 1799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 1809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 1819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 1829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 1839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 1849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 1859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 1879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 1889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 1899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 1909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 1919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 1939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 19438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 195da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 19688a905b9aff600150916a644d5bfd01a31c0ba82Madhuri Athota if (hwc.hasClientComposition(mHwcDisplayId) || hwc.hasFlipClientTargetRequest(mHwcDisplayId)) { 197144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->swapBuffers(); 198da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 19952e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 20099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 20199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 20299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 20399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 20432341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 205da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 206da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 210da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 211f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wubool DisplayDevice::makeCurrent() const { 212144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique bool success = mFlinger->getRenderEngine().setCurrentSurface(*mSurface); 213931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 214f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wu return success; 21552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 21652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 217875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 218875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 219875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 220c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 221c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 222c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 223bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 224bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 23113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2323b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 2333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 23513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2373b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2383b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 23983806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { 24083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu mLayersNeedingFences = layers; 24183806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 24283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 24383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { 24483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return mLayersNeedingFences; 24583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 24683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 247cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 248cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 249cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 250cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 251cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 252da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 253cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 254cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 255cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 256cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 257cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 258cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 2593b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 2602c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 2612c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 262d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 263d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 2642c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 2652c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 266d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 267d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 2682c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 2692c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 270d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 271d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 272d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 2736c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 2746c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 2756c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 2766c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 2776c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 2786c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 2796c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 2806c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 2816c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 282a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Linvoid DisplayDevice::setActiveColorMode(ColorMode mode) { 28328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 28428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 28528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 286a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong LinColorMode DisplayDevice::getActiveColorMode() const { 28728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 28828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 28979d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 290dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong LinRenderIntent DisplayDevice::getActiveRenderIntent() const { 291dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin return mActiveRenderIntent; 292dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 293dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 294dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linvoid DisplayDevice::setActiveRenderIntent(RenderIntent renderIntent) { 295dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mActiveRenderIntent = renderIntent; 296dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 297dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 2987c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangvoid DisplayDevice::setColorTransform(const mat4& transform) { 2997c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang const bool isIdentity = (transform == mat4()); 3007c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang mColorTransform = 3017c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang isIdentity ? HAL_COLOR_TRANSFORM_IDENTITY : HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX; 3027c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang} 3037c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 3047c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhangandroid_color_transform_t DisplayDevice::getColorTransform() const { 3057c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang return mColorTransform; 3067c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang} 3077c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang 30834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linvoid DisplayDevice::setCompositionDataSpace(ui::Dataspace dataspace) { 309dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mCompositionDataSpace = dataspace; 31079d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 31134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin native_window_set_buffers_data_space(window, static_cast<android_dataspace>(dataspace)); 31279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 31328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 314dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linui::Dataspace DisplayDevice::getCompositionDataSpace() const { 315dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin return mCompositionDataSpace; 316dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin} 317dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 31828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 3193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 32028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 32128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 32228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 32328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 32428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 32528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 32628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 327c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 328c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 329c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 330c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 331c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 332c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 333c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 334c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 335c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 336c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 337c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 338c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 339c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 340c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 341c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 342c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 343c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 344c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 345c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 3460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3513165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3573165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3603165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 37047e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 37147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 37247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 373144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(nullptr); 374f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 37547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 37647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 37747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 378144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(window); 379144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayWidth = mSurface->queryWidth(); 380144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayHeight = mSurface->queryHeight(); 38147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 38247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 38347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 38447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 38547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 38647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 38747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 38800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 392da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 394f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 395da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 4046360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 406f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 415766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4496c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 451f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 453021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 454021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 455021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 456021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 457021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 458021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 459021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 460021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 461021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 462021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 463021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 464021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 465021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 466021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 467021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 468021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 469021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 470021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 471f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 472f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4741d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 475021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 476021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 477021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 478021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 47974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 4801d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 481152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 4820ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 4830ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 4840ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 4850ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 486152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window, 487144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryRedSize(), mSurface->queryGreenSize(), 488144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryBlueSize(), mSurface->queryAlphaSize(), mOrientation, 489144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 4900ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 4910ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4920ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 4930ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4940ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 4950ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 4960ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 497152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter auto const surface = static_cast<Surface*>(window); 49834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin ui::Dataspace dataspace = surface->getBuffersDataSpace(); 499dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin result.appendFormat(" wideColorGamut=%d, hdr10=%d, colorMode=%s, dataspace: %s (%d)\n", 500dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mHasWideColorGamut, mHasHdr10, 5011e04361db1b65d3998edbf820078ccfaed477cb6Chia-I Wu decodeColorMode(mActiveColorMode).c_str(), 50234beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin dataspaceDetails(static_cast<android_dataspace>(dataspace)).c_str(), dataspace); 5031d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 50499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 505f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 50699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 5071d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 508ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 509ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 510ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 511ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 512ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 513ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 514ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 515ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 516ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 517ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 518ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 519ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 520ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 521ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 522fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin 523fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin} // namespace android 524