DisplayDevice.cpp revision 144e116f45f196396f0d59d5fc09766ab618f885
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 52a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 54a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore 57720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore; 58720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0; 59720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 601971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglardstatic bool useTripleFramebuffer = getInt64< ISurfaceFlingerConfigs, 6148eb5659c312e63c3876a0d95480f71f9184bfdeFabien Sanglard &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2) >= 3; 62720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 69021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 705d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off 710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 74ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 76dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 7799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 78db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 795c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu bool supportWideColor, 805c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu bool supportHdr) 81b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 82b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 8527e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 8699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 87144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface{flinger->getRenderEngine().createSurface()}, 889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayWidth(), 899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayHeight(), 9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 91dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 9201e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 932c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 946c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 954f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mActiveConfig(0) 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 985e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang Surface* surface; 995e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mNativeWindow = surface = new Surface(producer, false); 100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 102901a86e1edd983968dda2218f87a35064114c08dNaseer Ahmed mActiveColorMode = HAL_COLOR_MODE_NATIVE; 1034f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mDisplayHasWideColor = supportWideColor; 1045c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu mDisplayHasHdr = supportHdr; 1055c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu 106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 108b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 109144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setCritical(mType == DisplayDevice::DISPLAY_PRIMARY); 110144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setAsync(mType >= DisplayDevice::DISPLAY_VIRTUAL); 111144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(window); 112144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayWidth = mSurface->queryWidth(); 113144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayHeight = mSurface->queryHeight(); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1154ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 1164ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 1174ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 1184ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1194ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1204ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1214ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1224ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1234ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1244ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 1251f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 126da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 127da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1281f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 129ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1325f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 13398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 13400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 1355e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang 136720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee if (useTripleFramebuffer) { 137720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee surface->allocateBuffers(); 138720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee } 139a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 140a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 14902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 15002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 152566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin return mFlinger != nullptr; 153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1639e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1649e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1659e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1669e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1679e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1689e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 171076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 174b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 176875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1807143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 1817143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 182028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 183028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 1849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 1859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 1879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 1889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 1919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 1929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 1939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 1949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 1959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 1969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 1979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 1989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 1999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 208da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 20988a905b9aff600150916a644d5bfd01a31c0ba82Madhuri Athota if (hwc.hasClientComposition(mHwcDisplayId) || hwc.hasFlipClientTargetRequest(mHwcDisplayId)) { 210144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->swapBuffers(); 211da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 21252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 21399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 21499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 21599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 21699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 21732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 218da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 219da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 223da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 224f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wubool DisplayDevice::makeCurrent() const { 225144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique bool success = mFlinger->getRenderEngine().setCurrentSurface(*mSurface); 226931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 227f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wu return success; 22852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 22952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 230875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 231875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 232875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 233c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 234c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 235c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 236bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 237bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 2399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 2409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 24413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2453b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 2463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2473b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 24813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2503b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 25283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { 25383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu mLayersNeedingFences = layers; 25483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 25583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 25683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { 25783806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return mLayersNeedingFences; 25883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 25983806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 260cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 261cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 262cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 263cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 264cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 265da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 266cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 267cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 268cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 269cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 270cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 271cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 2723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 2732c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 2742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 275d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 276d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 2772c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 2782c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 279d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 280d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 2812c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 2822c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 283d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 284d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 285d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 2866c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 2876c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 2886c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 2896c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 2906c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 2916c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 2926c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 2936c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 2946c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 29528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) { 29628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 29728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 29828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 29928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const { 30028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 30128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 30279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 30379d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchtervoid DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { 30479d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 30579d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter native_window_set_buffers_data_space(window, dataspace); 30679d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 30728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 30828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 3093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 31028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 31128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 31228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 31328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 31428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 31528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 31628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 317c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 318c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 319c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 320c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 321c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 322c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 323c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 324c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 325c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 326c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 327c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 328c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 329c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 330c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 331c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 332c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 333c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 334c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 335c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 3360f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3413165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3443165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3473165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3503165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 36047e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 36147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 36247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 363144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(nullptr); 364f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 36547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 36647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 36747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 368144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->setNativeWindow(window); 369144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayWidth = mSurface->queryWidth(); 370144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mDisplayHeight = mSurface->queryHeight(); 37147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 37247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 37347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 37447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 37547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 37647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 37747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 37800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 379f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 380f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 381f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 383f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 384f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 385da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 386f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 387f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 3946360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 405766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4396c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 443021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 444021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 445021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 446021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 447021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 448021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 449021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 450021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 451021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 452021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 453021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 454021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 455021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 456021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 457021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 458021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 459021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 460021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 462f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4641d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 465021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 466021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 467021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 468021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 46974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 4701d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 471152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 4720ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 4730ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 4740ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 4750ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 476152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window, 477144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryRedSize(), mSurface->queryGreenSize(), 478144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique mSurface->queryBlueSize(), mSurface->queryAlphaSize(), mOrientation, 479144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 4800ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 4810ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4820ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 4830ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4840ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 4850ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 4860ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 487152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter auto const surface = static_cast<Surface*>(window); 488152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter android_dataspace dataspace = surface->getBuffersDataSpace(); 489152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter result.appendFormat(" dataspace: %s (%d)\n", dataspaceDetails(dataspace).c_str(), dataspace); 4901d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 49199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 492f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 49399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 4941d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 495ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 496ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 497ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 498ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 499ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 500ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 501ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 502ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 503ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 504ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 505ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 506ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 507ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 508ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 509