DisplayDevice.cpp revision d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3
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
1000f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
102a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        const sp<SurfaceTextureClient>& surface,
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
105d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    :   mFlinger(flinger),
106d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mDisplayId(display),
107d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mNativeWindow(surface),
108d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mDisplay(EGL_NO_DISPLAY),
109d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mSurface(EGL_NO_SURFACE),
110d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mContext(EGL_NO_CONTEXT),
111d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mDpiX(), mDpiY(),
112d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mRefreshRate(),
113d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mDensity(),
114d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mDisplayWidth(), mDisplayHeight(), mFormat(),
115d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mFlags(),
116d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mPageFlipCount(),
117d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mRefreshPeriod(),
118d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mSecureLayerVisible(false),
119d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mScreenAcquired(false),
120d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mOrientation(),
121d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian        mLayerStack(0)
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1290f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const {
130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiX;
1313d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian}
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const {
134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDpiY;
135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const {
138a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDensity;
139a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1410f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const {
142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mRefreshRate;
143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1476163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1486163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1490f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
151a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1530f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
154a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
155a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1570f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
159a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1606163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const {
162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->w = getWidth();
163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->h = getHeight();
164c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->xdpi = getDpiX();
165c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->ydpi = getDpiY();
166c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->fps = getRefreshRate();
167c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->density = getDensity();
168c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    info->orientation = getOrientation();
169c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    // TODO: this needs to go away (currently needed only by webkit)
170c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    getPixelFormatInfo(getFormat(), &info->pixelFormatInfo);
171c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    return NO_ERROR;
172c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian}
173c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian
1740f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int concreteType;
179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType);
180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) {
181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get());
1821f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    }
1831f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
1846163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1856163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
188a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
189a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = mFramebufferSurface->getRefreshRate();
190a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    } else {
191a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = 60;
192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
193a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
194385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
195a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
196a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
216b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
217b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
218b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
220b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
221b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
222b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
223b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
224b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
225b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
226a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
227a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
228b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
229385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2301f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
237a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
238a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface->isUpdateOnDemand()) {
239a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFlags |= PARTIAL_UPDATES;
240a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // if we have partial updates, we definitely don't need to
241a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // preserve the backbuffer, which may be costly.
242a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            eglSurfaceAttrib(display, surface,
243a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian                    EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
244a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2450928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
2460928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
2471f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
249a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2501f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2511f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
25298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
2530f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault);
254a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
255a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
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::flip(const Region& dirty) const
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2785e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
280b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
281b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2855e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
2865e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
28795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
288a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface != NULL) {
289a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFramebufferSurface->setUpdateRectangle(dirty.getBounds());
290a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2911e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
2921e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2960f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
3021d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
303a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
304a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
305a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
3061d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
3071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) {
30952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
31052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    if (sur != hw.mSurface) {
31152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
31252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx);
31352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
31452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
31552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
3161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
3193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3203b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
3223b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3320f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
3333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
3343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
3353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
338d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
339d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
340d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
341d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
342d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
343d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
344d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
345d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
346d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
347d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
348d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
349d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
350d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
351d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
352d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
353d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
354d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
3553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
3560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
3711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
3721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
3741b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
3751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
3771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
38198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
38298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
38598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
38798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
38898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
38998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
394