DisplayDevice.cpp revision 02d86567d95b99e1142941ed7ec23a4465822813
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
3899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.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"
4513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.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,
73ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        int32_t hwcId,
74dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool isSecure,
75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        const wp<IBinder>& displayToken,
7699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        const sp<DisplaySurface>& displaySurface,
77a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
7892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
79ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall      mType(type), mHwcDisplayId(hwcId),
8027e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang      mDisplayToken(displayToken),
8199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall      mDisplaySurface(displaySurface),
8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
88dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis      mIsSecure(isSecure),
8992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
9101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall      mLayerStack(NO_LAYER_STACK),
92da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian      mOrientation()
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
9499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    mNativeWindow = new Surface(mDisplaySurface->getIGraphicBufferProducer());
95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
96a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
976163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
986163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
99b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
102b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
103385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1111f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1121f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1141f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
115da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mViewport.makeInvalid();
116da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    mFrame.makeInvalid();
1171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
118ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    // virtual displays are always considered enabled
119ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    mScreenAcquired = (mType >= DisplayDevice::DISPLAY_VIRTUAL);
1205f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // Name the display.  The name will be replaced shortly if the display
1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    // was created with createDisplay().
1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    switch (mType) {
1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_PRIMARY:
1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Built-in Screen";
1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        case DISPLAY_EXTERNAL:
1288dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "HDMI Screen";
1298dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1308dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        default:
1318dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            mDisplayName = "Virtual Screen";    // e.g. Overlay #n
1328dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            break;
1338dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden    }
1348dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden
13598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
13600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
137a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
138a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() {
140ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    if (mSurface != EGL_NO_SURFACE) {
141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        eglDestroySurface(mDisplay, mSurface);
142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall        mSurface = EGL_NO_SURFACE;
143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    }
144ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
145ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) {
14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    if (mHwcDisplayId >= 0) {
14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        hwc.disconnectDisplay(mHwcDisplayId);
14902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        if (mHwcDisplayId >= DISPLAY_VIRTUAL)
15002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall            hwc.freeDisplayId(mHwcDisplayId);
15102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mHwcDisplayId = -1;
15202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall    }
15302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall}
15402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall
155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const {
156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFlinger != NULL;
157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const {
160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayWidth;
161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const {
164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mDisplayHeight;
165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const {
168ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mFormat;
169ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
170ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
171ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const {
172ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    return mSurface;
173ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall}
174ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall
1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) {
1769e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    if (!displayName.isEmpty()) {
1779e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        // never override the name with an empty name
1789e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian        mDisplayName = displayName;
1799e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian    }
1809e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian}
1819e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian
1820f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
183076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1860f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
18799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    return mDisplaySurface->compositionComplete();
18874faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1900f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19701e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle
198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
199b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
200b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
20301e29054e672301e4adbbca15b3562a59a20f267Jesse Hall    }
2045e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
205d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
209da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const {
21099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    // We need to call eglSwapBuffers() unless:
21199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    // (a) there was no GLES composition this frame, or
21299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    // (b) we're using a legacy HWC with no framebuffer target support (in
21399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    //     which case HWComposer::commit() handles things).
21499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (hwc.initCheck() != NO_ERROR ||
21599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            (hwc.hasGlesComposition(mHwcDisplayId) &&
21699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall             hwc.supportsFramebufferTarget())) {
21799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
21899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        if (!success) {
21999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            EGLint error = eglGetError();
22099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            if (error == EGL_CONTEXT_LOST ||
22199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                    mType == DisplayDevice::DISPLAY_PRIMARY) {
22299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x",
22399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
22499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            } else {
22599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x",
22699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                        mDisplay, mSurface, error);
227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian            }
228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian        }
229da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
23052e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian
23199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    status_t result = mDisplaySurface->advanceFrame();
23299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    if (result != NO_ERROR) {
23399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall        ALOGE("[%s] failed pushing new frame to HWC: %d",
23499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                mDisplayName.string(), result);
23532341381c9493d7953e40f7f79653cfc52868863Mathias Agopian    }
236da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
237da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
238da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
239da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    if (hwc.initCheck() == NO_ERROR) {
240851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall        mDisplaySurface->onFrameCommitted();
241da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    }
242da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian}
243da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
2440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
249da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy,
250da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const sp<const DisplayDevice>& hw, EGLContext ctx) {
251da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    EGLBoolean result = EGL_TRUE;
25252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
2534297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
254da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
255da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        if (result == EGL_TRUE) {
256bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian            setViewportAndProjection(hw);
257da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        }
25852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
259da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian    return result;
26052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
26152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
262bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopianvoid DisplayDevice::setViewportAndProjection(const sp<const DisplayDevice>& hw) {
263bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    GLsizei w = hw->mDisplayWidth;
264bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    GLsizei h = hw->mDisplayHeight;
265bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glViewport(0, 0, w, h);
266bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glMatrixMode(GL_PROJECTION);
267bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glLoadIdentity();
268bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    // put the origin in the left-bottom corner
269bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian    glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h
270135e5899f70a67e62baaf6dbec7ba2ce611ca16aMathias Agopian    glMatrixMode(GL_MODELVIEW);
271bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian}
272bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian
2731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2741b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
27513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) {
2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
277ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
28013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian        const sp<Layer>& layer(layers[i]);
281f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (layer->isSecure()) {
2823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
28713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
2883b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2910f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
2923b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
2933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
295cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
296cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
297cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
298cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
299cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
300da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian        const Transform& planeTransform(mGlobalTransform);
301cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
302cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
303cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
304cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
305cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
306cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
3073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
315d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
316d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
317d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
318d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
319d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
320d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
321d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
322d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
323d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
324d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
325d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
32728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
32828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
32928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
33028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
33128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
33228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
33328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
3340f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3393165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3423165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3453165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3483165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
35800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation,
359f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        const Rect& newViewport, const Rect& newFrame) {
360f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect viewport(newViewport);
361f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Rect frame(newFrame);
362da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
363f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int w = mDisplayWidth;
364f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const int h = mDisplayHeight;
365da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian
366f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform R;
367f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
369f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (!frame.isValid()) {
370f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // the destination frame can be invalid if it has never been set,
371f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // in that case we assume the whole display frame.
372f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        frame = Rect(w, h);
373f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
3746360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall
375f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (viewport.isEmpty()) {
376f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // viewport can be invalid if it has never been set, in that case
377f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // we assume the whole display size.
378f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // it's also invalid to have an empty viewport, so we handle that
379f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        // case in the same way.
380f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        viewport = Rect(w, h);
381f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        if (R.getOrientation() & Transform::ROT_90) {
382f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // viewport is always specified in the logical orientation
383f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            // of the display (ie: post-rotation).
384f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            swap(viewport.right, viewport.bottom);
385766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        }
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
387f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
388f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    dirtyRegion.set(getBounds());
389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    Transform TL, TP, S;
391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_width  = viewport.width();
392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_height = viewport.height();
393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_width  = frame.width();
394f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_height = frame.height();
395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (src_width != dst_width || src_height != dst_height) {
396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sx = dst_width  / src_width;
397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        float sy = dst_height / src_height;
398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        S.set(sx, 0, 0, sy);
399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_x = viewport.left;
402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float src_y = viewport.top;
403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_x = frame.left;
404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    float dst_y = frame.top;
405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TL.set(-src_x, -src_y);
406f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    TP.set(dst_x, dst_y);
407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // The viewport and frame are both in the logical orientation.
409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // Apply the logical translation, scale to physical size, apply the
410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    // physical translation and finally rotate to the physical orientation.
411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mGlobalTransform = R * TP * S * TL;
412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    const uint8_t type = mGlobalTransform.getType();
414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mNeedsFiltering = (!mGlobalTransform.preserveRects() ||
415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian            (type >= Transform::SCALE));
416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mScissor = mGlobalTransform.transform(viewport);
418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    if (mScissor.isEmpty()) {
419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian        mScissor.set(getBounds());
420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    }
421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian
422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mOrientation = orientation;
423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mViewport = viewport;
424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian    mFrame = frame;
4251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4261d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4271d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const {
4281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    const Transform& tr(mGlobalTransform);
4291d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    snprintf(buffer, SIZE,
4301d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "+ DisplayDevice: %s\n"
43102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        "   type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
432dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n"
433766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        "   v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
4341d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
43502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall        mDisplayName.string(), mType, mHwcDisplayId,
4361d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mOrientation, tr.getType(), getPageFlipCount(),
438dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(),
4391d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mViewport.left, mViewport.top, mViewport.right, mViewport.bottom,
4401d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        mFrame.left, mFrame.top, mFrame.right, mFrame.bottom,
441766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian        mScissor.left, mScissor.top, mScissor.right, mScissor.bottom,
4421d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][0], tr[1][0], tr[2][0],
4431d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][1], tr[1][1], tr[2][1],
4441d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian        tr[0][2], tr[1][2], tr[2][2]);
4451d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
4461d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian    result.append(buffer);
4471d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian
44899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    String8 surfaceDump;
44999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    mDisplaySurface->dump(surfaceDump);
45099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    result.append(surfaceDump);
4511d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian}
452