DisplayDevice.cpp revision 2c9b11f0291210c9b9513a1a0cce6afebd361b3b
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, 5619e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall int format, 57dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 58dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 5999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 60db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 61a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 6292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian : mFlinger(flinger), 63ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mType(type), mHwcDisplayId(hwcId), 6427e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 6599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 6692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 6792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 6892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 6992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 7092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 71dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 7292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 7301e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 752c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode(HWC_POWER_MODE_OFF) 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7783cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall mNativeWindow = new Surface(producer, false); 78a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 79a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 80a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 81a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 82b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 83385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 841f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian EGLSurface surface; 85a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint w, h; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 8719e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 8819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall config = RenderEngine::chooseEglConfig(display, format); 8919e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 90a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 944ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 954ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 964ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 974ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 984ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 994ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1004ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1014ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1024ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1034ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 1041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1051f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 106a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1071f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 108da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 109da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 111ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1132c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1145f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1158dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1168dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1178dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1188dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1198dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1208dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1288dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 12998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 13000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 131a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 132a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 133ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 134ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 135ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 136ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 14002d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 14102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 14202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 14302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= DISPLAY_VIRTUAL) 14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.freeDisplayId(mHwcDisplayId); 14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 149ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 151ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const { 162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFormat; 163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 168ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1699e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1709e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1719e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1760f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 18199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return mDisplaySurface->compositionComplete(); 18274faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 186875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle 192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 193b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 194b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 19701e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 198c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza#else 199c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza (void) dirty; // Eliminate unused parameter warning 2005e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 201d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2057143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2067143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 207028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 208028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 20938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const { 21038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall DisplaySurface::CompositionType compositionType; 21138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveGles = hwc.hasGlesComposition(mHwcDisplayId); 21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId); 21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (haveGles && haveHwc) { 21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_MIXED; 21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveGles) { 21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_GLES; 21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveHwc) { 21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Nothing to do -- when turning the screen off we get a frame like 22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // this. Call it a HWC frame since we won't be doing any GLES work but 22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will do a prepare/set cycle. 22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mDisplaySurface->prepareFrame(compositionType); 22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 22738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 228da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 22922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // We need to call eglSwapBuffers() if: 23022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (1) we don't have a hardware composer, or 23122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (2) we did GLES composition this frame, and either 23222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (a) we have framebuffer target support (not present on legacy 23322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // devices, where HWComposer::commit() handles things); or 23422a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (b) this is a virtual display 23599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (hwc.initCheck() != NO_ERROR || 23699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall (hwc.hasGlesComposition(mHwcDisplayId) && 23722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) { 23899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 23999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 24099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 24499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 24599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 24699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 24799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 248da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 249da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 25152e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 25299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 25399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 25499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 25599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 25632341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 257da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 258da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 259da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 260da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 261851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall mDisplaySurface->onFrameCommitted(); 262da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 263da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 264da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2650f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 270875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { 271da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 27252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 273875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 274875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); 275da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 276f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 277f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall eglSwapInterval(dpy, 0); 278da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 27952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 280931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 281da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 28252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 28352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 284875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 285875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 286875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 287c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 288c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, false); 289bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 290bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 295ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 2973b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer(layers[i]); 299f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (layer->isSecure()) { 3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3023b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3033b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 3063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3090f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3113b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3123b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 313cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 314cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 315cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 316cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 317cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 318da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 321cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 322cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 323cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 324cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3253b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 3272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 3312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3342c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 3352c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 336d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 338d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3393b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 34028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 34128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 34228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 34328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 34428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 34528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 34628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 347c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 348c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 349c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 350c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 351c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 352c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 353c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 354c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 355c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 356c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 357c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 358c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 359c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 360c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 361c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 362c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 363c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 364c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 365c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 3660f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3713165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3743165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3773165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 39000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 391f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 392f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 393f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 394da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 395f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 396f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 397da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 398f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 399f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 401f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 402f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 403f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 404f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 405f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 4066360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 407f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 408f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 409f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 410f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 411f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 412f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 413f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 414f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 415f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 416f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 417766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 419f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 420f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 421f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 422f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 423f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 424f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 428f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 434f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 440f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4516c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 454f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 455f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 456f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4581d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 45974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 4601d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 46174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 4621d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 46302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall " type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 4642c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani "flips=%u, isSecure=%d, secureVis=%d, powerMode=%d, numLayers=%zu\n" 465766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 4661d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 46702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mDisplayName.string(), mType, mHwcDisplayId, 4681d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 4691d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 4702c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mIsSecure, mSecureLayerVisible, mPowerMode, mVisibleLayersSortedByZ.size(), 4711d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 4721d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 473766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 4741d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 4751d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 4761d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 4771d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 47899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 47999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface->dump(surfaceDump); 48099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 4811d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 482