DisplayDevice.cpp revision 2c9b11f0291210c9b9513a1a0cce6afebd361b3b
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
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h"
351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
36875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h"
371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
38da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h"
390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
40c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
4113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h"
421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
43a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
45a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
520f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
54dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
55ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
5619e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        int format,
57dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
58dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
5999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
60db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
61a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
6292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
63ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall      mType(type), mHwcDisplayId(hwcId),
6427e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
6599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
6692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
6792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
6892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
6992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
7092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
71dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
7292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
7301e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mOrientation(),
752c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani      mPowerMode(HWC_POWER_MODE_OFF)
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
7783cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall    mNativeWindow = new Surface(producer, false);
78a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
79a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
80a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
81a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
82b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
83385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
841f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
85a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
8719e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    if (config == EGL_NO_CONFIG) {
8819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        config = RenderEngine::chooseEglConfig(display, format);
8919e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    }
90a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
944ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // Make sure that composition can never be stalled by a virtual display
954ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // consumer that isn't processing buffers fast enough. We have to do this
964ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // in two places:
974ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * Here, in case the display is composed entirely by HWC.
984ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
994ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   window's swap interval in eglMakeCurrent, so they'll override the
1004ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    //   interval we set here.
1014ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
1024ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong        window->setSwapInterval(window, 0);
1034ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong
1041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1051f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1071f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
108da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
109da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
111ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
1122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ?
1132c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani                  HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
1145f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1158dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1168dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1178dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1188dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1198dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1208dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1288dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
12998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
13000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
131a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
132a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
133ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
134ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
135ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
136ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
14002d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
14102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
14202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
14302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall            hwc.freeDisplayId(mHwcDisplayId);
14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const {
162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFormat;
163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
168ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1709e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1719e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1760f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
18199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    return mDisplaySurface->compositionComplete();
18274faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
186875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle
192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
193b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
194b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
19701e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
198c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza#else
199c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    (void) dirty; // Eliminate unused parameter warning
2005e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
201d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2057143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2067143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
207028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
208028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
21038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    DisplaySurface::CompositionType compositionType;
21138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    if (haveGles && haveHwc) {
21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_MIXED;
21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveGles) {
21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_GLES;
21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveHwc) {
21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else {
22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // Nothing to do -- when turning the screen off we get a frame like
22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // this. Call it a HWC frame since we won't be doing any GLES work but
22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // will do a prepare/set cycle.
22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    }
22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    return mDisplaySurface->prepareFrame(compositionType);
22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall}
22738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
22922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    // We need to call eglSwapBuffers() if:
23022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (1) we don't have a hardware composer, or
23122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (2) we did GLES composition this frame, and either
23222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (a) we have framebuffer target support (not present on legacy
23322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //        devices, where HWComposer::commit() handles things); or
23422a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (b) this is a virtual display
23599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (hwc.initCheck() != NO_ERROR ||
23699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            (hwc.hasGlesComposition(mHwcDisplayId) &&
23722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden             (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
23899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
23999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
24099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
24499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
24599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
24699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
24799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
248da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
249da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
25152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
25299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
25399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
25499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
25599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
25632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
257da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
258da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
259da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
260da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
261851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall        mDisplaySurface->onFrameCommitted();
262da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
263da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
264da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2650f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
270875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
271da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
27252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
273875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    if (sur != mSurface) {
274875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
275da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
276f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
277f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall                eglSwapInterval(dpy, 0);
278da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
27952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
280931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
281da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
28252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
28352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
284875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
285875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
286875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
287c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    Rect sourceCrop(0, 0, w, h);
288c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, false);
289bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
290bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
295ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const sp<Layer>& layer(layers[i]);
299f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (layer->isSecure()) {
3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3033b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
3063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3113b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3123b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
313cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
314cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
315cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
316cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
317cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
318da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
321cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
322cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
323cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
324cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
3262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) {
3272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    mPowerMode = mode;
328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
3302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode()  const {
3312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return mPowerMode;
332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
3342c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const {
3352c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    return (mPowerMode != HWC_POWER_MODE_OFF);
336d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
338d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3393b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
34028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
34128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
34228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
34328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
34428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
34528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
34628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
347c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
348c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
349c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
350c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
351c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
352c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
353c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
354c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
355c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
356c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
357c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
358c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
359c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
360c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
361c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
362c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
363c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
364c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
365c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
3660f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3713165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3743165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3773165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
39000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
394da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
4066360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
417766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
4181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
4516c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
454f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
455f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
456f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
4571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4581d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
45974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
4601d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
46174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
4621d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
46302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
4642c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        "flips=%u, isSecure=%d, secureVis=%d, powerMode=%d, numLayers=%zu\n"
465766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
4661d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
46702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
4681d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
4691d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
4702c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        mIsSecure, mSecureLayerVisible, mPowerMode, mVisibleLayersSortedByZ.size(),
4711d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4721d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
473766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
4741d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
4751d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
4761d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
4771d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
47899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
47999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    mDisplaySurface->dump(surfaceDump);
48099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
4811d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
482