DisplayDevice.cpp revision 144e116f45f196396f0d59d5fc09766ab618f885
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
31152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter#include <ui/DebugUtils.h>
32c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h"
401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h"
42875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
44da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h"
450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
46c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
4713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h"
481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
49720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
50720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <configstore/Utils.h>
51720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee
52a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
54a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore
57720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore;
58720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0;
59720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee
601971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglardstatic bool useTripleFramebuffer = getInt64< ISurfaceFlingerConfigs,
6148eb5659c312e63c3876a0d95480f71f9184bfdeFabien Sanglard        &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2) >= 3;
62720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
68021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0;
69021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
705d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off
710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
74ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
76dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
7799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
78db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
795c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu        bool supportWideColor,
805c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu        bool supportHdr)
81b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall    : lastCompositionHadVisibleLayers(false),
82b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall      mFlinger(flinger),
839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mType(type),
849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mHwcDisplayId(hwcId),
8527e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
8699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
87144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique      mSurface{flinger->getRenderEngine().createSurface()},
889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayWidth(),
899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza      mDisplayHeight(),
9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
91dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
9201e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
932c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
946c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine      mPowerMode(HWC_POWER_MODE_OFF),
954f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter      mActiveConfig(0)
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter    // clang-format on
985e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    Surface* surface;
995e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang    mNativeWindow = surface = new Surface(producer, false);
100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
102901a86e1edd983968dda2218f87a35064114c08dNaseer Ahmed    mActiveColorMode = HAL_COLOR_MODE_NATIVE;
1034f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter    mDisplayHasWideColor = supportWideColor;
1045c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    mDisplayHasHdr = supportHdr;
1055c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu
106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
108b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
109144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setCritical(mType == DisplayDevice::DISPLAY_PRIMARY);
110144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setAsync(mType >= DisplayDevice::DISPLAY_VIRTUAL);
111144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setNativeWindow(window);
112144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayWidth = mSurface->queryWidth();
113144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayHeight = mSurface->queryHeight();
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1154ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // Make sure that composition can never be stalled by a virtual display
1164ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // consumer that isn't processing buffers fast enough. We have to do this
1174ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // in two places:
1184ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * Here, in case the display is composed entirely by HWC.
1194ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
1204ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   window's swap interval in eglMakeCurrent, so they'll override the
1214ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   interval we set here.
1224ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
1234ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong        window->setSwapInterval(window, 0);
1244ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong
1251f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
126da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
127da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1281f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
129ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
1302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ?
1312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani                  HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
1325f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
13398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
13400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
1355e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang
136720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee    if (useTripleFramebuffer) {
137720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee        surface->allocateBuffers();
138720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee    }
139a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
140a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
14902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
15002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
152566a3b4a1d1a2a6d38257113700eea92aa44ea2bPeiyong Lin    return mFlinger != nullptr;
153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
1639e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1649e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1659e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1669e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1679e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1689e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
171076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
174b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
176875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1807143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
1817143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
182028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
183028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
1849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) {
1859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t error = hwc.prepare(*this);
1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (error != NO_ERROR) {
1879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return error;
1889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
1899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
1909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    DisplaySurface::CompositionType compositionType;
1919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasClient = hwc.hasClientComposition(mHwcDisplayId);
1929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId);
1939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (hasClient && hasDevice) {
1949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_MIXED;
1959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasClient) {
1969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_GLES;
1979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else if (hasDevice) {
1989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
1999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    } else {
2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // Nothing to do -- when turning the screen off we get a frame like
2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // this. Call it a HWC frame since we won't be doing any GLES work but
2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        // will do a prepare/set cycle.
2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        compositionType = DisplaySurface::COMPOSITION_HWC;
2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->prepareFrame(compositionType);
2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
208da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
20988a905b9aff600150916a644d5bfd01a31c0ba82Madhuri Athota    if (hwc.hasClientComposition(mHwcDisplayId) || hwc.hasFlipClientTargetRequest(mHwcDisplayId)) {
210144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique        mSurface->swapBuffers();
211da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
21252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
21399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
21499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
21599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
21699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
21732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
218da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
219da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const {
2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mDisplaySurface->onFrameCommitted();
2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
223da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
224f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wubool DisplayDevice::makeCurrent() const {
225144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    bool success = mFlinger->getRenderEngine().setCurrentSurface(*mSurface);
226931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
227f846a35a68f14b0eca45e3cd7c6d3ca88a57fe52Chia-I Wu    return success;
22852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
22952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
230875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
231875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
232875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
233c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
234c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h,
235c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        false, Transform::ROT_0);
236bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
237bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const {
2399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    return mDisplaySurface->getClientTargetAcquireFence();
2409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
24413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
2453b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
2463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2473b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
24813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
2493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2503b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
25283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) {
25383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    mLayersNeedingFences = layers;
25483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu}
25583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu
25683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const {
25783806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu    return mLayersNeedingFences;
25883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu}
25983806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu
260cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
261cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
262cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
263cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
264cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
265da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
266cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
267cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
268cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
269cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
270cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
271cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
2723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
2732c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) {
2742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = mode;
275d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
276d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
2772c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode()  const {
2782c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return mPowerMode;
279d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
280d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
2812c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const {
2822c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return (mPowerMode != HWC_POWER_MODE_OFF);
283d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
284d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
285d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
2866c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) {
2876c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    mActiveConfig = mode;
2886c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
2896c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
2906c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig()  const {
2916c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine    return mActiveConfig;
2926c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine}
2936c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine
2946c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ----------------------------------------------------------------------------
29528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) {
29628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    mActiveColorMode = mode;
29728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
29828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
29928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const {
30028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    return mActiveColorMode;
30128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright}
30279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter
30379d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchtervoid DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) {
30479d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter    ANativeWindow* const window = mNativeWindow.get();
30579d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter    native_window_set_buffers_data_space(window, dataspace);
30679d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter}
30728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
30828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ----------------------------------------------------------------------------
3093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
31028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
31128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
31228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
31328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
31428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
31528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
31628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
317c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
318c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
319c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
320c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
321c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
322c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
323c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
324c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
325c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
326c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
327c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
328c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
329c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
330c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
331c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
332c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
333c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
334c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
335c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
3360f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3413165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3443165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3473165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3503165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
36047e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) {
36147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    dirtyRegion.set(getBounds());
36247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
363144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setNativeWindow(nullptr);
364f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine
36547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    mDisplaySurface->resizeBuffers(newWidth, newHeight);
36647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
36747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    ANativeWindow* const window = mNativeWindow.get();
368144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mSurface->setNativeWindow(window);
369144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayWidth = mSurface->queryWidth();
370144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    mDisplayHeight = mSurface->queryHeight();
37147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
37247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayWidth != newWidth,
37347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new width to %d", newWidth);
37447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    LOG_FATAL_IF(mDisplayHeight != newHeight,
37547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine                "Unable to set new height to %d", newHeight);
37647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine}
37747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
37800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
379f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
380f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
381f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
383f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
384f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
385da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
386f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
387f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
3946360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
405766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
4061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
4396c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
443021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    if (mType == DisplayType::DISPLAY_PRIMARY) {
444021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        uint32_t transform = 0;
445021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        switch (mOrientation) {
446021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientationDefault:
447021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_0;
448021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
449021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation90:
450021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_90;
451021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
452021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation180:
453021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_180;
454021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
455021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos            case DisplayState::eOrientation270:
456021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                transform = Transform::ROT_270;
457021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos                break;
458021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        }
459021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos        sPrimaryDisplayOrientation = transform;
460021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    }
461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
462f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
4631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4641d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
465021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() {
466021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos    return sPrimaryDisplayOrientation;
467021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos}
468021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos
46974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
4701d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
471152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    ANativeWindow* const window = mNativeWindow.get();
4720ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string());
4730ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p "
4740ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "(%d:%d:%d:%d), orient=%2d (type=%08x), "
4750ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n",
476152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter                        mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window,
477144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        mSurface->queryRedSize(), mSurface->queryGreenSize(),
478144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        mSurface->queryBlueSize(), mSurface->queryAlphaSize(), mOrientation,
479144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique                        tr.getType(), getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig,
4800ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mVisibleLayersSortedByZ.size());
4810ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter    result.appendFormat("   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
4820ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
4830ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4840ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left,
4850ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0],
4860ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter                        tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]);
487152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    auto const surface = static_cast<Surface*>(window);
488152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    android_dataspace dataspace = surface->getBuffersDataSpace();
489152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter    result.appendFormat("   dataspace: %s (%d)\n", dataspaceDetails(dataspace).c_str(), dataspace);
4901d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
49199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
492f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    mDisplaySurface->dumpAsString(surfaceDump);
49399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
4941d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
495ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
496ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1);
497ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel
498ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure)
499ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    : type(type),
500ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      layerStack(DisplayDevice::NO_LAYER_STACK),
501ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      orientation(0),
502ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      width(0),
503ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      height(0),
504ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel      isSecure(isSecure)
505ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{
506ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    viewport.makeInvalid();
507ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel    frame.makeInvalid();
508ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel}
509