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