DisplayDevice.cpp revision 9e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9
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"
409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h"
429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#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
50a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
52a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#ifdef EGL_ANDROID_swap_rectangle
5589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = true;
5689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#else
5789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = false;
5889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif
5989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe
6089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#if !defined(EGL_EGLEXT_PROTOTYPES) || !defined(EGL_ANDROID_swap_rectangle)
6189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe// Dummy implementation in case it is missing.
6289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampeinline void eglSetSwapRectangleANDROID (EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint) {
6389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe}
6489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif
6589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
74ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
7619e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        int format,
779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
78dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
79dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
8099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
81db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
82a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
83b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall    : lastCompositionHadVisibleLayers(false),
84b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall      mFlinger(flinger),
859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mType(type),
869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mHwcDisplayId(hwcId),
8727e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
8899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
8992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayWidth(),
929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayHeight(),
939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mFormat(),
959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
98dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
9901e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
1002c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
1016c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mPowerMode(HWC_POWER_MODE_OFF),
1026c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mActiveConfig(0)
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1045e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    Surface* surface;
1055e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mNativeWindow = surface = new Surface(producer, false);
106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
110b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
111385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1125e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    EGLSurface eglSurface;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
11419e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    if (config == EGL_NO_CONFIG) {
1159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888);
1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
11819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        config = RenderEngine::chooseEglConfig(display, format);
1199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
12019e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    }
1215e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglSurface = eglCreateWindowSurface(display, config, window, NULL);
1225e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_WIDTH,  &mDisplayWidth);
1235e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1254ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // Make sure that composition can never be stalled by a virtual display
1264ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // consumer that isn't processing buffers fast enough. We have to do this
1274ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // in two places:
1284ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * Here, in case the display is composed entirely by HWC.
1294ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
1304ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   window's swap interval in eglMakeCurrent, so they'll override the
1314ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   interval we set here.
1324ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
1334ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong        window->setSwapInterval(window, 0);
1344ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong
13547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mConfig = config;
1361f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1375e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mSurface = eglSurface;
1389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
1399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mFormat = format;
1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
1411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
142da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
143da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
145ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
1462c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ?
1472c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani                  HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
1485f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1498dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1508dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1518dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
16398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
16400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
1655e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang
1665e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#ifdef NUM_FRAMEBUFFER_SURFACE_BUFFERS
1675e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    surface->allocateBuffers();
1685e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#endif
169a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
170a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
171ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
172ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
173ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
174ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
175ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
176ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
177ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
17802d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
17902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
18002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
1819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
18202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
18302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall            hwc.freeDisplayId(mHwcDisplayId);
1849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
18502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
18602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
18702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
18802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
189ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
190ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
193ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
194ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
195ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
196ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
197ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
198ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
199ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
200ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
202ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const {
203ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFormat;
204ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
206ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
207ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
208ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
209ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
210ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2119e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
2129e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
2139e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
2149e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
2159e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
2169e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
2179e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
2180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
2230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
22499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    return mDisplaySurface->compositionComplete();
22574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
230875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe    if (kEGLAndroidSwapRectangle) {
23389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        if (mFlags & SWAP_RECTANGLE) {
23489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Region newDirty(dirty.intersect(bounds()));
23589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Rect b(newDirty.getBounds());
23689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            eglSetSwapRectangleANDROID(mDisplay, mSurface,
23789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe                    b.left, b.top, b.width(), b.height());
23889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        }
23901e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
240d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
241076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2447143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2457143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
246028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
247028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
2489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
2499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) {
2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t error = hwc.prepare(*this);
2519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != NO_ERROR) {
2529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return error;
2539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    DisplaySurface::CompositionType compositionType;
2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasClient = hwc.hasClientComposition(mHwcDisplayId);
2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId);
2589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hasClient && hasDevice) {
2599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_MIXED;
2609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasClient) {
2619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_GLES;
2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasDevice) {
2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // Nothing to do -- when turning the screen off we get a frame like
2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // this. Call it a HWC frame since we won't be doing any GLES work but
2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // will do a prepare/set cycle.
2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->prepareFrame(compositionType);
2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
27338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
27438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    DisplaySurface::CompositionType compositionType;
27538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
27638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
27738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    if (haveGles && haveHwc) {
27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_MIXED;
27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveGles) {
28038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_GLES;
28138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveHwc) {
28238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
28338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else {
28438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // Nothing to do -- when turning the screen off we get a frame like
28538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // this. Call it a HWC frame since we won't be doing any GLES work but
28638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // will do a prepare/set cycle.
28738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
28838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    }
28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    return mDisplaySurface->prepareFrame(compositionType);
29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall}
2919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
293da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
2949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
2959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwc.hasClientComposition(mHwcDisplayId)) {
2969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
29722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    // We need to call eglSwapBuffers() if:
29822a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (1) we don't have a hardware composer, or
29922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (2) we did GLES composition this frame, and either
30022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (a) we have framebuffer target support (not present on legacy
30122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //        devices, where HWComposer::commit() handles things); or
30222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (b) this is a virtual display
30399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (hwc.initCheck() != NO_ERROR ||
30499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            (hwc.hasGlesComposition(mHwcDisplayId) &&
30522a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden             (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
3069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
30799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
30899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
30999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
31099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
31199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
31299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
31399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
31499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
31599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
31699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
317da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
318da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
319da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
32052e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
32199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
32299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
32399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
32499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
32532341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
326da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
327da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
3299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const {
3309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mDisplaySurface->onFrameCommitted();
3319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
3329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
333da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
334da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
335851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall        mDisplaySurface->onFrameCommitted();
336da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
337da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
3389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
339da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
345875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
346da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
34752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
348875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    if (sur != mSurface) {
349875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
350da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
351f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
352f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall                eglSwapInterval(dpy, 0);
353da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
35452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
355931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
356da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
35752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
35852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
359875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
360875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
361875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
362c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
363c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h,
364c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        false, Transform::ROT_0);
365bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
366bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
3679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
3689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const {
3699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->getClientTargetAcquireFence();
3709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
3719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
3729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3741b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
37513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
3763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
37913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
3803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
383cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
384cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
385cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
386cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
387cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
388da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
389cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
390cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
391cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
392cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
393cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
394cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
3953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
3962c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) {
3972c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = mode;
398d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
399d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
4002c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode()  const {
4012c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return mPowerMode;
402d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
403d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
4042c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const {
4052c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return (mPowerMode != HWC_POWER_MODE_OFF);
406d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
407d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
408d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
4096c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) {
4106c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    mActiveConfig = mode;
4116c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
4126c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
4136c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig()  const {
4146c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    return mActiveConfig;
4156c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
4166c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
4176c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ----------------------------------------------------------------------------
4183b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
41928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
42028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
42128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
42228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
42328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
42428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
42528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
426c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
427c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
428c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
429c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
430c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
431c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
432c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
433c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
434c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
435c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
436c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
437c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
438c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
439c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
440c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
441c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
442c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
443c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
444c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
4450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
4461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
4471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
4481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
4491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
4503165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
4511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
4521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4533165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
4541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
4551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4563165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
4571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
4581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4593165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
4601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
4611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
4631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
4641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
4661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
46947e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) {
47047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    dirtyRegion.set(getBounds());
47147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
472f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine    if (mSurface != EGL_NO_SURFACE) {
473f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine        eglDestroySurface(mDisplay, mSurface);
474f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine        mSurface = EGL_NO_SURFACE;
475f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine    }
476f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine
47747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mDisplaySurface->resizeBuffers(newWidth, newHeight);
47847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
47947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    ANativeWindow* const window = mNativeWindow.get();
48047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL);
48147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    eglQuerySurface(mDisplay, mSurface, EGL_WIDTH,  &mDisplayWidth);
48247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight);
48347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
48447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayWidth != newWidth,
48547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new width to %d", newWidth);
48647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayHeight != newHeight,
48747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new height to %d", newHeight);
48847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine}
48947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
49000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
491f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
492f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
493f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
494da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
495f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
496f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
497da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
498f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
499f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
5001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
501f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
502f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
503f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
504f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
505f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
5066360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
507f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
508f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
509f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
510f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
511f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
512f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
513f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
514f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
515f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
516f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
517766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
5181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
519f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
520f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
521f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
522f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
523f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
524f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
525f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
526f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
527f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
528f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
529f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
530f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
531f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
532f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
533f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
534f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
535f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
536f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
537f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
538f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
539f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
540f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
541f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
542f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
543f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
544f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
545f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
546f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
547f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
548f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
549f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
550f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
5516c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
552f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
553f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
554f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
555f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
556f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
5571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
5581d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
55974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
5601d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
56174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
5621d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
56302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
564b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n"
565766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
5661d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
56702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
5681d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
5691d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
570b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        mIsSecure, mPowerMode, mActiveConfig,
5716c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine        mVisibleLayersSortedByZ.size(),
5721d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
5731d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
574766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
5751d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
5761d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
5771d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
5781d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
57999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
580f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    mDisplaySurface->dumpAsString(surfaceDump);
58199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
5821d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
583