DisplayDevice.cpp revision da27af9832a0170f1fc40ef3f21371c4d30d21b3
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 41da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 44c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 45921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h" 461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 47a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 49a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian do { 55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // there could be more than one error flag 56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian GLenum error = glGetError(); 57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian if (error == GL_NO_ERROR) 58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian break; 59e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GL error 0x%04x", int(error)); 60cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } while(true); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 64a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 700f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 723ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DisplayType type, const wp<IBinder>& displayToken, 731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<ANativeWindow>& nativeWindow, 741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<FramebufferSurface>& framebufferSurface, 75a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 773ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mType(type), mHwcDisplayId(-1), 781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mNativeWindow(nativeWindow), 791a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFramebufferSurface(framebufferSurface), 8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 88da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mLayerStack(0), 89da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation() 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 91a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 940f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 9592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1050f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1086163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 116a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1206163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1210f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 124a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1256163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1266163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 127b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 130b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 131385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1321f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 133a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 1361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 1371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 141a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 143da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 144da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 1465f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // external displays are always considered enabled 1473ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mScreenAcquired = (mType >= DisplayDevice::NUM_DISPLAY_TYPES); 1483ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian 1493ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian // get an h/w composer ID 1503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType); 1515f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 15298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 15300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 154a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 155a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1560f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 161a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 162a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 163a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 164a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 16574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1670f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1745e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 175df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 176b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 177b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 178df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 179df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1815e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 1825e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 183076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 187da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() != NO_ERROR) { 188da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // no HWC, we call eglSwapBuffers() 189da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian eglSwapBuffers(mDisplay, mSurface); 190da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } else { 191da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.hasGlesComposition(mType)) { 192da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.supportsFramebufferTarget() || 193da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian mType >= DisplayDevice::DISPLAY_VIRTUAL) { 194da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // as of hwc 1.1 we always call eglSwapBuffers, however, 195da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // on older versions of HWC, we need to call it only on 196da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // virtual displays 197da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian eglSwapBuffers(mDisplay, mSurface); 198da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 199da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 200da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 201da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 202da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 203da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 204da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 205da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.supportsFramebufferTarget()) { 206da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian int fd = hwc.getAndResetReleaseFenceFd(mType); 207da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian mFramebufferSurface->setReleaseFenceFd(fd); 208da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 209da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 210da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 211da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2120f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const 2181d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{ 219a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface != NULL) { 220a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFramebufferSurface->dump(res); 221a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 2221d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 2231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 224da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, 225da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const sp<const DisplayDevice>& hw, EGLContext ctx) { 226da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 22752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2284297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 229da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 230da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 231da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian GLsizei w = hw->mDisplayWidth; 232da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian GLsizei h = hw->mDisplayHeight; 233da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glViewport(0, 0, w, h); 234da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glMatrixMode(GL_PROJECTION); 235da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glLoadIdentity(); 236da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // put the origin in the left-bottom corner 237da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h 238da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 23952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 240da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 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 2563ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianconst Vector< 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 264cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 265cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 266cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 267cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 268cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 269da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 270cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 271cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 272cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 273cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 274cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 275cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 277d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 278d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 279d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 280d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 281d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 282d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 283d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 284d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 285d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 286d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 287d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 288d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 289d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 290d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 291d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 292d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 293d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 294d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 29628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 29728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 29828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 29928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 30028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 30128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 30228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 3030f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3083165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3101b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3113165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3131b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3143165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3173165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 32700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 32800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& viewport, const Rect& frame) { 329da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation = orientation; 33000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mViewport = viewport; 33100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mFrame = frame; 332da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian updateGeometryTransform(); 333da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian} 334da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 335da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid DisplayDevice::updateGeometryTransform() { 33698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 33798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3386e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown Transform TL, TP, R, S; 339da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (DisplayDevice::orientationToTransfrom( 340da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation, w, h, &R) == NO_ERROR) { 341da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian dirtyRegion.set(bounds()); 342da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 343da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect viewport(mViewport); 344da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect frame(mFrame); 345da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 346da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (!frame.isValid()) { 347da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // the destination frame can be invalid if it has never been set, 348da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // in that case we assume the whole display frame. 349da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian frame = Rect(w, h); 350da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 351da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 352da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (viewport.isEmpty()) { 353da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport can be invalid if it has never been set, in that case 354da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // we assume the whole display size. 355da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // it's also invalid to have an empty viewport, so we handle that 356da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // case in the same way. 357da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian viewport = Rect(w, h); 358da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (R.getOrientation() & Transform::ROT_90) { 359da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport is always specified in the logical orientation 360da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // of the display (ie: post-rotation). 361da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian swap(viewport.right, viewport.bottom); 362da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 363da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 365da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_width = viewport.width(); 366da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_height = viewport.height(); 367da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_width = frame.width(); 368da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_height = frame.height(); 3696360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall if (src_width != dst_width || src_height != dst_height) { 370da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sx = dst_width / src_width; 371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sy = dst_height / src_height; 372da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian S.set(sx, 0, 0, sy); 373da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 3746360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 375da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_x = viewport.left; 376da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_y = viewport.top; 377da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_x = frame.left; 378da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_y = frame.top; 3796e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TL.set(-src_x, -src_y); 3806e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TP.set(dst_x, dst_y); 3816e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown 3826e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // The viewport and frame are both in the logical orientation. 3836e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // Apply the logical translation, scale to physical size, apply the 3846e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // physical translation and finally rotate to the physical orientation. 3856e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown mGlobalTransform = R * TP * S * TL; 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 388