DisplayDevice.cpp revision 1971b63aa4d82db37794f19e0eb01feb1826e422
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
830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
85dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
86ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        int format,
899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
90dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
91dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
9299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
93db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
95b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall    : lastCompositionHadVisibleLayers(false),
96b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall      mFlinger(flinger),
979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mType(type),
989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mHwcDisplayId(hwcId),
9927e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
10099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayWidth(),
1049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayHeight(),
1059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
1069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard      mFormat(),
1079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
10892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
10992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
110dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
11101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
1122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
1136c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mPowerMode(HWC_POWER_MODE_OFF),
1146c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mActiveConfig(0)
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1165e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    Surface* surface;
1175e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mNativeWindow = surface = new Surface(producer, false);
118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
12062caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter#ifdef USE_HWC2
12162caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter    mActiveColorMode = static_cast<android_color_mode_t>(-1);
12262caf7cf7620d89a80247abc786b437597fbcbfbCourtney Goeltzenleuchter#endif
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
125b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
126385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1275e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    EGLSurface eglSurface;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
12919e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    if (config == EGL_NO_CONFIG) {
1309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888);
1329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        config = RenderEngine::chooseEglConfig(display, format);
1349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
13519e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    }
1365e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglSurface = eglCreateWindowSurface(display, config, window, NULL);
1375e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_WIDTH,  &mDisplayWidth);
1385e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight);
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1404ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // Make sure that composition can never be stalled by a virtual display
1414ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // consumer that isn't processing buffers fast enough. We have to do this
1424ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // in two places:
1434ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * Here, in case the display is composed entirely by HWC.
1444ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
1454ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   window's swap interval in eglMakeCurrent, so they'll override the
1464ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   interval we set here.
1474ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
1484ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong        window->setSwapInterval(window, 0);
1494ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong
15047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mConfig = config;
1511f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1525e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mSurface = eglSurface;
1539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    mFormat = format;
1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
1561f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
157da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
158da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1591f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
1612c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ?
1622c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani                  HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
1635f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1668dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1678dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1688dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1698dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1708dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1718dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1728dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1738dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1748dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1758dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1768dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1778dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
17898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
17900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
1805e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang
181720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee    if (useTripleFramebuffer) {
182720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee        surface->allocateBuffers();
183720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee    }
184a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
185a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
186ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
187ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
188ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
189ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
190ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
19302d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
19402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
19502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
1969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
1979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
1989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            hwc.freeDisplayId(mHwcDisplayId);
1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
20002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
20102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
20202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
20302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
204ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
205ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
206ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
207ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
208ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
209ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
210ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
211ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
212ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
213ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
214ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
215ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardPixelFormat DisplayDevice::getFormat() const {
2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return mFormat;
2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
222ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
223ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
224ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
225ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2269e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
2279e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
2289e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
2299e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
2309e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
2319e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
2329e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
2330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2
2389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t DisplayDevice::compositionComplete() const {
2399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return mDisplaySurface->compositionComplete();
2409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
2419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
2429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard
2430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
245875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe    if (kEGLAndroidSwapRectangle) {
24889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        if (mFlags & SWAP_RECTANGLE) {
24989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Region newDirty(dirty.intersect(bounds()));
25089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Rect b(newDirty.getBounds());
25189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            eglSetSwapRectangleANDROID(mDisplay, mSurface,
25289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe                    b.left, b.top, b.width(), b.height());
25389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        }
25401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
255d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2597143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2607143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
261028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
262028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
2639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) {
2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t error = hwc.prepare(*this);
2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != NO_ERROR) {
2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return error;
2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    DisplaySurface::CompositionType compositionType;
2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasClient = hwc.hasClientComposition(mHwcDisplayId);
2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId);
2739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hasClient && hasDevice) {
2749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_MIXED;
2759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasClient) {
2769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_GLES;
2779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasDevice) {
2789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
2809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // Nothing to do -- when turning the screen off we get a frame like
2819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // this. Call it a HWC frame since we won't be doing any GLES work but
2829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // will do a prepare/set cycle.
2839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->prepareFrame(compositionType);
2869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
2889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
2899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    DisplaySurface::CompositionType compositionType;
2909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
2919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
2929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (haveGles && haveHwc) {
2939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        compositionType = DisplaySurface::COMPOSITION_MIXED;
2949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else if (haveGles) {
2959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        compositionType = DisplaySurface::COMPOSITION_GLES;
2969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else if (haveHwc) {
2979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        compositionType = DisplaySurface::COMPOSITION_HWC;
2989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    } else {
2999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // Nothing to do -- when turning the screen off we get a frame like
3009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // this. Call it a HWC frame since we won't be doing any GLES work but
3019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        // will do a prepare/set cycle.
3029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        compositionType = DisplaySurface::COMPOSITION_HWC;
3039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
3049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    return mDisplaySurface->prepareFrame(compositionType);
3059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
3069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
30738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
308da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
3099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
3109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwc.hasClientComposition(mHwcDisplayId)) {
3119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
3129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    // We need to call eglSwapBuffers() if:
3139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    //  (1) we don't have a hardware composer, or
3149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    //  (2) we did GLES composition this frame, and either
3159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    //    (a) we have framebuffer target support (not present on legacy
3169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    //        devices, where HWComposer::commit() handles things); or
3179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    //    (b) this is a virtual display
3189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (hwc.initCheck() != NO_ERROR ||
3199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard            (hwc.hasGlesComposition(mHwcDisplayId) &&
3209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard             (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
3219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
32299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
32399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
32499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
32599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
32699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
32799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
32899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
32999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
33099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
33199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
332da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
333da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
334da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
33552e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
33699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
33799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
33899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
33999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
34032341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
341da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
342da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
3449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const {
3459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mDisplaySurface->onFrameCommitted();
3469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
3479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else
3489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
3499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    if (hwc.initCheck() == NO_ERROR) {
3509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard        mDisplaySurface->onFrameCommitted();
3519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard    }
3529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}
3539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
354da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
360875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
361da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
36252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
363875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    if (sur != mSurface) {
364875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
365da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
366f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
367f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall                eglSwapInterval(dpy, 0);
368da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
36952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
370931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
37252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
37352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
374875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
375875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
376875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
377c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
378c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h,
379c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        false, Transform::ROT_0);
380bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
381bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
3829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const {
3839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->getClientTargetAcquireFence();
3849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
3859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
38813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
3893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
39213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
3933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
396cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
397cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
398cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
399cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
400cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
401da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
402cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
403cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
404cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
405cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
406cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
407cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
4083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
4092c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) {
4102c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = mode;
411d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
412d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
4132c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode()  const {
4142c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return mPowerMode;
415d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
416d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
4172c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const {
4182c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return (mPowerMode != HWC_POWER_MODE_OFF);
419d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
420d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
421d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
4226c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) {
4236c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    mActiveConfig = mode;
4246c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
4256c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
4266c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig()  const {
4276c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    return mActiveConfig;
4286c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
4296c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
4306c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ----------------------------------------------------------------------------
4319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2
43228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) {
43328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    mActiveColorMode = mode;
43428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
43528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
43628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const {
43728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    return mActiveColorMode;
43828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
4399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif
44028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
44128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ----------------------------------------------------------------------------
4423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
44328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
44428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
44528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
44628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
44728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
44828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
44928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
450c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
451c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
452c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
453c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
454c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
455c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
456c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
457c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
458c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
459c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
460c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
461c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
462c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
463c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
464c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
465c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
466c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
467c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
468c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
4690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
4701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
4711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
4721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
4731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
4743165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
4751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
4761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4773165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
4781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
4791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
4811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
4821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4833165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
4841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
4851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
4871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
4881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
4901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
49347e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) {
49447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    dirtyRegion.set(getBounds());
49547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
496f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine    if (mSurface != EGL_NO_SURFACE) {
497f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine        eglDestroySurface(mDisplay, mSurface);
498f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine        mSurface = EGL_NO_SURFACE;
499f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine    }
500f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine
50147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mDisplaySurface->resizeBuffers(newWidth, newHeight);
50247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
50347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    ANativeWindow* const window = mNativeWindow.get();
50447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL);
50547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    eglQuerySurface(mDisplay, mSurface, EGL_WIDTH,  &mDisplayWidth);
50647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight);
50747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
50847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayWidth != newWidth,
50947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new width to %d", newWidth);
51047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayHeight != newHeight,
51147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new height to %d", newHeight);
51247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine}
51347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
51400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
515f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
516f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
517f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
518da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
519f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
520f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
521da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
522f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
523f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
5241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
525f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
526f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
527f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
528f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
529f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
5306360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
531f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
532f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
533f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
534f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
535f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
536f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
537f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
538f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
539f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
540f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
541766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
5421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
543f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
544f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
545f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
546f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
547f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
548f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
549f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
550f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
551f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
552f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
553f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
554f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
555f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
556f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
557f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
558f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
559f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
560f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
561f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
562f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
563f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
564f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
565f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
566f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
567f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
568f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
569f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
570f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
571f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
572f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
5756c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
576f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
577f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
578f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
579021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    if (mType == DisplayType::DISPLAY_PRIMARY) {
580021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t transform = 0;
581021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        switch (mOrientation) {
582021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientationDefault:
583021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_0;
584021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
585021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation90:
586021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_90;
587021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
588021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation180:
589021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_180;
590021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
591021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation270:
592021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_270;
593021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
594021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        }
595021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        sPrimaryDisplayOrientation = transform;
596021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    }
597f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
598f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
5991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
6001d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
601021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() {
602021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    return sPrimaryDisplayOrientation;
603021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos}
604021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
60574d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
6061d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
60774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
6081d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
60902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
610b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n"
611766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
6121d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
61302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
6141d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
6151d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
616b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        mIsSecure, mPowerMode, mActiveConfig,
6176c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine        mVisibleLayersSortedByZ.size(),
6181d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
6191d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
620766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
6211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
6221d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
6231d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
6241d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
62599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
626f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    mDisplaySurface->dumpAsString(surfaceDump);
62799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
6281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
629ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
630ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1);
631ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
632ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure)
633ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    : type(type),
634ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      layerStack(DisplayDevice::NO_LAYER_STACK),
635ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      orientation(0),
636ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      width(0),
637ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      height(0),
638ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      isSecure(isSecure)
639ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{
640ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    viewport.makeInvalid();
641ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    frame.makeInvalid();
642ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel}
643