DisplayDevice.cpp revision c666cae2d5995097ec49a87e375e2afdd92802b7
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h" 371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/DisplayHardwareBase.h" 381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware.h" 411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 42c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 43921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h" 441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 45a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 47a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian do { 53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // there could be more than one error flag 54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian GLenum error = glGetError(); 55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error == GL_NO_ERROR) 56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian break; 57e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GL error 0x%04x", int(error)); 58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } while(true); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token) 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 64870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian struct EGLUtils { 65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian static const char *strerror(EGLint err) { 66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian switch (err){ 67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_SUCCESS: return "EGL_SUCCESS"; 68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian default: return "UNKNOWN"; 83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian }; 86870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 88cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error && error != EGL_SUCCESS) { 89e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: EGL error 0x%04x (%s)", 900928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian token, int(error), EGLUtils::strerror(error)); 91cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware( 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian const sp<SurfaceTextureClient>& surface, 105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 106921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian : DisplayHardwareBase(display), 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlinger(flinger), 108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDisplayId(display), 109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mNativeWindow(surface), 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags(0), 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mSecureLayerVisible(false) 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianDisplayHardware::~DisplayHardware() { 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDpiX() const { 120a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1213d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDpiY() const { 124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 126a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getDensity() const { 128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianfloat DisplayHardware::getRefreshRate() const { 132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mRefreshRate; 133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianint DisplayHardware::getWidth() const { 136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1376163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 139a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianint DisplayHardware::getHeight() const { 140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 143a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianPixelFormat DisplayHardware::getFormat() const { 144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 147a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianEGLSurface DisplayHardware::getEGLSurface() const { 148a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1506163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 151c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopianstatus_t DisplayHardware::getInfo(DisplayInfo* info) const { 152c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->w = getWidth(); 153c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->h = getHeight(); 154c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->xdpi = getDpiX(); 155c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->ydpi = getDpiY(); 156c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->fps = getRefreshRate(); 157c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->density = getDensity(); 158c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->orientation = getOrientation(); 159c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian // TODO: this needs to go away (currently needed only by webkit) 160c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian getPixelFormatInfo(getFormat(), &info->pixelFormatInfo); 161c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return NO_ERROR; 162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian} 163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianvoid DisplayHardware::init(EGLConfig config) 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 166a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 167a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int concreteType; 169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType); 170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) { 171a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get()); 1721f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian } 1731f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 1746163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1756163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = mFramebufferSurface->getRefreshRate(); 180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } else { 181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = 60; 182b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 183a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshPeriod = nsecs_t(1e9 / mRefreshRate); 184385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 185a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 187b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 216a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 218b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 219385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 2201f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 221a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 223a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 2241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 2251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 227a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 228a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface->isUpdateOnDemand()) { 229a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags |= PARTIAL_UPDATES; 230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // if we have partial updates, we definitely don't need to 231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // preserve the backbuffer, which may be costly. 232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglSurfaceAttrib(display, surface, 233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); 234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2350928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian } 2360928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian 2371f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 2381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 239a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 2401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 2411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 24298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 24398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian DisplayHardware::setOrientation(ISurfaceComposer::eOrientationDefault); 244a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 245a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const { 247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshTimestamp() const { 25182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // this returns the last refresh timestamp. 25282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // if the last one is not available, we estimate it based on 25382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // the refresh period and whatever closest timestamp we have. 2543eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian Mutex::Autolock _l(mLock); 2553eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian nsecs_t now = systemTime(CLOCK_MONOTONIC); 25682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return now - ((now - mLastHwVSync) % mRefreshPeriod); 25782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 25882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 25982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopiannsecs_t DisplayHardware::getRefreshPeriod() const { 26082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return mRefreshPeriod; 26182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 26282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 26374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t DisplayHardware::compositionComplete() const { 264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 26874faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2708630320433bd15aca239522e54e711ef6372ab07Mathias Agopianvoid DisplayHardware::onVSyncReceived(nsecs_t timestamp) { 2718630320433bd15aca239522e54e711ef6372ab07Mathias Agopian Mutex::Autolock _l(mLock); 2728630320433bd15aca239522e54e711ef6372ab07Mathias Agopian mLastHwVSync = timestamp; 2738630320433bd15aca239522e54e711ef6372ab07Mathias Agopian} 2748630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::flip(const Region& dirty) const 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2825e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 284b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 285b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2895e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 2905e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 29195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian if (mFlags & PARTIAL_UPDATES) { 292a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 293a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->setUpdateRectangle(dirty.getBounds()); 294a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2951e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 2961e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getFlags() const 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3051d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gillingvoid DisplayHardware::dump(String8& res) const 3061d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 307a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 308a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 309a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 3101d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 3111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianvoid DisplayHardware::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 3173b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3183b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 3193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3203b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3223b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias AgopianVector< sp<LayerBase> > DisplayHardware::getVisibleLayersSortedByZ() const { 3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3283b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopianbool DisplayHardware::getSecureLayerVisible() const { 3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3323b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianstatus_t DisplayHardware::orientationToTransfrom( 3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientationDefault: 3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation90: 3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation180: 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation270: 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 35898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopianstatus_t DisplayHardware::setOrientation(int orientation) { 35998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 36098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 36298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian DisplayHardware::orientationToTransfrom( 36398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian if (orientation & ISurfaceComposer::eOrientationSwapMask) { 36598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 36698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 36798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 372