DisplayDevice.cpp revision c666cae2d5995097ec49a87e375e2afdd92802b7
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/DisplayHardwareBase.h"
381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware.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
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware(
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        const sp<SurfaceTextureClient>& surface,
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
106921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian    : DisplayHardwareBase(display),
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mFlinger(flinger),
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mDisplayId(display),
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mNativeWindow(surface),
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mFlags(0),
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mSecureLayerVisible(false)
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianDisplayHardware::~DisplayHardware() {
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDpiX() const {
120a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1213d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDpiY() const {
124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
126a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDensity() const {
128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getRefreshRate() const {
132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mRefreshRate;
133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianint DisplayHardware::getWidth() const {
136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1376163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
139a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianint DisplayHardware::getHeight() const {
140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
143a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianPixelFormat DisplayHardware::getFormat() const {
144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
147a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianEGLSurface DisplayHardware::getEGLSurface() const {
148a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1506163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
151c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopianstatus_t DisplayHardware::getInfo(DisplayInfo* info) const {
152c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->w = getWidth();
153c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->h = getHeight();
154c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->xdpi = getDpiX();
155c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->ydpi = getDpiY();
156c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->fps = getRefreshRate();
157c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->density = getDensity();
158c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->orientation = getOrientation();
159c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    // TODO: this needs to go away (currently needed only by webkit)
160c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    getPixelFormatInfo(getFormat(), &info->pixelFormatInfo);
161c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    return NO_ERROR;
162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian}
163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian
164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianvoid DisplayHardware::init(EGLConfig config)
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
166a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
167a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int concreteType;
169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType);
170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) {
171a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get());
1721f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    }
1731f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
1746163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1756163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = mFramebufferSurface->getRefreshRate();
180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    } else {
181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = 60;
182b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
183a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
184385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
185a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
187b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
216a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
218b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
219385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2201f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
221a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
223a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
227a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
228a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface->isUpdateOnDemand()) {
229a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFlags |= PARTIAL_UPDATES;
230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // if we have partial updates, we definitely don't need to
231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // preserve the backbuffer, which may be costly.
232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            eglSurfaceAttrib(display, surface,
233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian                    EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2350928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
2360928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
2371f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
239a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
24298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
24398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    DisplayHardware::setOrientation(ISurfaceComposer::eOrientationDefault);
244a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
245a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const {
247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshTimestamp() const {
25182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // this returns the last refresh timestamp.
25282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // if the last one is not available, we estimate it based on
25382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // the refresh period and whatever closest timestamp we have.
2543eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    Mutex::Autolock _l(mLock);
2553eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    nsecs_t now = systemTime(CLOCK_MONOTONIC);
25682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return now - ((now - mLastHwVSync) %  mRefreshPeriod);
25782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
25882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
25982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshPeriod() const {
26082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return mRefreshPeriod;
26182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
26282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
26374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t DisplayHardware::compositionComplete() const {
264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
26874faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2708630320433bd15aca239522e54e711ef6372ab07Mathias Agopianvoid DisplayHardware::onVSyncReceived(nsecs_t timestamp) {
2718630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    Mutex::Autolock _l(mLock);
2728630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    mLastHwVSync = timestamp;
2738630320433bd15aca239522e54e711ef6372ab07Mathias Agopian}
2748630320433bd15aca239522e54e711ef6372ab07Mathias Agopian
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::flip(const Region& dirty) const
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2825e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
284b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
285b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2895e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
2905e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
29195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
292a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface != NULL) {
293a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFramebufferSurface->setUpdateRectangle(dirty.getBounds());
294a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2951e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
2961e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getFlags() const
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3051d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gillingvoid DisplayHardware::dump(String8& res) const
3061d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
307a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
308a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
309a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
3101d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
3111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianvoid DisplayHardware::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
3173b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
3183b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
3193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
3203b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3223b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias AgopianVector< sp<LayerBase> > DisplayHardware::getVisibleLayersSortedByZ() const {
3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3283b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianbool DisplayHardware::getSecureLayerVisible() const {
3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3323b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
3333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianstatus_t DisplayHardware::orientationToTransfrom(
3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
35898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopianstatus_t DisplayHardware::setOrientation(int orientation) {
35998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
36098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
36298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    DisplayHardware::orientationToTransfrom(
36398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
36598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
36698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
36798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
372