DisplayDevice.cpp revision 766dc49c17dda977bf7b93a5fd8da41c0b737611
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, 72dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 74dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<ANativeWindow>& nativeWindow, 761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis const sp<FramebufferSurface>& framebufferSurface, 77a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 7892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 793ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mType(type), mHwcDisplayId(-1), 801a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mNativeWindow(nativeWindow), 811a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFramebufferSurface(framebufferSurface), 8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 88dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 8992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 91da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mLayerStack(0), 92da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation() 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 94a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian init(config); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 970f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() { 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (mSurface != EGL_NO_SURFACE) { 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian eglDestroySurface(mDisplay, mSurface); 10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface = EGL_NO_SURFACE; 10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian} 10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 10492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const { 10592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mFlinger != NULL; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const { 109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayWidth; 1106163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian} 1116163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1120f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const { 113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mDisplayHeight; 114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1160f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const { 117a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFormat; 118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 119a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const { 121a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mSurface; 122a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 1236163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian 1240f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config) 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 126a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 1286163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 1296163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 130b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 133b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 134385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1351f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 138a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 1391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 1401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 144a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 146da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 147da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 1495f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // external displays are always considered enabled 1503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mScreenAcquired = (mType >= DisplayDevice::NUM_DISPLAY_TYPES); 1513ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian 1523ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian // get an h/w composer ID 1533ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType); 1545f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1668dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1678dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1688dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 16998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 17000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 171a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 172a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1769e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1779e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1789e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1799e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 181076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 185a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (mFramebufferSurface == NULL) { 186a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 188a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mFramebufferSurface->compositionComplete(); 18974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1910f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1985e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 200b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 201b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2055e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 206d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 210da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 21152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian EGLBoolean success = EGL_TRUE; 212da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() != NO_ERROR) { 213da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian // no HWC, we call eglSwapBuffers() 21452e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian success = eglSwapBuffers(mDisplay, mSurface); 215da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } else { 216d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // We have a valid HWC, but not all displays can use it, in particular 217d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // the virtual displays are on their own. 218d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // TODO: HWC 1.2 will allow virtual displays 219d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian if (mType >= DisplayDevice::DISPLAY_VIRTUAL) { 220d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // always call eglSwapBuffers() for virtual displays 22152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian success = eglSwapBuffers(mDisplay, mSurface); 222d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian } else if (hwc.supportsFramebufferTarget()) { 223d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // as of hwc 1.1 we always call eglSwapBuffers if we have some 224d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // GLES layers 225d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian if (hwc.hasGlesComposition(mType)) { 22652e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian success = eglSwapBuffers(mDisplay, mSurface); 227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 228d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian } else { 229d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // HWC doesn't have the framebuffer target, we don't call 230d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian // eglSwapBuffers(), since this is handled by HWComposer::commit(). 231da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 232da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 23352e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 23432341381c9493d7953e40f7f79653cfc52868863Mathias Agopian if (!success) { 23532341381c9493d7953e40f7f79653cfc52868863Mathias Agopian EGLint error = eglGetError(); 23632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian if (error == EGL_CONTEXT_LOST || 23732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian mType == DisplayDevice::DISPLAY_PRIMARY) { 23832341381c9493d7953e40f7f79653cfc52868863Mathias Agopian LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 239b8fc00bfb41a61aeda186eec8f14522ff32f23f8Mathias Agopian mDisplay, mSurface, error); 24032341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 24132341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 242da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 243da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 244da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 245da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 246da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.supportsFramebufferTarget()) { 247da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian int fd = hwc.getAndResetReleaseFenceFd(mType); 248da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian mFramebufferSurface->setReleaseFenceFd(fd); 249da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 251da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 252da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2530f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 258da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, 259da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const sp<const DisplayDevice>& hw, EGLContext ctx) { 260da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 26152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2624297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 263da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 264da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 265bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian setViewportAndProjection(hw); 266da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 26752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 268da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 26952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 27052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 271bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopianvoid DisplayDevice::setViewportAndProjection(const sp<const DisplayDevice>& hw) { 272bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian GLsizei w = hw->mDisplayWidth; 273bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian GLsizei h = hw->mDisplayHeight; 274bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glViewport(0, 0, w, h); 275bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glMatrixMode(GL_PROJECTION); 276bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glLoadIdentity(); 277bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian // put the origin in the left-bottom corner 278bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h 279135e5899f70a67e62baaf6dbec7ba2ce611ca16aMathias Agopian glMatrixMode(GL_MODELVIEW); 280bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 281bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 2840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) { 2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 286ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2873b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2883b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (layers[i]->isSecure()) { 2903b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2913b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2923b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2933b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2953ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianconst Vector< sp<LayerBase> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2990f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 303cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 304cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 305cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 306cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 307cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 308da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 309cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 310cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 311cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 312cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 313cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 314cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 316d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 317d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 318d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 319d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 320d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 321d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 322d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 323d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 324d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 325d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 326d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 327d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 330d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 331d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 33528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 33628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 33728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 33828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 33928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 34028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 34128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 3420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3473165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3503165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3533165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3563165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 36600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 36700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& viewport, const Rect& frame) { 368da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation = orientation; 36900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mViewport = viewport; 37000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian mFrame = frame; 371da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian updateGeometryTransform(); 372da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian} 373da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 374da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid DisplayDevice::updateGeometryTransform() { 37598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int w = mDisplayWidth; 37698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian int h = mDisplayHeight; 3776e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown Transform TL, TP, R, S; 378da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (DisplayDevice::orientationToTransfrom( 379da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation, w, h, &R) == NO_ERROR) { 380da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian dirtyRegion.set(bounds()); 381da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 382da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect viewport(mViewport); 383da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian Rect frame(mFrame); 384da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 385da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (!frame.isValid()) { 386da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // the destination frame can be invalid if it has never been set, 387da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // in that case we assume the whole display frame. 388da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian frame = Rect(w, h); 389da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 390da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 391da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (viewport.isEmpty()) { 392da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport can be invalid if it has never been set, in that case 393da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // we assume the whole display size. 394da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // it's also invalid to have an empty viewport, so we handle that 395da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // case in the same way. 396da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian viewport = Rect(w, h); 397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (R.getOrientation() & Transform::ROT_90) { 398da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // viewport is always specified in the logical orientation 399da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian // of the display (ie: post-rotation). 400da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian swap(viewport.right, viewport.bottom); 401da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 402da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 4031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 404da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_width = viewport.width(); 405da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_height = viewport.height(); 406da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_width = frame.width(); 407da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_height = frame.height(); 4086360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall if (src_width != dst_width || src_height != dst_height) { 409da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sx = dst_width / src_width; 410da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float sy = dst_height / src_height; 411da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian S.set(sx, 0, 0, sy); 412da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 4136360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 414da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_x = viewport.left; 415da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float src_y = viewport.top; 416da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_x = frame.left; 417da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian float dst_y = frame.top; 4186e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TL.set(-src_x, -src_y); 4196e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown TP.set(dst_x, dst_y); 4206e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown 4216e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // The viewport and frame are both in the logical orientation. 4226e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // Apply the logical translation, scale to physical size, apply the 4236e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown // physical translation and finally rotate to the physical orientation. 4246e220a6ce6971555b883f4852c6e5d4c7a617815Jeff Brown mGlobalTransform = R * TP * S * TL; 425eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian 426eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const uint8_t type = mGlobalTransform.getType(); 427eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 428eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian (type >= Transform::SCALE)); 429766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian 430766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor = mGlobalTransform.transform(mViewport); 431766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian if (mScissor.isEmpty()) { 432766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.set(getBounds()); 433766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4361d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const { 4381d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 4391d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian snprintf(buffer, SIZE, 4401d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 4411d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian " type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 442dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n" 443766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4441d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 445d56eff2f49e64bb71863ffb866af8c3f686b96e9Mathias Agopian mDisplayName.string(), mType, 4461d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 4471d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 448dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(), 4491d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4501d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 451766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 4521d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 4531d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 4541d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 4551d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4561d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian result.append(buffer); 4571d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4581d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian String8 fbtargetDump; 4591d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian if (mFramebufferSurface != NULL) { 4601d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFramebufferSurface->dump(fbtargetDump); 4611d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian result.append(fbtargetDump); 4621d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian } 4631d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 464