DisplayDevice.cpp revision ef7b9c7eac036cc1230c64821039d18f8cbd2c1c
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
410f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
43c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
44921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h"
451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
46a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
48a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
58e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("GL error 0x%04x", int(error));
59cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
71a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<ANativeWindow>& nativeWindow,
731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<FramebufferSurface>& framebufferSurface,
74a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
7592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mId(display),
771a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mNativeWindow(nativeWindow),
781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mFramebufferSurface(framebufferSurface),
7992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDpiX(), mDpiY(),
8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDensity(),
8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
8892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
8992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mOrientation(),
9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mLayerStack(0)
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
92a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
950f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const {
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1083d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1100f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const {
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1140f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const {
115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
117a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1206163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1216163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1220f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1336163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1340f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
137a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1396163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
144b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
145b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
146b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
147b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
148b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
149b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
150b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
151b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
152b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
153b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
154b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
155b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
156b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
157b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
158b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
159b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
160b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
161b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
162b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
163b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
164b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
165b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
166b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
167b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
168b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
169b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
170b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
171b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
172b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
175b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
176385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1771f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1841f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1851f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1871f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
1881f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
18998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
1903165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    DisplayDevice::setOrientation(DisplayState::eOrientationDefault);
191a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
192a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1930f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1970f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
198a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
199a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
200a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
201a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
20274faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2040f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2115e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
213b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
214b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
215df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
216df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2185e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
2195e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
2291d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
2331d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
2341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2354297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid DisplayDevice::makeCurrent(const sp<const DisplayDevice>& hw, EGLContext ctx) {
23652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
2374297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
23852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
2394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian        eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
24052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
24152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
24252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
2431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
2463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
247ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2483b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2503b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
2513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2533b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2543b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
2573b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2583b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2593b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
2613b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
2623b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2633b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2643b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
265d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
266d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
267d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
268d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
269d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
270d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
271d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
272d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
273d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
274d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
275d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
276d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
277d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
278d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
279d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
280d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
281d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
282d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
28428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
28528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
28628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
28728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
28828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
28928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
29028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
2910f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
2921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
2931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
2941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
2951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
2963165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
2971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
2981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
2993165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
3001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3023165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
3031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3053165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
3061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3101b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3150f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
31698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
31798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3190f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
32098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
3213165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    if (orientation & DisplayState::eOrientationSwapMask) {
32298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
32398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
32498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
32792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    dirtyRegion.set(bounds());
3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
330