DisplayDevice.cpp revision 0f2f5ff75b7b48ceb64270655ee6b62d09bf4d00
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" 370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayHardware/DisplayDeviceBase.h" 381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.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 1010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian const sp<SurfaceTextureClient>& surface, 105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 1060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian : DisplayDeviceBase(display), 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlinger(flinger), 108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDisplayId(display), 109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mNativeWindow(surface), 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags(0), 11187baae104a3e4c2059990b01c393476065c558b0Mathias Agopian mSecureLayerVisible(false), 11287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian mLayerStack(0) 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const { 121a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1223d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1240f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const { 125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 126a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const { 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1320f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const { 133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mRefreshRate; 134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1360f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 137a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1396163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 147a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1480f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1516163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1520f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const { 153c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->w = getWidth(); 154c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->h = getHeight(); 155c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->xdpi = getDpiX(); 156c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->ydpi = getDpiY(); 157c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->fps = getRefreshRate(); 158c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->density = getDensity(); 159c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->orientation = getOrientation(); 160c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian // TODO: this needs to go away (currently needed only by webkit) 161c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian getPixelFormatInfo(getFormat(), &info->pixelFormatInfo); 162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return NO_ERROR; 163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian} 164c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 1650f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 167a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int concreteType; 170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType); 171a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) { 172a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get()); 1731f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian } 1741f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 1756163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1766163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = mFramebufferSurface->getRefreshRate(); 181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } else { 182a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = 60; 183b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 184a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshPeriod = nsecs_t(1e9 / mRefreshRate); 185385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 216b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 218a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 220385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 2211f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 222a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 224a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 2251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 2261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 229a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface->isUpdateOnDemand()) { 230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags |= PARTIAL_UPDATES; 231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // if we have partial updates, we definitely don't need to 232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // preserve the backbuffer, which may be costly. 233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglSurfaceAttrib(display, surface, 234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); 235a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2360928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian } 2370928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian 2381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 2391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 240a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 2411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 2421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 24398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 2440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault); 245a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 246a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 2470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 248076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshTimestamp() const { 25282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // this returns the last refresh timestamp. 25382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // if the last one is not available, we estimate it based on 25482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // the refresh period and whatever closest timestamp we have. 2553eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian Mutex::Autolock _l(mLock); 2563eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian nsecs_t now = systemTime(CLOCK_MONOTONIC); 25782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return now - ((now - mLastHwVSync) % mRefreshPeriod); 25882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 25982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshPeriod() const { 26182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return mRefreshPeriod; 26282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 26382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2640f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 268a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 26974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::onVSyncReceived(nsecs_t timestamp) { 2728630320433bd15aca239522e54e711ef6372ab07Mathias Agopian Mutex::Autolock _l(mLock); 2738630320433bd15aca239522e54e711ef6372ab07Mathias Agopian mLastHwVSync = timestamp; 2748630320433bd15aca239522e54e711ef6372ab07Mathias Agopian} 2758630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 2760f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2835e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 285b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 286b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2905e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 2915e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 29295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian if (mFlags & PARTIAL_UPDATES) { 293a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 294a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->setUpdateRectangle(dirty.getBounds()); 295a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2961e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 2971e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 3071d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 308a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 309a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 310a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 3111d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) { 31452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 31552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian if (sur != hw.mSurface) { 31652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 31752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx); 31852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 31952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 32052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 3283b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3323b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const { 3343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3383b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3393b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3403b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3413b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientationDefault: 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation90: 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation180: 3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation270: 3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) { 36898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 36998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::orientationToTransfrom( 37298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian if (orientation & ISurfaceComposer::eOrientationSwapMask) { 37498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 37598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 37698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 3771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 381