DisplayDevice.cpp revision ef7b9c7eac036cc1230c64821039d18f8cbd2c1c
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 301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/SurfaceTextureClient.h> 311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 410f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 43c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 44921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h" 451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 46a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 48a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian do { 54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // there could be more than one error flag 55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian GLenum error = glGetError(); 56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error == GL_NO_ERROR) 57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian break; 58e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GL error 0x%04x", int(error)); 59cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } while(true); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 71a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<ANativeWindow>& nativeWindow, 731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<FramebufferSurface>& framebufferSurface, 74a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 7592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mId(display), 771a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mNativeWindow(nativeWindow), 781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFramebufferSurface(framebufferSurface), 7992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDpiX(), mDpiY(), 8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDensity(), 8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 8892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 8992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mOrientation(), 9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mLayerStack(0) 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 92a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 950f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1060f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const { 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1083d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1100f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const { 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1140f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const { 115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 117a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1180f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1206163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1216163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1220f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1336163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1340f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 137a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1386163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1396163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 142a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 143a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 144b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 145b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 146b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 147b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 148b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 149b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 150b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 151b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 152b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 153b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 154b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 155b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 156b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 157b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 158b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 159b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 160b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 161b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 162b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 163b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 164b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 165b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 166b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 167b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 168b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 169b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 170b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 171b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 172b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 175b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 176385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1771f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 178a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 180a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 1811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 1821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1841f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1851f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1871f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 1881f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 18998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 1903165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian DisplayDevice::setOrientation(DisplayState::eOrientationDefault); 191a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 192a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1930f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1970f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 198a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 199a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 200a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 201a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 20274faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2040f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2115e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 213b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 214b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 215df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 216df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2185e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 2195e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 2291d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 230a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2331d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 2341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2354297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid DisplayDevice::makeCurrent(const sp<const DisplayDevice>& hw, EGLContext ctx) { 23652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2374297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 23852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 2394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 24052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 24152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 24252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 2431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 2463b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 247ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2483b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2503b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 2513b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2533b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2543b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2553b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const { 2573b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2583b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2593b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 2613b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 2623b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2633b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2643b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 265d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 266d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 267d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 268d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 269d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 270d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 271d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 272d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 273d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 274d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 275d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 276d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 277d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 278d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 279d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 280d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 281d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 282d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 28428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 28528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 28628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 28728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 28828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 28928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 29028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 2910f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 2921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 2931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 2941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 2951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 2963165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 2971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 2981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 2993165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3023165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3053165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3101b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3111b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3150f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) { 31698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 31798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3190f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::orientationToTransfrom( 32098a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 3213165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian if (orientation & DisplayState::eOrientationSwapMask) { 32298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 32398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 32498a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 32792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian dirtyRegion.set(bounds()); 3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 330