DisplayDevice.cpp revision ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0a
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 30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.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 3899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.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" 4513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.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, 73ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 74dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 7699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 77a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 7892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 79ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mType(type), mHwcDisplayId(hwcId), 8027e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 8199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 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), 9101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 92da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation() 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mNativeWindow = new Surface(mDisplaySurface->getIGraphicBufferProducer()); 95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 96a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 976163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 986163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 99b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 102b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 103385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 1081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 1091b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1111f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1121f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1141f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 115da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 116da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 118ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 119ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mScreenAcquired = (mType >= DisplayDevice::DISPLAY_VIRTUAL); 1205f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1288dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1298dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1308dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1318dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1328dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1338dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1348dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 13598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 13600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 137a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 138a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 140ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 144ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 145ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 146ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 147ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 148ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const { 159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFormat; 160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1669e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1679e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1689e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1709e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1719e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1730f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 174076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1770f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 17899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return mDisplaySurface->compositionComplete(); 17974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1810f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18801e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle 189df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 190b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 191b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 19401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 1955e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 196d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 20199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // We need to call eglSwapBuffers() unless: 20299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // (a) there was no GLES composition this frame, or 20399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // (b) we're using a legacy HWC with no framebuffer target support (in 20499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // which case HWComposer::commit() handles things). 20599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (hwc.initCheck() != NO_ERROR || 20699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall (hwc.hasGlesComposition(mHwcDisplayId) && 20799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall hwc.supportsFramebufferTarget())) { 20899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 20999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 21099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 21199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 21299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 21399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 21499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 21599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 21699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 21799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 218da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 219da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 220da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 22152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 22299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 22399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 22499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 22599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 22632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 227da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 229da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 230da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 231851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall mDisplaySurface->onFrameCommitted(); 232da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 233da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 234da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2350f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 240da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, 241da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const sp<const DisplayDevice>& hw, EGLContext ctx) { 242da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 24352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 2444297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (sur != hw->mSurface) { 245da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian result = eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx); 246da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 247bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian setViewportAndProjection(hw); 248da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 24952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 250da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 25152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 25252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 253bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopianvoid DisplayDevice::setViewportAndProjection(const sp<const DisplayDevice>& hw) { 254bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian GLsizei w = hw->mDisplayWidth; 255bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian GLsizei h = hw->mDisplayHeight; 256bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glViewport(0, 0, w, h); 257bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glMatrixMode(GL_PROJECTION); 258bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glLoadIdentity(); 259bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian // put the origin in the left-bottom corner 260bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian glOrthof(0, w, 0, h, 0, 1); // l=0, r=w ; b=0, t=h 261135e5899f70a67e62baaf6dbec7ba2ce611ca16aMathias Agopian glMatrixMode(GL_MODELVIEW); 262bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 263bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 26613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2673b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 268ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2693b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2703b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 27113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer(layers[i]); 272f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (layer->isSecure()) { 2733b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2743b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2753b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 27813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2820f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 286cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 287cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 288cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 289cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 290cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 291da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 292cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 293cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 294cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 295cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 296cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 297cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 299d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 300d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 301d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 315d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 316d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3173b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 31828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 31928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 32028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 32128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 32228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 32328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 32428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 3250f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3271b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3303165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3333165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3363165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3393165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 34900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 350f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 351f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 352f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 353da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 354f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 355f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 356da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 357f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 358f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 3591b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 360f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 361f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 362f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 363f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 364f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 3656360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 366f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 367f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 368f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 369f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 370f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 371f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 372f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 373f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 374f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 375f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 376766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 3771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 378f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 379f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 380f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 381f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 382f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 383f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 384f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 385f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 386f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 387f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 388f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 394f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 406f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor.set(getBounds()); 411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4171d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4181d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopianvoid DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const { 4191d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 4201d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian snprintf(buffer, SIZE, 4211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 4221d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian " type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 423dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n" 424766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4251d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 426d56eff2f49e64bb71863ffb866af8c3f686b96e9Mathias Agopian mDisplayName.string(), mType, 4271d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 4281d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 429dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(), 4301d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4311d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 432766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 4331d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 4341d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 4351d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 4361d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian result.append(buffer); 4381d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 43999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 44099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface->dump(surfaceDump); 44199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 4421d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 443