DisplayDevice.cpp revision 9e2463e71796964cfaa06bf09a880875ac3537bc
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
301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/SurfaceTextureClient.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,
723ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian        DisplayType type, const wp<IBinder>& displayToken,
731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<ANativeWindow>& nativeWindow,
741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<FramebufferSurface>& framebufferSurface,
75a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
773ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian      mType(type), mHwcDisplayId(-1),
781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mNativeWindow(nativeWindow),
791a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mFramebufferSurface(framebufferSurface),
8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
88da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian      mLayerStack(0),
89da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian      mOrientation()
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
91a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
940f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
9592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1050f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1086163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1206163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1210f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1256163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1266163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
127b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
130b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
131385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1321f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
143da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
144da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
1465f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian    // external displays are always considered enabled
1473ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    mScreenAcquired = (mType >= DisplayDevice::NUM_DISPLAY_TYPES);
1483ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian
1493ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    // get an h/w composer ID
1503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian    mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType);
1515f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
16698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
16700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
168a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
169a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1709e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1719e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1769e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1770f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
178076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1810f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
182a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
183a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
184a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
185a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
18674faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1880f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1955e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
197b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
198b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2025e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
203d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
207da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
208da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() != NO_ERROR) {
209da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        // no HWC, we call eglSwapBuffers()
210da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        eglSwapBuffers(mDisplay, mSurface);
211da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    } else {
212d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // We have a valid HWC, but not all displays can use it, in particular
213d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // the virtual displays are on their own.
214d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        // TODO: HWC 1.2 will allow virtual displays
215d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        if (mType >= DisplayDevice::DISPLAY_VIRTUAL) {
216d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // always call eglSwapBuffers() for virtual displays
217d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            eglSwapBuffers(mDisplay, mSurface);
218d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        } else if (hwc.supportsFramebufferTarget()) {
219d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // as of hwc 1.1 we always call eglSwapBuffers if we have some
220d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // GLES layers
221d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            if (hwc.hasGlesComposition(mType)) {
222da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian                eglSwapBuffers(mDisplay, mSurface);
223da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
224d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian        } else {
225d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // HWC doesn't have the framebuffer target, we don't call
226d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian            // eglSwapBuffers(), since this is handled by HWComposer::commit().
227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
229da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
230da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
231da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
232da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
233da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        if (hwc.supportsFramebufferTarget()) {
234da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            int fd = hwc.getAndResetReleaseFenceFd(mType);
235da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            mFramebufferSurface->setReleaseFenceFd(fd);
236da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
237da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
238da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
239da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
245da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy,
246da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const sp<const DisplayDevice>& hw, EGLContext ctx) {
247da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
24852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
2494297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
250da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
251da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
252da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            GLsizei w = hw->mDisplayWidth;
253da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            GLsizei h = hw->mDisplayHeight;
254da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            glViewport(0, 0, w, h);
255da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            glMatrixMode(GL_PROJECTION);
256da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            glLoadIdentity();
257da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // put the origin in the left-bottom corner
258da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h
259da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
26052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
261da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
26252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
26352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
2641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2660f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
2673b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
268ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2693b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2703b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2713b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
2723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2733b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2743b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2753b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2773ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianconst Vector< sp<LayerBase> >& DisplayDevice::getVisibleLayersSortedByZ() const {
2783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2810f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
2823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
285cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
286cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
287cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
288cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
289cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
290da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
291cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
292cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
293cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
294cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
295cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
296cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
2973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
298d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
299d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
300d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
301d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
315d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
31728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
31828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
31928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
32028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
32128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
32228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
32328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
3240f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3293165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3323165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3353165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3383165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
34800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
34900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& viewport, const Rect& frame) {
350da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mOrientation = orientation;
35100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    mViewport = viewport;
35200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    mFrame = frame;
353da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    updateGeometryTransform();
354da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian}
355da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
356da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid DisplayDevice::updateGeometryTransform() {
35798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
35898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3596e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown    Transform TL, TP, R, S;
360da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    if (DisplayDevice::orientationToTransfrom(
361da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            mOrientation, w, h, &R) == NO_ERROR) {
362da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        dirtyRegion.set(bounds());
363da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
364da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        Rect viewport(mViewport);
365da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        Rect frame(mFrame);
366da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
367da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (!frame.isValid()) {
368da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // the destination frame can be invalid if it has never been set,
369da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // in that case we assume the whole display frame.
370da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            frame = Rect(w, h);
371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
372da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
373da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (viewport.isEmpty()) {
374da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // viewport can be invalid if it has never been set, in that case
375da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // we assume the whole display size.
376da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // it's also invalid to have an empty viewport, so we handle that
377da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            // case in the same way.
378da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            viewport = Rect(w, h);
379da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            if (R.getOrientation() & Transform::ROT_90) {
380da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                // viewport is always specified in the logical orientation
381da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                // of the display (ie: post-rotation).
382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian                swap(viewport.right, viewport.bottom);
383da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            }
384da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
386da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_width  = viewport.width();
387da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_height = viewport.height();
388da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_width  = frame.width();
389da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_height = frame.height();
3906360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall        if (src_width != dst_width || src_height != dst_height) {
391da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            float sx = dst_width  / src_width;
392da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            float sy = dst_height / src_height;
393da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian            S.set(sx, 0, 0, sy);
394da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
3956360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
396da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_x = viewport.left;
397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float src_y = viewport.top;
398da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_x = frame.left;
399da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        float dst_y = frame.top;
4006e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        TL.set(-src_x, -src_y);
4016e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        TP.set(dst_x, dst_y);
4026e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown
4036e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // The viewport and frame are both in the logical orientation.
4046e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // Apply the logical translation, scale to physical size, apply the
4056e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        // physical translation and finally rotate to the physical orientation.
4066e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown        mGlobalTransform = R * TP * S * TL;
407eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian
408eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        const uint8_t type = mGlobalTransform.getType();
409eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian        mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
410eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian                (type >= Transform::SCALE));
4111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4131d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4141d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const {
4151d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
4161d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    snprintf(buffer, SIZE,
4171d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
4181d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "   type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
4191d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "flips=%u, secure=%d, acquired=%d, numLayers=%u\n"
4201d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], "
4211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
422d56eff2f49e64bb71863ffb866af8c3f686b96e9Mathias Agopian        mDisplayName.string(), mType,
4231d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
4241d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
4251d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(),
4261d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4271d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
4281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
4291d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
4301d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
4311d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4321d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    result.append(buffer);
4331d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4341d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    String8 fbtargetDump;
4351d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    if (mFramebufferSurface != NULL) {
4361d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFramebufferSurface->dump(fbtargetDump);
4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        result.append(fbtargetDump);
4381d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    }
4391d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
440