DisplayDevice.cpp revision 92a979a92c34b7de609ce2b1662c73bb8a2728b9
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
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h"
371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
41c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
42921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h"
431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
44a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
46a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
52cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
56e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("GL error 0x%04x", int(error));
57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token)
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
63870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    struct EGLUtils {
64870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        static const char *strerror(EGLint err) {
65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            switch (err){
66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_SUCCESS:           return "EGL_SUCCESS";
67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                default: return "UNKNOWN";
82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            }
83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        }
84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    };
85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint error = eglGetError();
87cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    if (error && error != EGL_SUCCESS) {
88e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("%s: EGL error 0x%04x (%s)",
890928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian                token, int(error), EGLUtils::strerror(error));
90cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    }
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias AgopianDisplayDevice::DisplayDevice()
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mId(0),
10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
10492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT)
10592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian{
10692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
10792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
1080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        const sp<SurfaceTextureClient>& surface,
112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
11392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
11492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mId(display),
11592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mNativeWindow(surface),
11692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
11792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
11892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
11992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDpiX(), mDpiY(),
12092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mRefreshRate(),
12192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDensity(),
12292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
12392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
12492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
12592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mRefreshPeriod(),
12692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
12792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
12892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mOrientation(),
12992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mLayerStack(0)
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1340f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
13592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    // DO NOT call terminate() from here, because we create
13692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    // temporaries of this class (on the stack typically), and we don't
13792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    // want to destroy the EGLSurface in that case
13892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
13992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
14092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianvoid DisplayDevice::terminate() {
14192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
14292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
14392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
14492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
14592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
14692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
14792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
14892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const {
152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1533d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const {
156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1590f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const {
160a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
161a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
162a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1630f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const {
164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mRefreshRate;
165a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
166a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1696163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1706163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
172a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1790f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1826163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const {
184c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->w = getWidth();
185c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->h = getHeight();
186c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->xdpi = getDpiX();
187c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->ydpi = getDpiY();
188c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->fps = getRefreshRate();
189c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->density = getDensity();
190c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->orientation = getOrientation();
191c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    // TODO: this needs to go away (currently needed only by webkit)
192c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    getPixelFormatInfo(getFormat(), &info->pixelFormatInfo);
193c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    return NO_ERROR;
194c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian}
195c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian
1960f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
198a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
199a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
200a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int concreteType;
201a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType);
202a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) {
203a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get());
2041f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    }
2051f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
2066163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
2076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
208a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
209a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
210a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
211a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = mFramebufferSurface->getRefreshRate();
212a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    } else {
213a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = 60;
214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
215a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
216385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
218a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
220b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
221b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
222b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
223b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
224b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
225b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
226b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
227b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
228b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
229b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
230b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
231b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
232b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
233b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
234b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
235b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
236b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
237b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
238b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
239b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
240b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
241b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
242b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
243b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
244b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
245b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
246b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
247b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
248a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
249a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
250b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
251385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2521f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
253a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
255a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
259a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
260a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface->isUpdateOnDemand()) {
261a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFlags |= PARTIAL_UPDATES;
262a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // if we have partial updates, we definitely don't need to
263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // preserve the backbuffer, which may be costly.
264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            eglSurfaceAttrib(display, surface,
265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian                    EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2670928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
2680928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
2691f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2701f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
271a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2721f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2731f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
27498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
2750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault);
276a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
277a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
2780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
279076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2820f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshPeriod() const {
28382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return mRefreshPeriod;
28482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
28582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2860f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
287a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
288a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
289a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
290a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
29174faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2930f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3005e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
302b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
303b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3075e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
3085e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
30995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
310a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface != NULL) {
311a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFramebufferSurface->setUpdateRectangle(dirty.getBounds());
312a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
3131e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
3141e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
3241d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
325a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
326a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
327a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
3281d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) {
33152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
33252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    if (sur != hw.mSurface) {
33352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
33452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx);
33552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
33652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
33752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
3413b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
3433b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
3443b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
3453b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
3463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3473b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3483b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3500f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
3513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3533b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3540f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3563b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3573b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3583b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
359d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
360d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
361d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
362d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
363d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
364d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
365d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
366d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
367d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
368d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
369d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
370d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
371d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
372d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
373d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
374d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
375d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
376d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
3841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4020f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
40398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
40498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
4051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
40798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
4081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
40998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
41098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
41198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
4121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
41492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    dirtyRegion.set(bounds());
4151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
417