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, 681971b63aa4d82db37794f19e0eb01feb1826e422Fabien 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 12462caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter mActiveColorMode = static_cast<android_color_mode_t>(-1); 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} 4459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 44628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 44728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 4483b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 44928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 45028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 45128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 45228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 45328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 45428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 45528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 456c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 457c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 458c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 459c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 460c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 461c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 462c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 463c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 464c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 465c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 466c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 467c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 468c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 469c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 470c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 471c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 472c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 473c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 474c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 4750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 4761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 4771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 4781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 4791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 4803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 4811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 4821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4833165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 4841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 4851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4863165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 4871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 4881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4893165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 4901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 4911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 4931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 4941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 4961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 49947e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 50047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 50147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 502f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 503f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 504f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 505f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 506f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 50747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 50847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 50947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 51047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 51147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 51247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 51347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 51447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 51547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 51647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 51747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 51847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 51947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 52000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 521f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 522f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 523f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 524da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 525f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 526f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 527da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 528f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 529f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 5301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 531f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 532f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 533f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 534f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 535f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 5366360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 537f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 538f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 539f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 540f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 541f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 542f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 543f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 544f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 545f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 546f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 547766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 5481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 549f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 550f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 551f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 552f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 553f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 554f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 555f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 556f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 557f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 558f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 559f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 560f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 561f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 562f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 563f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 564f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 565f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 566f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 567f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 568f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 569f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 570f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 571f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 572f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 575f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 576f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 577f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 578f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 579f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 580f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 5816c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 582f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 583f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 584f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 585021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 586021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 587021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 588021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 589021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 590021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 593021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 594021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 595021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 596021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 597021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 598021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 599021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 600021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 601021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 602021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 603f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 604f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 6051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 6061d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 607021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 608021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 609021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 610021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 61174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 6121d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 61374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 6141d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 61502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall " type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 616b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n" 617766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 6181d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 61902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mDisplayName.string(), mType, mHwcDisplayId, 6201d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 6211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 622b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos mIsSecure, mPowerMode, mActiveConfig, 6236c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mVisibleLayersSortedByZ.size(), 6241d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 6251d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 626766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 6271d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 6281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 6291d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 6301d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 63199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 632f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 63399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 6341d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 635ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 636ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 637ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 638ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 639ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 640ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 641ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 642ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 643ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 644ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 645ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 646ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 647ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 648ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 649