[go: nahoru, domu]

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
71021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0;
72021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
730f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
76ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
7819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        int format,
799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
80dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
81dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
8299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
83db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
84a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
85b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall    : lastCompositionHadVisibleLayers(false),
86b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall      mFlinger(flinger),
879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mType(type),
889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mHwcDisplayId(hwcId),
8927e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
9099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
9192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
9292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayWidth(),
949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayHeight(),
959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mFormat(),
979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
100dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
10101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
1022c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
1036c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mPowerMode(HWC_POWER_MODE_OFF),
1046c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mActiveConfig(0)
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1065e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    Surface* surface;
1075e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mNativeWindow = surface = new Surface(producer, false);
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
112b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
113385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1145e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    EGLSurface eglSurface;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
11619e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    if (config == EGL_NO_CONFIG) {
1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888);
1199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
12019e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        config = RenderEngine::chooseEglConfig(display, format);
1219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
12219e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    }
1235e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglSurface = eglCreateWindowSurface(display, config, window, NULL);
1245e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_WIDTH,  &mDisplayWidth);
1255e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1274ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // Make sure that composition can never be stalled by a virtual display
1284ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // consumer that isn't processing buffers fast enough. We have to do this
1294ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // in two places:
1304ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * Here, in case the display is composed entirely by HWC.
1314ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
1324ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   window's swap interval in eglMakeCurrent, so they'll override the
1334ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   interval we set here.
1344ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
1354ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong        window->setSwapInterval(window, 0);
1364ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong
13747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mConfig = config;
1381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1395e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mSurface = eglSurface;
1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
1419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mFormat = format;
1429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
1431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
144da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
145da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
147ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
1482c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ?
1492c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani                  HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
1505f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1518dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
16598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
1675e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang
1685e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#ifdef NUM_FRAMEBUFFER_SURFACE_BUFFERS
1695e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    surface->allocateBuffers();
1705e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#endif
171a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
172a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
173ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
174ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
175ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
176ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
177ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
178ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
179ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
18002d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
18102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
18202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
1839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
18402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
18502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall            hwc.freeDisplayId(mHwcDisplayId);
1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
18702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
18802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
18902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
19002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
193ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
194ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
195ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
196ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
197ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
198ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
199ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
200ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
201ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
202ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
204ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const {
205ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFormat;
206ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
208ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
209ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
210ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
211ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
212ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
2139e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
2149e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
2159e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
2169e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
2179e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
2189e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
2199e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
2200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2
2250f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
22699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    return mDisplaySurface->compositionComplete();
22774faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
232875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe    if (kEGLAndroidSwapRectangle) {
23589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        if (mFlags & SWAP_RECTANGLE) {
23689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Region newDirty(dirty.intersect(bounds()));
23789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            const Rect b(newDirty.getBounds());
23889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe            eglSetSwapRectangleANDROID(mDisplay, mSurface,
23989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe                    b.left, b.top, b.width(), b.height());
24089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe        }
24101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
242d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2467143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2477143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
248028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
249028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
2519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) {
2529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t error = hwc.prepare(*this);
2539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != NO_ERROR) {
2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return error;
2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    DisplaySurface::CompositionType compositionType;
2589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasClient = hwc.hasClientComposition(mHwcDisplayId);
2599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId);
2609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hasClient && hasDevice) {
2619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_MIXED;
2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasClient) {
2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_GLES;
2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasDevice) {
2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // Nothing to do -- when turning the screen off we get a frame like
2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // this. Call it a HWC frame since we won't be doing any GLES work but
2699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // will do a prepare/set cycle.
2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->prepareFrame(compositionType);
2739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
27538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
27638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    DisplaySurface::CompositionType compositionType;
27738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    if (haveGles && haveHwc) {
28038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_MIXED;
28138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveGles) {
28238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_GLES;
28338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveHwc) {
28438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
28538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else {
28638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // Nothing to do -- when turning the screen off we get a frame like
28738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // this. Call it a HWC frame since we won't be doing any GLES work but
28838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // will do a prepare/set cycle.
28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    }
29138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    return mDisplaySurface->prepareFrame(compositionType);
29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall}
2939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
29438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
295da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
2969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
2979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hwc.hasClientComposition(mHwcDisplayId)) {
2989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
29922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    // We need to call eglSwapBuffers() if:
30022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (1) we don't have a hardware composer, or
30122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (2) we did GLES composition this frame, and either
30222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (a) we have framebuffer target support (not present on legacy
30322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //        devices, where HWComposer::commit() handles things); or
30422a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (b) this is a virtual display
30599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (hwc.initCheck() != NO_ERROR ||
30699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            (hwc.hasGlesComposition(mHwcDisplayId) &&
30722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden             (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
3089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
30999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
31099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
31199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
31299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
31399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
31499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
31599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
31699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
31799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
31899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
319da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
320da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
321da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
32252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
32399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
32499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
32599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
32699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
32732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
328da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
329da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
3319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const {
3329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mDisplaySurface->onFrameCommitted();
3339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
3349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
335da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
336da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
337851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall        mDisplaySurface->onFrameCommitted();
338da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
339da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
3409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
341da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
3420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
348da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
34952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
350875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    if (sur != mSurface) {
351875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
352da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
353f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
354f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall                eglSwapInterval(dpy, 0);
355da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
35652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
357931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
358da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
35952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
36052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
361875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
362875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
363875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
364c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
365c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h,
366c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        false, Transform::ROT_0);
367bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
368bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
3699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const {
3709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->getClientTargetAcquireFence();
3719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
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;
555021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    if (mType == DisplayType::DISPLAY_PRIMARY) {
556021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t transform = 0;
557021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        switch (mOrientation) {
558021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientationDefault:
559021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_0;
560021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
561021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation90:
562021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_90;
563021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
564021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation180:
565021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_180;
566021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
567021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation270:
568021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_270;
569021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
570021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        }
571021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        sPrimaryDisplayOrientation = transform;
572021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    }
573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
5751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
5761d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
577021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() {
578021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    return sPrimaryDisplayOrientation;
579021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos}
580021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
58174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
5821d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
58374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
5841d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
58502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
586b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n"
587766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
5881d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
58902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
5901d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
5911d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
592b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos        mIsSecure, mPowerMode, mActiveConfig,
5936c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine        mVisibleLayersSortedByZ.size(),
5941d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
5951d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
596766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
5971d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
5981d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
5991d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
6001d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
60199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
602f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    mDisplaySurface->dumpAsString(surfaceDump);
60399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
6041d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
605