DisplayDevice.cpp revision 1a4d883dcc1725892bfb5c28dec255a233186524
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
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token)
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    struct EGLUtils {
66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        static const char *strerror(EGLint err) {
67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            switch (err){
68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_SUCCESS:           return "EGL_SUCCESS";
69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                default: return "UNKNOWN";
84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            }
85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        }
86870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    };
87870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint error = eglGetError();
89cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    if (error && error != EGL_SUCCESS) {
90e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("%s: EGL error 0x%04x (%s)",
910928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian                token, int(error), EGLUtils::strerror(error));
92cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    }
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
96a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1020f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
1051a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<ANativeWindow>& nativeWindow,
1061a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<FramebufferSurface>& framebufferSurface,
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
10892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
10992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mId(display),
1101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mNativeWindow(nativeWindow),
1111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mFramebufferSurface(framebufferSurface),
11292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
11392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
11492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
11592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDpiX(), mDpiY(),
11692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDensity(),
11792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
11892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
11992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
12092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
12192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
12292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mOrientation(),
12392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mLayerStack(0)
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
12992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
13092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
13192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
13292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
13392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
13492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
13592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
13692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const {
140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1413d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const {
144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const {
148a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1536163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1546163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1590f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
160a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
161a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
162a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1630f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
165a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1666163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1716163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1726163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
175a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
177b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
178b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
179b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
180b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
181b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
182b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
183b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
184b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
185b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
186b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
187b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
206a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
207a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
209385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
211a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
213a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2181f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
219a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2201f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2211f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
22298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
2230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault);
224a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
225a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
2260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
227076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
23574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2445e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
246b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
247b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2515e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
2525e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
2621d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
2661d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
2671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2684297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid DisplayDevice::makeCurrent(const sp<const DisplayDevice>& hw, EGLContext ctx) {
26952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
2704297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
27152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
2724297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian        eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
27352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
27452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
27552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
2761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
2803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2873b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2880f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2920f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
2933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
297d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
298d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
299d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
300d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
301d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3160f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
3221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
3311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
34198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
34298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
34598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
34798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
34898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
34998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
35292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    dirtyRegion.set(bounds());
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
355