DisplayDevice.cpp revision 48eb5659c312e63c3876a0d95480f71f9184bfde
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 31c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h" 429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 43875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 45da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 47c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 4813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h" 491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 50720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 51720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <configstore/Utils.h> 52720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 53a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 55a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#ifdef EGL_ANDROID_swap_rectangle 5889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = true; 5989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#else 6089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = false; 6189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 6289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 63720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore 64720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore; 65720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0; 66720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 671971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglardstatic bool useTripleFramebuffer = getInt64< ISurfaceFlingerConfigs, 6848eb5659c312e63c3876a0d95480f71f9184bfdeFabien Sanglard &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2) >= 3; 69720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 7089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#if !defined(EGL_EGLEXT_PROTOTYPES) || !defined(EGL_ANDROID_swap_rectangle) 7189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe// Dummy implementation in case it is missing. 7289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampeinline void eglSetSwapRectangleANDROID (EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint) { 7389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe} 7489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 7589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 81021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 82021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 835d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off 840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 86dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 87ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int format, 909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 91dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 92dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 9399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 94db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter EGLConfig config, 965d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter bool supportWideColor) 97b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 98b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 10127e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 10299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 10492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 1059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayWidth(), 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayHeight(), 1079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFormat(), 1099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 11092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 11192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 112dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 11301e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 1142c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 1156c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 1164f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mActiveConfig(0) 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1185d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 1195e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang Surface* surface; 1205e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mNativeWindow = surface = new Surface(producer, false); 121a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 122a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 12362caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter#ifdef USE_HWC2 124901a86e1edd983968dda2218f87a35064114c08dNaseer Ahmed mActiveColorMode = HAL_COLOR_MODE_NATIVE; 1254f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mDisplayHasWideColor = supportWideColor; 1264f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#else 1274f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter (void) supportWideColor; 12862caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter#endif 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 131b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 132385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1335e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang EGLSurface eglSurface; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 13519e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888); 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config = RenderEngine::chooseEglConfig(display, format); 1409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 14119e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 1425e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglSurface = eglCreateWindowSurface(display, config, window, NULL); 1435e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth); 1445e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1464ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 1474ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 1484ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 1494ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1504ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1514ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1524ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1534ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1544ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1554ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 15647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mConfig = config; 1571f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1585e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mSurface = eglSurface; 1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 1609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFormat = format; 1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1621f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 163da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 164da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1651f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1672c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1682c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1695f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1708dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1718dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1728dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1738dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1748dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1758dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1768dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1778dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1788dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1798dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1808dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1818dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1828dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1838dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 18498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 18500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 1865e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang 187720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee if (useTripleFramebuffer) { 188720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee surface->allocateBuffers(); 189720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee } 190a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 191a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 193ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 194ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 195ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 196ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 197ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 198ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 19902d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 20002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 20102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 2029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwcDisplayId >= DISPLAY_VIRTUAL) 2049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc.freeDisplayId(mHwcDisplayId); 2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 20602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 20702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 20802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 20902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 210ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 211ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 212ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 213ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 214ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 215ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 216ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 217ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 218ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 219ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 220ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 221ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 2229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2239d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardPixelFormat DisplayDevice::getFormat() const { 2249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mFormat; 2259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 228ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 229ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 230ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 231ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 2329e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 2339e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 2349e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 2359e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 2369e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 2379e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 2389e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 2390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 240076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t DisplayDevice::compositionComplete() const { 2459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplaySurface->compositionComplete(); 2469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2490f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 251875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (kEGLAndroidSwapRectangle) { 25489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (mFlags & SWAP_RECTANGLE) { 25589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Region newDirty(dirty.intersect(bounds())); 25689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Rect b(newDirty.getBounds()); 25789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe eglSetSwapRectangleANDROID(mDisplay, mSurface, 25889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe b.left, b.top, b.width(), b.height()); 25989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe } 26001e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 261d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 262076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2657143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2667143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 267028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 268028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 2699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 2739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 2749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 2779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 2789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 2799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 2809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 2819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 2829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 2839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 2849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 2869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 2879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 2889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 2899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 2929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const { 2959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplaySurface::CompositionType compositionType; 2969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard bool haveGles = hwc.hasGlesComposition(mHwcDisplayId); 2979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId); 2989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (haveGles && haveHwc) { 2999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionType = DisplaySurface::COMPOSITION_MIXED; 3009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else if (haveGles) { 3019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionType = DisplaySurface::COMPOSITION_GLES; 3029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else if (haveHwc) { 3039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionType = DisplaySurface::COMPOSITION_HWC; 3049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 3059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Nothing to do -- when turning the screen off we get a frame like 3069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this. Call it a HWC frame since we won't be doing any GLES work but 3079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // will do a prepare/set cycle. 3089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionType = DisplaySurface::COMPOSITION_HWC; 3099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplaySurface->prepareFrame(compositionType); 3119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 3129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 31338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 314da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 3159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 3169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwc.hasClientComposition(mHwcDisplayId)) { 3179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 3189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // We need to call eglSwapBuffers() if: 3199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // (1) we don't have a hardware composer, or 3209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // (2) we did GLES composition this frame, and either 3219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // (a) we have framebuffer target support (not present on legacy 3229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // devices, where HWComposer::commit() handles things); or 3239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // (b) this is a virtual display 3249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwc.initCheck() != NO_ERROR || 3259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard (hwc.hasGlesComposition(mHwcDisplayId) && 3269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) { 3279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 32899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 32999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 33099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 33199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 33299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 33399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 33499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 33599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 33699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 33799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 338da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 339da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 340da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 34152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 34299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 34399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 34499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 34599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 34632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 347da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 348da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 3509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 3519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 3529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 3539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 3549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 3559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwc.initCheck() == NO_ERROR) { 3569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplaySurface->onFrameCommitted(); 3579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 3599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 360da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 366875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { 367da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 36852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 369875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 370875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); 371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 372f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 373f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall eglSwapInterval(dpy, 0); 374da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 37552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 376931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 377da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 37852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 37952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 380875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 381875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 382875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 383c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 384c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 385c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 386bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 387bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 3889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 3899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 3909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 3919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 39413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 3953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 39813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 3993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 4003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 4013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 402cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 403cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 404cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 405cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 406cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 407da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 408cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 409cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 410cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 411cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 412cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 413cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 4143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 4152c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 4162c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 417d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 418d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4192c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 4202c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 421d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 422d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4232c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 4242c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 425d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 426d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 427d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 4286c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 4296c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 4306c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4316c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4326c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 4336c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 4346c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4356c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4366c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 4379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 43828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) { 43928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 44028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 44128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 44228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const { 44328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 44428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 44579d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 44679d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchtervoid DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { 44779d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 44879d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter native_window_set_buffers_data_space(window, dataspace); 44979d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 4509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 45128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 45228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 4533b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 45428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 45528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 45628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 45728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 45828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 45928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 46028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 461c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 462c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 463c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 464c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 465c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 466c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 467c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 468c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 469c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 470c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 471c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 472c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 473c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 474c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 475c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 476c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 477c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 478c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 479c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 4800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 4811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 4821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 4831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 4841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 4853165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 4861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 4871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4883165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 4891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 4901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4913165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 4921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 4931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4943165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 4951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 4961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 4981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 4991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 5001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 5011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 5021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 5031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 50447e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 50547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 50647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 507f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 508f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 509f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 510f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 511f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 51247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 51347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 51447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 51547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 51647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 51747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 51847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 51947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 52047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 52147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 52247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 52347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 52447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 52500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 526f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 527f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 528f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 529da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 530f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 531f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 532da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 533f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 534f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 5351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 536f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 537f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 538f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 539f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 540f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 5416360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 542f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 543f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 544f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 545f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 546f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 547f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 548f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 549f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 550f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 551f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 552766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 5531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 554f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 555f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 556f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 557f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 558f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 559f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 560f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 561f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 562f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 563f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 564f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 565f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 566f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 567f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 568f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 569f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 570f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 571f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 572f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 575f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 576f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 577f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 578f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 579f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 580f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 581f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 582f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 583f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 584f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 585f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 5866c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 587f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 588f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 589f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 590021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 593021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 594021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 595021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 596021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 597021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 598021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 599021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 600021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 601021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 602021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 603021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 604021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 605021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 606021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 607021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 608f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 609f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 6101b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 6111d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 612021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 613021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 614021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 615021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 61674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 6171d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 6180ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter EGLint redSize, greenSize, blueSize, alphaSize; 6190ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &redSize); 6200ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &greenSize); 6210ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &blueSize); 6220ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &alphaSize); 6230ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 6240ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 6250ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 6260ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 6270ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, 6280ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mNativeWindow.get(), redSize, greenSize, blueSize, alphaSize, mOrientation, 6290ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 6300ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 6310ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 6320ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 6330ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 6340ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 6350ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 6360ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 6371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 63899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 639f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 64099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 6411d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 642ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 643ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 644ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 645ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 646ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 647ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 648ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 649ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 650ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 651ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 652ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 653ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 654ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 655ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 656