DisplayDevice.cpp revision c701401f8cec2e5309f8b57e2b97baced5093274
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),
7392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
7401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
75da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian      mOrientation()
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
7783cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall    mNativeWindow = new Surface(producer, false);
78a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
79a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
80f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    // Make sure that composition can never be stalled by a virtual display
81f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    // consumer that isn't processing buffers fast enough. We have to do this
82f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    // in two places:
83f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    // * Here, in case the display is composed entirely by HWC.
84f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
85f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    //   window's swap interval in eglMakeCurrent, so they'll override the
86f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    //   interval we set here.
87f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall    if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
88f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall        window->setSwapInterval(window, 0);
89f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall
90a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
91a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
92b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
93385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
941f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
9719e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    if (config == EGL_NO_CONFIG) {
9819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall        config = RenderEngine::chooseEglConfig(display, format);
9919e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall    }
100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
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
112ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    mScreenAcquired = (mType >= DisplayDevice::DISPLAY_VIRTUAL);
1135f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1148dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1158dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1168dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1178dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1188dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1198dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1208dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
12898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
12900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
130a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
131a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
132ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
133ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
134ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
135ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
136ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
13902d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
14002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
14102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
14202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
14302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall            hwc.freeDisplayId(mHwcDisplayId);
14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
148ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const {
161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFormat;
162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
1689e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1709e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1719e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
176076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1790f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
18099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    return mDisplaySurface->compositionComplete();
18174faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
185875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    mFlinger->getRenderEngine().checkErrors();
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19001e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle
191df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
192b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
193b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
19601e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
197c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza#else
198c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza    (void) dirty; // Eliminate unused parameter warning
1995e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
200d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2047143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const {
2057143316af216fa92c31a60d4407b707637382da1Dan Stoza    return mDisplaySurface->beginFrame(mustRecompose);
206028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall}
207028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
20838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    DisplaySurface::CompositionType compositionType;
21038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
21138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    if (haveGles && haveHwc) {
21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_MIXED;
21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveGles) {
21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_GLES;
21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else if (haveHwc) {
21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    } else {
21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // Nothing to do -- when turning the screen off we get a frame like
22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // this. Call it a HWC frame since we won't be doing any GLES work but
22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // will do a prepare/set cycle.
22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        compositionType = DisplaySurface::COMPOSITION_HWC;
22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    }
22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    return mDisplaySurface->prepareFrame(compositionType);
22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall}
22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
22822a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    // We need to call eglSwapBuffers() if:
22922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (1) we don't have a hardware composer, or
23022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //  (2) we did GLES composition this frame, and either
23122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (a) we have framebuffer target support (not present on legacy
23222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //        devices, where HWComposer::commit() handles things); or
23322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden    //    (b) this is a virtual display
23499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (hwc.initCheck() != NO_ERROR ||
23599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            (hwc.hasGlesComposition(mHwcDisplayId) &&
23622a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden             (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
23799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
23899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
23999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
24099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
24499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
24599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
24699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
247da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
248da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
249da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
25052e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
25199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
25299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
25399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
25499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
25532341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
256da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
257da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
258da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
259da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
260851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall        mDisplaySurface->onFrameCommitted();
261da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
262da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
263da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2640f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
269875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
270da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
27152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
272875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    if (sur != mSurface) {
273875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
274da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
275f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
276f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall                eglSwapInterval(dpy, 0);
277da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
27852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
279931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian    setViewportAndProjection();
280da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
28152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
28252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
283875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const {
284875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t w = mDisplayWidth;
285875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian    size_t h = mDisplayHeight;
2863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mFlinger->getRenderEngine().setViewportAndProjection(w, h, w, h, false);
287bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
288bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
29113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
2923b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
293ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const sp<Layer>& layer(layers[i]);
297f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (layer->isSecure()) {
2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
3043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3053b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3070f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
311cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
312cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
313cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
314cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
315cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
316da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
317cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
318cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
321cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
322cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
324d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
325d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
326d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
327d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
330d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
331d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
334d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
335d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
336d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
338d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
339d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
340d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
341d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
34328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
34428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
34528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
34628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
34728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
34828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
34928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
350c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const {
351c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    uint32_t transform = 0;
352c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    switch (mOrientation) {
353c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientationDefault:
354c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_0;
355c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
356c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation90:
357c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_90;
358c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
359c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation180:
360c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_180;
361c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
362c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        case DisplayState::eOrientation270:
363c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            transform = Transform::ROT_270;
364c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian            break;
365c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
366c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return transform;
367c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
368c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
3690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3743165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3773165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3833165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
39300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
394f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
400da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
4031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
406f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
4096360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
420766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
4211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
451f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
4546c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian        mScissor = getBounds();
455f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
456f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
457f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
458f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
459f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
4601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4611d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
46274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const {
4631d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
46474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    result.appendFormat(
4651d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
46602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
467dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n"
468766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
4691d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
47002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
4711d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
4721d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
473dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(),
4741d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4751d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
476766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
4771d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
4781d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
4791d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
4801d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
48199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
48299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    mDisplaySurface->dump(surfaceDump);
48399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
4841d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
485