DisplayDevice.cpp revision 1a4d883dcc1725892bfb5c28dec255a233186524
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 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token) 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 65870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian struct EGLUtils { 66870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian static const char *strerror(EGLint err) { 67870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian switch (err){ 68870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_SUCCESS: return "EGL_SUCCESS"; 69870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 70870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 71870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 72870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 73870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 74870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 75870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 76870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 77870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 78870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 80870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 81870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 82870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 83870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian default: return "UNKNOWN"; 84870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 85870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian } 86870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian }; 87870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 89cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error && error != EGL_SUCCESS) { 90e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: EGL error 0x%04x (%s)", 910928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian token, int(error), EGLUtils::strerror(error)); 92cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 96a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1020f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int display, 1051a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<ANativeWindow>& nativeWindow, 1061a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<FramebufferSurface>& framebufferSurface, 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 10892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 10992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mId(display), 1101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mNativeWindow(nativeWindow), 1111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFramebufferSurface(framebufferSurface), 11292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 11392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 11492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 11592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDpiX(), mDpiY(), 11692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDensity(), 11792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 11892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 11992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 12092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 12192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 12292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mOrientation(), 12392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mLayerStack(0) 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 125a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1280f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 12992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 13092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 13192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 13292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 13392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 13492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 13592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 13692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiX() const { 140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiX; 1413d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian} 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1430f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDpiY() const { 144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDpiY; 145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1470f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianfloat DisplayDevice::getDensity() const { 148a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDensity; 149a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 150a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1510f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 152a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1536163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1546163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1590f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 160a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 161a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 162a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1630f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 165a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1666163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 169a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 170a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1716163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1726163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 173a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiX = window->xdpi; 174a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mDpiY = window->ydpi; 175a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 176a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 177b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian class Density { 178b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getDensityFromProperty(char const* propName) { 179b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian char property[PROPERTY_VALUE_MAX]; 180b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian int density = 0; 181b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (property_get(propName, property, NULL) > 0) { 182b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian density = atoi(property); 183b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 184b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return density; 185b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 186b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian public: 187b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getEmuDensity() { 188b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 189b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian static int getBuildDensity() { 190b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 191b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian }; 192b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // The density of the device is provided by a build property 193b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = Density::getBuildDensity() / 160.0f; 194b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (mDensity == 0) { 195b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // the build doesn't provide a density -- this is wrong! 196b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // use xdpi instead 197b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 198b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity = mDpiX / 160.0f; 199b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 200b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian if (Density::getEmuDensity()) { 201b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 202b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDpiX = mDpiY = mDensity = Density::getEmuDensity(); 203b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian mDensity /= 160.0f; 204b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian } 205b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 206a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 207a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 208b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 209385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 2101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 211a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 213a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 2141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 2151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 2181f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 219a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 2201f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 2211f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 22298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 2230f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::setOrientation(ISurfaceComposer::eOrientationDefault); 224a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 225a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 2260f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 227076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 231a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 232a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 233a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 234a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 23574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2445e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 246b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 247b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2515e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 2525e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 2621d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2661d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 2671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2684297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid DisplayDevice::makeCurrent(const sp<const DisplayDevice>& hw, EGLContext ctx) { 26952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2704297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 27152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLDisplay dpy = eglGetCurrentDisplay(); 2724297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 27352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 27452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 27552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 2761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2780f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 2803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2873b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2880f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const { 2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2920f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 2933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 297d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 298d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 299d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 300d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 301d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3160f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientationDefault: 3221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation90: 3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation180: 3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian case ISurfaceComposer::eOrientation270: 3311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3400f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) { 34198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 34298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 3440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian DisplayDevice::orientationToTransfrom( 34598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian orientation, w, h, &mGlobalTransform); 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian if (orientation & ISurfaceComposer::eOrientationSwapMask) { 34798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int tmp = w; 34898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian w = h; 34998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian h = tmp; 3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian mOrientation = orientation; 35292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian dirtyRegion.set(bounds()); 3531b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 355