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) 62b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 63b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 64ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mType(type), mHwcDisplayId(hwcId), 6527e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 6699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 6792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 6892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 6992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplayWidth(), mDisplayHeight(), mFormat(), 7092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 7192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 72dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 7392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSecureLayerVisible(false), 7401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 752c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 766c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 776c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig(0) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7983cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall mNativeWindow = new Surface(producer, false); 80a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 81a49126087b4494f4ef50873f3a3f6727265f6621Mathias 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); 8919e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 9019e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall config = RenderEngine::chooseEglConfig(display, format); 9119e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 92a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian surface = eglCreateWindowSurface(display, config, window, NULL); 931b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_WIDTH, &mDisplayWidth); 941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 964ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 974ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 984ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 994ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1004ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1014ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1024ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1034ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1044ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1054ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 10647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mConfig = config; 1071f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1081f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mSurface = surface; 109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mFormat = format; 1101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 111da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 112da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1131f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 114ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1152c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1162c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1175f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1188dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1198dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1208dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1218dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1228dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1238dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1248dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1258dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1268dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1278dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1288dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1298dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1308dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1318dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 13298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 13300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 134a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 135a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 136ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 138ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 139ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 140ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 141ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 142ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 14302d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 14402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 14502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 14602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= DISPLAY_VIRTUAL) 14702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.freeDisplayId(mHwcDisplayId); 14802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 14902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 15002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 15102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 152ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 153ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 154ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 155ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 156ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 157ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 158ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 159ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 160ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 161ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 162ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const { 165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFormat; 166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 168ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 169ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 170ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 171ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1729e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1739e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1749e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1759e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1769e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1779e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1789e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 1790f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 180076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 18499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return mDisplaySurface->compositionComplete(); 18574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1870f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 189875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19401e29054e672301e4adbbca15b3562a59a20f267Jesse Hall#ifdef EGL_ANDROID_swap_rectangle 195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 196b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Region newDirty(dirty.intersect(bounds())); 197b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian const Rect b(newDirty.getBounds()); 198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 20001e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 201c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza#else 202c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza (void) dirty; // Eliminate unused parameter warning 2035e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 204d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2087143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2097143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 210028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 211028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const { 21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall DisplaySurface::CompositionType compositionType; 21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveGles = hwc.hasGlesComposition(mHwcDisplayId); 21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId); 21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (haveGles && haveHwc) { 21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_MIXED; 21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveGles) { 21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_GLES; 22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveHwc) { 22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Nothing to do -- when turning the screen off we get a frame like 22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // this. Call it a HWC frame since we won't be doing any GLES work but 22538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will do a prepare/set cycle. 22638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 22738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 22838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mDisplaySurface->prepareFrame(compositionType); 22938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 23038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 231da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 23222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // We need to call eglSwapBuffers() if: 23322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (1) we don't have a hardware composer, or 23422a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (2) we did GLES composition this frame, and either 23522a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (a) we have framebuffer target support (not present on legacy 23622a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // devices, where HWComposer::commit() handles things); or 23722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (b) this is a virtual display 23899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (hwc.initCheck() != NO_ERROR || 23999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall (hwc.hasGlesComposition(mHwcDisplayId) && 24022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) { 24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 24499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 24599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 24699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 24799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 24899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 24999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 25099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 251da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 252da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 253da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 25452e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 25599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 25699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 25799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 25899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 25932341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 260da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 261da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 262da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 263da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 264851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall mDisplaySurface->onFrameCommitted(); 265da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 266da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 267da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2680f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 273875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { 274da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 27552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 276875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 277875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); 278da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 279f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 280f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall eglSwapInterval(dpy, 0); 281da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 28252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 283931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 284da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 28552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 28652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 287875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 288875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 289875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 290c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 291c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 292c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 293bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 294bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 299ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian mSecureLayerVisible = false; 3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian size_t count = layers.size(); 3013b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian for (size_t i=0 ; i<count ; i++) { 30213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer(layers[i]); 303f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (layer->isSecure()) { 3043b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mSecureLayerVisible = true; 3053b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 3073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 3103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3113b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3123b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 3130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const { 3143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mSecureLayerVisible; 3153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 317cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 318cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 321cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 322da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 323cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 324cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 325cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 326cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 327cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 328cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3293b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 3312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3342c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 3352c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 336d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 337d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3382c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 3392c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 340d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 341d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 342d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3436c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 3446c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 3456c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3466c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3476c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 3486c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 3496c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3506c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3516c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 3523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 35328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 35428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 35528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 35628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 35728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 35828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 35928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 360c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 361c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 362c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 363c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 364c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 365c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 366c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 367c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 368c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 369c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 370c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 371c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 372c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 373c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 374c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 375c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 376c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 377c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 378c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 3790f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3843165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3873165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3903165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3933165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 3941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 3971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 3991b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 40347e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 40447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 40547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 406f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 407f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 408f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 409f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 410f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 41147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 41247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 41347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 41447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 41547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 41647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 41747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 41847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 41947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 42047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 42147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 42247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 42347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 42400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 425f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 426f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 427f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 428da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 429f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 430f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 431da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 4341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 437f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 4406360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 446f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 451766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 454f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 455f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 456f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 457f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 458f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 459f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 460f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 462f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 463f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 464f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 465f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 466f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 467f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 468f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 469f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 470f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 471f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 472f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 473f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 474f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 475f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 476f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 477f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 478f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 479f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 480f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 481f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 482f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 483f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 484f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4856c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 486f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 487f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 488f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 489f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 490f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 4911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4921d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 49374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 4941d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 49574d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 4961d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 49702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall " type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 4986c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine "flips=%u, isSecure=%d, secureVis=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n" 499766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 5001d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 50102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mDisplayName.string(), mType, mHwcDisplayId, 5021d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 5031d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 5046c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mIsSecure, mSecureLayerVisible, mPowerMode, mActiveConfig, 5056c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mVisibleLayersSortedByZ.size(), 5061d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 5071d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 508766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 5091d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 5101d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 5111d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 5121d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 51399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 51499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface->dump(surfaceDump); 51599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 5161d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 517