DisplayDevice.cpp revision 92a979a92c34b7de609ce2b1662c73bb8a2728b9
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 10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias AgopianDisplayDevice::DisplayDevice() 10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mId(0), 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 10492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT) 10592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian{ 10692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 10792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 1080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian const sp<SurfaceTextureClient>& surface, 112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 11392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 11492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mId(display), 11592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mNativeWindow(surface), 11692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 11792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 11892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 11992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDpiX(), mDpiY(), 12092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mRefreshRate(), 12192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDensity(), 12292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 12392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 12492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 12592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mRefreshPeriod(), 12692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 12792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 12892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mOrientation(), 12992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mLayerStack(0) 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1340f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 13592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // DO NOT call terminate() from here, because we create 13692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // temporaries of this class (on the stack typically), and we don't 13792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // want to destroy the EGLSurface in that case 13892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 13992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 14092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianvoid DisplayDevice::terminate() { 14192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 14292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 14392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 14492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 14592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 14692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 14792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 14892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const { 152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1533d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const { 156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1590f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const { 160a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 161a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 162a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1630f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getRefreshRate() const { 164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mRefreshRate; 165a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 166a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 168a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1696163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1706163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 172a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 177a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1790f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 181a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1826163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::getInfo(DisplayInfo* info) const { 184c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->w = getWidth(); 185c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->h = getHeight(); 186c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->xdpi = getDpiX(); 187c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->ydpi = getDpiY(); 188c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->fps = getRefreshRate(); 189c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->density = getDensity(); 190c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian info->orientation = getOrientation(); 191c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian // TODO: this needs to go away (currently needed only by webkit) 192c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian getPixelFormatInfo(getFormat(), &info->pixelFormatInfo); 193c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return NO_ERROR; 194c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian} 195c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 1960f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 198a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 199a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 200a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int concreteType; 201a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian window->query(window, NATIVE_WINDOW_CONCRETE_TYPE, &concreteType); 202a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (concreteType == NATIVE_WINDOW_FRAMEBUFFER) { 203a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface = static_cast<FramebufferSurface *>(mNativeWindow.get()); 2041f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian } 2051f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 2066163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 2076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 208a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 209a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 210a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 211a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = mFramebufferSurface->getRefreshRate(); 212a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } else { 213a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshRate = 60; 214b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 215a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mRefreshPeriod = nsecs_t(1e9 / mRefreshRate); 216385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 217a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 218a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 219b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 220b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 221b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 222b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 223b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 224b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 225b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 226b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 227b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 228b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 229b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 230b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 231b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 232b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 233b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 234b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 235b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 236b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 237b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 238b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 239b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 240b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 241b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 242b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 243b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 244b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 245b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 246b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 247b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 248a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 249a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 250b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 251385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 2521f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 253a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 255a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 2561b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 2571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 259a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 260a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface->isUpdateOnDemand()) { 261a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFlags |= PARTIAL_UPDATES; 262a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // if we have partial updates, we definitely don't need to 263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // preserve the backbuffer, which may be costly. 264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglSurfaceAttrib(display, surface, 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); 266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2670928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian } 2680928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian 2691f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 2701f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 271a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 2721f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 2731f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 27498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 2750f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault); 276a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 277a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 2780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 279076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2820f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopiannsecs_t DisplayDevice::getRefreshPeriod() const { 28382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return mRefreshPeriod; 28482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 28582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2860f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 287a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 288a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 289a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 290a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 29174faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2930f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3005e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 302b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 303b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 3075e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 3085e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 30995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian if (mFlags & PARTIAL_UPDATES) { 310a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 311a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->setUpdateRectangle(dirty.getBounds()); 312a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 3131e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 3141e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 3241d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 325a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 326a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 327a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 3281d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::makeCurrent(const DisplayDevice& hw, EGLContext ctx) { 33152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 33252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian if (sur != hw.mSurface) { 33352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 33452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian eglMakeCurrent(dpy, hw.mSurface, hw.mSurface, ctx); 33552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 33652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 33752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 3413b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3423b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 3433b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3443b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 3453b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3473b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3483b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3500f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const { 3513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3533b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3540f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3563b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3573b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3583b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 359d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 360d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 361d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 362d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 363d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 364d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 365d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 366d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 367d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 368d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 369d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 370d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 371d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 372d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 373d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 374d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 375d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 376d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientationDefault: 3841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation90: 3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation180: 3901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation270: 3931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 4020f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) { 40398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 40498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 4051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 4060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::orientationToTransfrom( 40798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 4081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian if (orientation & ISurfaceComposer::eOrientationSwapMask) { 40998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 41098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 41198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 4121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 41492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian dirtyRegion.set(bounds()); 4151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 417