DisplayDevice.cpp revision 01e29054e672301e4adbbca15b3562a59a20f267
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
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h"
391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
41da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h"
420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
44c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
45921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h"
461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
47a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
49a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
59e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("GL error 0x%04x", int(error));
60cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
64a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
72dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        DisplayType type,
73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
74dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<ANativeWindow>& nativeWindow,
761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<FramebufferSurface>& framebufferSurface,
77a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
7892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
793ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian      mType(type), mHwcDisplayId(-1),
8027e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
811a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mNativeWindow(nativeWindow),
821a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mFramebufferSurface(framebufferSurface),
8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
8892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
89dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
9192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
9201e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
93da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian      mOrientation()
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
980f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
10492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
10592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
10692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1116163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1126163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
120a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1210f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
122a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1246163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1250f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1296163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1306163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
131b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
134b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
135385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1361f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
137a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
139a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
147da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
148da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
1505f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian    // external displays are always considered enabled
1513ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    mScreenAcquired = (mType >= DisplayDevice::NUM_DISPLAY_TYPES);
1523ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian
1533ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    // get an h/w composer ID
1543ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType);
1555f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1668dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1678dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1688dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1698dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
17098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
17100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
172a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
173a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1769e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1779e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1789e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1799e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1809e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1810f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
182076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1850f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
188a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
189a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
19074faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1920f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19901e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle
200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
201b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
202b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
204df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
20501e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
2065e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
207d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
21252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian    EGLBoolean success = EGL_TRUE;
213da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() != NO_ERROR) {
214da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        // no HWC, we call eglSwapBuffers()
21552e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian        success = eglSwapBuffers(mDisplay, mSurface);
216da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    } else {
217d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // We have a valid HWC, but not all displays can use it, in particular
218d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // the virtual displays are on their own.
219d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // TODO: HWC 1.2 will allow virtual displays
220d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        if (mType >= DisplayDevice::DISPLAY_VIRTUAL) {
221d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // always call eglSwapBuffers() for virtual displays
22252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian            success = eglSwapBuffers(mDisplay, mSurface);
223d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        } else if (hwc.supportsFramebufferTarget()) {
224d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // as of hwc 1.1 we always call eglSwapBuffers if we have some
225d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // GLES layers
226d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            if (hwc.hasGlesComposition(mType)) {
22752e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian                success = eglSwapBuffers(mDisplay, mSurface);
228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
229d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        } else {
230d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // HWC doesn't have the framebuffer target, we don't call
231d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // eglSwapBuffers(), since this is handled by HWComposer::commit().
232da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
233da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
23452e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
23532341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    if (!success) {
23632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian        EGLint error = eglGetError();
23732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian        if (error == EGL_CONTEXT_LOST ||
23832341381c9493d7953e40f7f79653cfc52868863Mathias Agopian                mType == DisplayDevice::DISPLAY_PRIMARY) {
23932341381c9493d7953e40f7f79653cfc52868863Mathias Agopian            LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
240b8fc00bfb41a61aeda186eec8f14522ff32f23f8Mathias Agopian                    mDisplay, mSurface, error);
24132341381c9493d7953e40f7f79653cfc52868863Mathias Agopian        }
24232341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
243da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
244da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
245da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
246da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
247da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        if (hwc.supportsFramebufferTarget()) {
248da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            int fd = hwc.getAndResetReleaseFenceFd(mType);
249da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            mFramebufferSurface->setReleaseFenceFd(fd);
250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
251da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
252da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
253da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2540f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
259da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy,
260da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const sp<const DisplayDevice>& hw, EGLContext ctx) {
261da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
26252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
2634297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
264da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
265da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
266bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian            setViewportAndProjection(hw);
267da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
26852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
269da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
27052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
27152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
272bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopianvoid DisplayDevice::setViewportAndProjection(const sp<const DisplayDevice>& hw) {
273bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    GLsizei w = hw->mDisplayWidth;
274bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    GLsizei h = hw->mDisplayHeight;
275bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glViewport(0, 0, w, h);
276bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glMatrixMode(GL_PROJECTION);
277bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glLoadIdentity();
278bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    // put the origin in the left-bottom corner
279bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h
280135e5899f70a67e62baaf6dbec7ba2ce611ca16aMathias Agopian    glMatrixMode(GL_MODELVIEW);
281bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
282bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2850f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
2863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
287ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2883b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
2913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2923b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2963ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianconst Vector< sp<LayerBase> >& DisplayDevice::getVisibleLayersSortedByZ() const {
2973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3000f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3033b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
304cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
305cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
306cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
307cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
308cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
309da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
310cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
311cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
312cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
313cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
314cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
315cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
3163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
317d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
318d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
319d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
320d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
321d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
322d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
323d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
324d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
325d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
326d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
327d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
330d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
331d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
334d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
33628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
33728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
33828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
33928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
34028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
34128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
34228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
3430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3483165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3513165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3573165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
36700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
36800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& viewport, const Rect& frame) {
369da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mOrientation = orientation;
37000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    mViewport = viewport;
37100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    mFrame = frame;
372da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    updateGeometryTransform();
373da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian}
374da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
375da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid DisplayDevice::updateGeometryTransform() {
37698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
37798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3786e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown    Transform TL, TP, R, S;
379da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    if (DisplayDevice::orientationToTransfrom(
380da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            mOrientation, w, h, &R) == NO_ERROR) {
381da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        dirtyRegion.set(bounds());
382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
383da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        Rect viewport(mViewport);
384da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        Rect frame(mFrame);
385da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
386da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (!frame.isValid()) {
387da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // the destination frame can be invalid if it has never been set,
388da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // in that case we assume the whole display frame.
389da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            frame = Rect(w, h);
390da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
391da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
392da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (viewport.isEmpty()) {
393da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // viewport can be invalid if it has never been set, in that case
394da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // we assume the whole display size.
395da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // it's also invalid to have an empty viewport, so we handle that
396da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // case in the same way.
397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            viewport = Rect(w, h);
398da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            if (R.getOrientation() & Transform::ROT_90) {
399da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                // viewport is always specified in the logical orientation
400da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                // of the display (ie: post-rotation).
401da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                swap(viewport.right, viewport.bottom);
402da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            }
403da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
4041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
405da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_width  = viewport.width();
406da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_height = viewport.height();
407da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_width  = frame.width();
408da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_height = frame.height();
4096360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall        if (src_width != dst_width || src_height != dst_height) {
410da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            float sx = dst_width  / src_width;
411da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            float sy = dst_height / src_height;
412da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            S.set(sx, 0, 0, sy);
413da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
4146360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
415da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_x = viewport.left;
416da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_y = viewport.top;
417da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_x = frame.left;
418da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_y = frame.top;
4196e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        TL.set(-src_x, -src_y);
4206e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        TP.set(dst_x, dst_y);
4216e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown
4226e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // The viewport and frame are both in the logical orientation.
4236e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // Apply the logical translation, scale to physical size, apply the
4246e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // physical translation and finally rotate to the physical orientation.
4256e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        mGlobalTransform = R * TP * S * TL;
426eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian
427eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const uint8_t type = mGlobalTransform.getType();
428eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
429eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian                (type >= Transform::SCALE));
430766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian
431766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor = mGlobalTransform.transform(mViewport);
432766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        if (mScissor.isEmpty()) {
433766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian            mScissor.set(getBounds());
434766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
4351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4381d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const {
4391d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
4401d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    snprintf(buffer, SIZE,
4411d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
4421d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "   type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
443dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n"
444766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
4451d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
446d56eff2f49e64bb71863ffb866af8c3f686b96e9Mathias Agopian        mDisplayName.string(), mType,
4471d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
4481d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
449dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(),
4501d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4511d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
452766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
4531d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
4541d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
4551d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
4561d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4571d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    result.append(buffer);
4581d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4591d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    String8 fbtargetDump;
4601d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    if (mFramebufferSurface != NULL) {
4611d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFramebufferSurface->dump(fbtargetDump);
4621d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        result.append(fbtargetDump);
4631d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    }
4641d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
465