DisplayDevice.cpp revision 0f2f5ff75b7b48ceb64270655ee6b62d09bf4d00
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"
370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayHardware/DisplayDeviceBase.h"
381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
42c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
43921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h"
441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
45a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
47a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
52cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
57e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("GL error 0x%04x", int(error));
58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token)
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
64870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    struct EGLUtils {
65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        static const char *strerror(EGLint err) {
66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            switch (err){
67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_SUCCESS:           return "EGL_SUCCESS";
68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian                default: return "UNKNOWN";
83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            }
84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        }
85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    };
86870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint error = eglGetError();
88cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    if (error && error != EGL_SUCCESS) {
89e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("%s: EGL error 0x%04x (%s)",
900928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian                token, int(error), EGLUtils::strerror(error));
91cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    }
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        const sp<SurfaceTextureClient>& surface,
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
1060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    : DisplayDeviceBase(display),
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mFlinger(flinger),
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mDisplayId(display),
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mNativeWindow(surface),
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mFlags(0),
11187baae104a3e4c2059990b01c393476065c558b0Mathias Agopian      mSecureLayerVisible(false),
11287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian      mLayerStack(0)
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const {
121a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1223d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1240f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const {
125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
126a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const {
129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1320f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const {
133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mRefreshRate;
134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1360f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
137a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1396163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
147a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1480f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1516163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1520f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const {
153c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->w = getWidth();
154c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->h = getHeight();
155c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->xdpi = getDpiX();
156c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->ydpi = getDpiY();
157c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->fps = getRefreshRate();
158c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->density = getDensity();
159c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->orientation = getOrientation();
160c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    // TODO: this needs to go away (currently needed only by webkit)
161c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    getPixelFormatInfo(getFormat(), &info->pixelFormatInfo);
162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    return NO_ERROR;
163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian}
164c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian
1650f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
167a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int concreteType;
170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType);
171a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) {
172a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get());
1731f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    }
1741f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
1756163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1766163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = mFramebufferSurface->getRefreshRate();
181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    } else {
182a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = 60;
183b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
184a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
185385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
216b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
218a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
220385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2211f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
222a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
224a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
228a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
229a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface->isUpdateOnDemand()) {
230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFlags |= PARTIAL_UPDATES;
231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // if we have partial updates, we definitely don't need to
232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // preserve the backbuffer, which may be costly.
233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            eglSurfaceAttrib(display, surface,
234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian                    EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
235a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2360928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
2370928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
2381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
240a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
24398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
2440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault);
245a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
246a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
2470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
248076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshTimestamp() const {
25282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // this returns the last refresh timestamp.
25382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // if the last one is not available, we estimate it based on
25482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // the refresh period and whatever closest timestamp we have.
2553eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    Mutex::Autolock _l(mLock);
2563eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    nsecs_t now = systemTime(CLOCK_MONOTONIC);
25782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return now - ((now - mLastHwVSync) %  mRefreshPeriod);
25882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
25982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshPeriod() const {
26182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return mRefreshPeriod;
26282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
26382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
2640f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
268a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
26974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::onVSyncReceived(nsecs_t timestamp) {
2728630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    Mutex::Autolock _l(mLock);
2738630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    mLastHwVSync = timestamp;
2748630320433bd15aca239522e54e711ef6372ab07Mathias Agopian}
2758630320433bd15aca239522e54e711ef6372ab07Mathias Agopian
2760f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2835e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
285b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
286b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2905e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
2915e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
29295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
293a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface != NULL) {
294a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFramebufferSurface->setUpdateRectangle(dirty.getBounds());
295a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2961e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
2971e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
3071d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
308a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
309a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
310a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
3111d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) {
31452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
31552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    if (sur != hw.mSurface) {
31652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
31752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx);
31852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
31952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
32052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
3283b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3323b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
3343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3383b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3393b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3403b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3413b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
3423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
36898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
36998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
37298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
37498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
37598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
37698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
3771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
381