DisplayDevice.cpp revision d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h" 371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 41c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 42921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h" 431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 44a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 46a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 51cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian do { 52cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // there could be more than one error flag 53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian GLenum error = glGetError(); 54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error == GL_NO_ERROR) 55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian break; 56e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GL error 0x%04x", int(error)); 57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } while(true); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token) 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 63870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian struct EGLUtils { 64870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian static const char *strerror(EGLint err) { 65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian switch (err){ 66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_SUCCESS: return "EGL_SUCCESS"; 67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian default: return "UNKNOWN"; 82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian }; 85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 87cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error && error != EGL_SUCCESS) { 88e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: EGL error 0x%04x (%s)", 890928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian token, int(error), EGLUtils::strerror(error)); 90cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 93a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1000f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 102a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian const sp<SurfaceTextureClient>& surface, 104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 105d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian : mFlinger(flinger), 106d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mDisplayId(display), 107d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mNativeWindow(surface), 108d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mDisplay(EGL_NO_DISPLAY), 109d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mSurface(EGL_NO_SURFACE), 110d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mContext(EGL_NO_CONTEXT), 111d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mDpiX(), mDpiY(), 112d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mRefreshRate(), 113d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mDensity(), 114d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 115d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mFlags(), 116d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mPageFlipCount(), 117d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mRefreshPeriod(), 118d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mSecureLayerVisible(false), 119d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired(false), 120d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mOrientation(), 121d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mLayerStack(0) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1290f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const { 130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1313d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const { 134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const { 138a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 139a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1410f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const { 142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mRefreshRate; 143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1476163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1486163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1490f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 151a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1530f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 154a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 155a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1570f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 159a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1606163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const { 162c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->w = getWidth(); 163c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->h = getHeight(); 164c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->xdpi = getDpiX(); 165c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->ydpi = getDpiY(); 166c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->fps = getRefreshRate(); 167c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->density = getDensity(); 168c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->orientation = getOrientation(); 169c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian // TODO: this needs to go away (currently needed only by webkit) 170c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian getPixelFormatInfo(getFormat(), &info->pixelFormatInfo); 171c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return NO_ERROR; 172c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian} 173c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 1740f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int concreteType; 179a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType); 180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) { 181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get()); 1821f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian } 1831f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 1846163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1856163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 188a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 189a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = mFramebufferSurface->getRefreshRate(); 190a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } else { 191a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = 60; 192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 193a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshPeriod = nsecs_t(1e9 / mRefreshRate); 194385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 195a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 196a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 206b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 207b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 209b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 210b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 211b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 212b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 213b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 215b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 216b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 217b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 218b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 220b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 221b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 222b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 223b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 224b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 225b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 226a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 227a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 228b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 229385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 2301f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 2341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 2351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 237a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 238a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface->isUpdateOnDemand()) { 239a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags |= PARTIAL_UPDATES; 240a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // if we have partial updates, we definitely don't need to 241a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // preserve the backbuffer, which may be costly. 242a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglSurfaceAttrib(display, surface, 243a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); 244a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2450928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian } 2460928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian 2471f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 2481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 249a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 2501f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 2511f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 25298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 2530f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault); 254a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 255a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshPeriod() const { 26182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return mRefreshPeriod; 26282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 26382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2640f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 268a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 26974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2785e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 280b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 281b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2855e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 2865e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 28795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian if (mFlags & PARTIAL_UPDATES) { 288a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 289a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->setUpdateRectangle(dirty.getBounds()); 290a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2911e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 2921e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2960f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3010f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 3021d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 303a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 304a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 305a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 3061d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 3071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) { 30952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 31052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian if (sur != hw.mSurface) { 31152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 31252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx); 31352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 31452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 31552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 3161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 3193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3203b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3223b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const { 3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3303b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3313b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3320f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 338d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 339d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 340d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 341d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 342d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 343d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 344d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 345d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 346d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 347d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 348d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 349d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 350d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 351d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 352d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 353d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 354d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientationDefault: 3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation90: 3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation180: 3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation270: 3711b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3741b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) { 38198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 38298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::orientationToTransfrom( 38598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian if (orientation & ISurfaceComposer::eOrientationSwapMask) { 38798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 38898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 38998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 394