DisplayDevice.cpp revision 38efe86d9459cf5c96a24a34cc5cbf31fdba7e19
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 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h" 351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 36875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 371b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 38da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 390f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 40c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 4113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h" 421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 43a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 45a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 520f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 54dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 55ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 56dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 57dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 5899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 59a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 6092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 61ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mType(type), mHwcDisplayId(hwcId), 6227e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 6399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 6492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 6592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 6692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mContext(EGL_NO_CONTEXT), 6792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 6892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 6992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 70dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 7192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 7292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mScreenAcquired(false), 7301e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 74da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mOrientation() 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mNativeWindow = new Surface(mDisplaySurface->getIGraphicBufferProducer()); 77a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 78a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 796163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian int format; 806163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian window->query(window, NATIVE_WINDOW_FORMAT, &format); 81b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian 82a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 83a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 84b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 85385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 861f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 87a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 89a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 901b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 931f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 941f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 95a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 961f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 97da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 98da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 991f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 100ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 101ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mScreenAcquired = (mType >= DisplayDevice::DISPLAY_VIRTUAL); 1025f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1038dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1048dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1058dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1068dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1078dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1088dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1098dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1108dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1118dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1128dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1138dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1148dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1158dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1168dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 11798a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 11800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 119a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 120a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 121ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 122ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 123ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 124ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 125ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 126ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 127ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 12802d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 12902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 13002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 13102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= DISPLAY_VIRTUAL) 13202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.freeDisplayId(mHwcDisplayId); 13302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 13402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 13502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 13602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 140ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 143ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 144ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 145ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 146ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 147ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 148ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const { 150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFormat; 151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1579e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1589e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1599e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1609e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1619e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1629e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1639e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1640f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 165076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1680f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 16999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return mDisplaySurface->compositionComplete(); 17074faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1720f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 174875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17901e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle 180df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 181b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 182b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 183df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 184df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 18501e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 1865e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 187d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 188076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const { 19238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall DisplaySurface::CompositionType compositionType; 19338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveGles = hwc.hasGlesComposition(mHwcDisplayId); 19438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId); 19538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (haveGles && haveHwc) { 19638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_MIXED; 19738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveGles) { 19838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_GLES; 19938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveHwc) { 20038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 20138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 20238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Nothing to do -- when turning the screen off we get a frame like 20338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // this. Call it a HWC frame since we won't be doing any GLES work but 20438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will do a prepare/set cycle. 20538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 20638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mDisplaySurface->prepareFrame(compositionType); 20838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 210da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 21199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // We need to call eglSwapBuffers() unless: 21299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // (a) there was no GLES composition this frame, or 21399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // (b) we're using a legacy HWC with no framebuffer target support (in 21499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // which case HWComposer::commit() handles things). 21599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (hwc.initCheck() != NO_ERROR || 21699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall (hwc.hasGlesComposition(mHwcDisplayId) && 21799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall hwc.supportsFramebufferTarget())) { 21899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 21999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 22099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 22199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 22299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 22399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 22499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 22599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 22699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 22799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 229da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 230da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 23152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 23299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 23399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 23499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 23599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 23632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 237da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 238da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 239da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 240da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 241851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall mDisplaySurface->onFrameCommitted(); 242da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 243da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 244da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 250875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { 251da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 25252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 253875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 254875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); 255da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 256875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian setViewportAndProjection(); 257da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 25852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 259da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 26052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 26152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 262875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 263875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 264875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 265875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().setViewportAndProjection(w, h); 266bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 267bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 27013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2713b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 272ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2733b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2743b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 27513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer(layers[i]); 276f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (layer->isSecure()) { 2773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 2783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 2803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 28213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2843b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2853b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 2860f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 2873b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 2883b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 290cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 291cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 292cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 293cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 294cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 295da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 296cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 297cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 298cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 299cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 300cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 301cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 303d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 304d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const { 305d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 306d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 307d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 308d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const { 309d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = false; 310d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 312d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const { 313d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mScreenAcquired = true; 314d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 315d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 316d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const { 317d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian return mScreenAcquired; 318d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 319d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 320d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 32228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 32328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 32428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 32528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 32628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 32728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 32828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 3290f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3343165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3403165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3433165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 35300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 354f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 355f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 356f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 357da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 358f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 359f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 360da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 361f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 362f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 3631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 364f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 365f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 366f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 367f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 368f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 3696360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 370f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 371f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 372f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 373f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 374f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 375f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 376f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 377f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 378f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 379f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 380766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 382f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 383f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 384f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 385f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 386f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 387f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 388f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 389f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 390f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 394f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 397f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 400f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 406f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4146c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 417f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 418f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4211d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 42274d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 4231d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 42474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 4251d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 42602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall " type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 427dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis "flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n" 428766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4291d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 43002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mDisplayName.string(), mType, mHwcDisplayId, 4311d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 4321d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 433dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(), 4341d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4351d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 436766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 4371d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 4381d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 4391d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 4401d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 44199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 44299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface->dump(surfaceDump); 44399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 4441d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 445