DisplayDevice.cpp revision a49126087b4494f4ef50873f3a3f6727265f6621
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
27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
34a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#include <private/gui/SharedBufferStack.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"
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
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware(
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
102a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        const sp<SurfaceTextureClient>& surface,
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    : DisplayHardwareBase(flinger, display),
106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mFlinger(flinger),
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mDisplayId(display),
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian      mHwc(0),
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
151a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianvoid DisplayHardware::init(EGLConfig config)
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
153a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
154a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
155a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int concreteType;
156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType);
157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) {
158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get());
1591f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    }
1601f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
1616163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1626163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
163a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiX = window->xdpi;
164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mDpiY = window->ydpi;
165a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
166a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = mFramebufferSurface->getRefreshRate();
167a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    } else {
168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mRefreshRate = 60;
169b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
171385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
172a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // TODO: Not sure if display density should handled by SF any longer
174b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    class Density {
175b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getDensityFromProperty(char const* propName) {
176b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            char property[PROPERTY_VALUE_MAX];
177b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            int density = 0;
178b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            if (property_get(propName, property, NULL) > 0) {
179b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian                density = atoi(property);
180b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            }
181b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return density;
182b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        }
183b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    public:
184b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getEmuDensity() {
185b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("qemu.sf.lcd_density"); }
186b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        static int getBuildDensity()  {
187b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian            return getDensityFromProperty("ro.sf.lcd_density"); }
188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    };
189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    // The density of the device is provided by a build property
190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    mDensity = Density::getBuildDensity() / 160.0f;
191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (mDensity == 0) {
192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // the build doesn't provide a density -- this is wrong!
193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // use xdpi instead
194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        ALOGE("ro.sf.lcd_density must be defined as a build property");
195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity = mDpiX / 160.0f;
196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    if (Density::getEmuDensity()) {
198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        // if "qemu.sf.lcd_density" is specified, it overrides everything
199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDpiX = mDpiY = mDensity = Density::getEmuDensity();
200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian        mDensity /= 160.0f;
201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian    }
202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
203a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
204a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
206385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
2071f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
208a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
210a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
2111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
2121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
214a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
215a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface->isUpdateOnDemand()) {
216a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFlags |= PARTIAL_UPDATES;
217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // if we have partial updates, we definitely don't need to
218a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            // preserve the backbuffer, which may be costly.
219a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            eglSurfaceAttrib(display, surface,
220a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian                    EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
221a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
2220928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
2230928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
2241f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2251f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
226a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
2271f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2281f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
229a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    // initialize the H/W composer
2303eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    mHwc = new HWComposer(mFlinger, *this, mRefreshPeriod);
231a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    if (mHwc->initCheck() == NO_ERROR) {
232a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian        mHwc->setFrameBuffer(mDisplay, mSurface);
233a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    }
2341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    // initialize the display orientation transform.
2361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    // it's a constant that should come from the display driver.
2371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    int displayOrientation = ISurfaceComposer::eOrientationDefault;
2381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    char property[PROPERTY_VALUE_MAX];
2391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (property_get("ro.sf.hwrotation", property, NULL) > 0) {
2401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        //displayOrientation
2411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        switch (atoi(property)) {
2421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        case 90:
2431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            displayOrientation = ISurfaceComposer::eOrientation90;
2441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            break;
2451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        case 270:
2461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            displayOrientation = ISurfaceComposer::eOrientation270;
2471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            break;
2481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        }
2491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
2501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    w = mDisplayWidth;
2521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    h = mDisplayHeight;
2531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    DisplayHardware::orientationToTransfrom(displayOrientation, w, h,
2541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            &mDisplayTransform);
2551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (displayOrientation & ISurfaceComposer::eOrientationSwapMask) {
2561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mLogicalDisplayWidth = h;
2571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mLogicalDisplayHeight = w;
2581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    } else {
2591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mLogicalDisplayWidth = w;
2601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mLogicalDisplayHeight = h;
2611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
2621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    DisplayHardware::setOrientation(ISurfaceComposer::eOrientationDefault);
263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // initialize the shared control block
265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface_flinger_cblk_t* const scblk = mFlinger->getControlBlock();
266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    scblk->connected |= 1 << mDisplayId;
267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    display_cblk_t* dcblk = &scblk->displays[mDisplayId];
268a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    memset(dcblk, 0, sizeof(display_cblk_t));
269a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->w = w; // XXX: plane.getWidth();
270a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->h = h; // XXX: plane.getHeight();
271a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->format = format;
272a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->orientation = ISurfaceComposer::eOrientationDefault;
273a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->xdpi = mDpiX;
274a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->ydpi = mDpiY;
275a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->fps = mRefreshRate;
276a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    dcblk->density = mDensity;
277a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
278a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
2793eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopianvoid DisplayHardware::setVSyncHandler(const sp<VSyncHandler>& handler) {
2803eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    Mutex::Autolock _l(mLock);
2813eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    mVSyncHandler = handler;
2823eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian}
2833eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
28403e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopianvoid DisplayHardware::eventControl(int event, int enabled) {
28503e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian    if (event == EVENT_VSYNC) {
28603e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian        mPowerHAL.vsyncHint(enabled);
28703e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian    }
28803e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian    mHwc->eventControl(event, enabled);
28903e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian}
29003e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian
2913eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopianvoid DisplayHardware::onVSyncReceived(int dpy, nsecs_t timestamp) {
2923eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    sp<VSyncHandler> handler;
2933eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    { // scope for the lock
2943eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian        Mutex::Autolock _l(mLock);
2953eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian        mLastHwVSync = timestamp;
2963eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian        if (mVSyncHandler != NULL) {
2973eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian            handler = mVSyncHandler.promote();
2983eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian        }
2993eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    }
3003eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
3013eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    if (handler != NULL) {
3023eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian        handler->onVSyncReceived(dpy, timestamp);
3033eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    }
3043eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian}
3053eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
306a350ff98692b3a50cad5cc93f9f83221242ca86aMathias AgopianHWComposer& DisplayHardware::getHwComposer() const {
307a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    return *mHwc;
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::releaseScreen() const
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayHardwareBase::releaseScreen();
313f5f2712854599b4970643c6000fe6ae950a08ba9Antti Hatala    if (mHwc->initCheck() == NO_ERROR) {
314f5f2712854599b4970643c6000fe6ae950a08ba9Antti Hatala        mHwc->release();
315f5f2712854599b4970643c6000fe6ae950a08ba9Antti Hatala    }
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::acquireScreen() const
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
32010fbdb6059755f009e02f0ccc2b9d289beb6b086Colin Cross    if (mHwc->initCheck() == NO_ERROR) {
32110fbdb6059755f009e02f0ccc2b9d289beb6b086Colin Cross        mHwc->acquire();
32210fbdb6059755f009e02f0ccc2b9d289beb6b086Colin Cross    }
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayHardwareBase::acquireScreen();
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const {
327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshTimestamp() const {
33182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // this returns the last refresh timestamp.
33282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // if the last one is not available, we estimate it based on
33382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    // the refresh period and whatever closest timestamp we have.
3343eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    Mutex::Autolock _l(mLock);
3353eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    nsecs_t now = systemTime(CLOCK_MONOTONIC);
33682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return now - ((now - mLastHwVSync) %  mRefreshPeriod);
33782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
33882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
33982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshPeriod() const {
34082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    return mRefreshPeriod;
34182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
34282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
34374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t DisplayHardware::compositionComplete() const {
344a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
345a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
346a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
347a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
34874faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::flip(const Region& dirty) const
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3575e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
358df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
359b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
360b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
361df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
362df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3645e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
3655e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
36695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
367a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        if (mFramebufferSurface != NULL) {
368a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            mFramebufferSurface->setUpdateRectangle(dirty.getBounds());
369a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        }
3701e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
3711e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
373a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
374a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    if (mHwc->initCheck() == NO_ERROR) {
375a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian        mHwc->commit();
376a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    } else {
377a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian        eglSwapBuffers(dpy, surface);
378a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    }
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkEGLErrors("eglSwapBuffers");
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getFlags() const
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3871d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gillingvoid DisplayHardware::dump(String8& res) const
3881d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
389a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
390a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
391a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
3921d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
3963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianvoid DisplayHardware::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
3973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
3983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
3993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
4003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
4013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
4023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
4033b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
4043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
4053b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
4063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias AgopianVector< sp<LayerBase> > DisplayHardware::getVisibleLayersSortedByZ() const {
4073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
4083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
4093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
4103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianbool DisplayHardware::getSecureLayerVisible() const {
4113b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
4123b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
4133b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
4143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
4153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianstatus_t DisplayHardware::orientationToTransfrom(
4171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
4181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
4191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
4201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
4211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientationDefault:
4221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
4231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation90:
4251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
4261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation180:
4281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
4291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    case ISurfaceComposer::eOrientation270:
4311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
4321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
4331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
4341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
4351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
4371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
4391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianstatus_t DisplayHardware::setOrientation(int orientation)
4411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
4421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    // If the rotation can be handled in hardware, this is where
4431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    // the magic should happen.
4441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    const int w = mLogicalDisplayWidth;
4461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    const int h = mLogicalDisplayHeight;
4471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mUserDisplayWidth = w;
4481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mUserDisplayHeight = h;
4491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    Transform orientationTransform;
4511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    DisplayHardware::orientationToTransfrom(orientation, w, h,
4521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            &orientationTransform);
4531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    if (orientation & ISurfaceComposer::eOrientationSwapMask) {
4541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mUserDisplayWidth = h;
4551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        mUserDisplayHeight = w;
4561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
4571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
4581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
4591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mGlobalTransform = mDisplayTransform * orientationTransform;
4601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
4611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
462