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