DisplayDevice.cpp revision c670d50b2e1a33ee4e0a8b6967f3e99e03149447
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 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza// #define LOG_NDEBUG 0 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "DisplayDevice" 209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 32c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h" 401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h" 42875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 44da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 46c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 4713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h" 481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 49720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 50720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee#include <configstore/Utils.h> 51720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 52a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 54a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#ifdef EGL_ANDROID_swap_rectangle 5789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = true; 5889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#else 5989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = false; 6089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 6189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 62720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore 63720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore; 64720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0; 65720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 661971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglardstatic bool useTripleFramebuffer = getInt64< ISurfaceFlingerConfigs, 6748eb5659c312e63c3876a0d95480f71f9184bfdeFabien Sanglard &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2) >= 3; 68720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 6989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#if !defined(EGL_EGLEXT_PROTOTYPES) || !defined(EGL_ANDROID_swap_rectangle) 7089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe// Dummy implementation in case it is missing. 7189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampeinline void eglSetSwapRectangleANDROID (EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint) { 7289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe} 7389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 7489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 80021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 81021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 825d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off 830f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 85dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 86ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 87dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 88dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 8999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 90db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 915d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter bool supportWideColor) 92b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 93b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 9627e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 9799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayWidth(), 1019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayHeight(), 10292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 10392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 104dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 10501e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 1062c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 1076c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 1084f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mActiveConfig(0) 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1105d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 1115e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang Surface* surface; 1125e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mNativeWindow = surface = new Surface(producer, false); 113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 115901a86e1edd983968dda2218f87a35064114c08dNaseer Ahmed mActiveColorMode = HAL_COLOR_MODE_NATIVE; 1164f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mDisplayHasWideColor = supportWideColor; 117a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 119b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 120385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1215e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang EGLSurface eglSurface; 1222b6386e16ebdc1bdaee81ce37d0e5cbbdfffddb3Chia-I Wu EGLDisplay display = mFlinger->getRenderEngine().getEGLDisplay(); 123c670d50b2e1a33ee4e0a8b6967f3e99e03149447Chia-I Wu EGLConfig config = mFlinger->getRenderEngine().getEGLConfig(); 1242b6386e16ebdc1bdaee81ce37d0e5cbbdfffddb3Chia-I Wu 12519e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 12694e35b93537c7f9da018688ac8a8ba87f4689915Steven Thomas config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888, 12794e35b93537c7f9da018688ac8a8ba87f4689915Steven Thomas /*logConfig*/ false); 12819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 1295e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglSurface = eglCreateWindowSurface(display, config, window, NULL); 1305e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth); 1315e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1334ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 1344ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 1354ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 1364ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1374ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1384ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1394ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1404ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1414ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1424ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 14347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mConfig = config; 1441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1455e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mSurface = eglSurface; 1461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 147da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 148da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 150ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1512c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1522c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1535f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1658dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1668dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1678dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 16898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 16900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 1705e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang 171720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee if (useTripleFramebuffer) { 172720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee surface->allocateBuffers(); 173720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee } 174a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 175a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 176ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 177ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 178ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 179ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 180ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 181ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 182ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 18302d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 18402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 18502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 18602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 18702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 18802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 18902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 190ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 193ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 194ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 195ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 196ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 197ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 198ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 199ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 200ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 201ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 202ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 203ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 204ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 205ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 2069e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 2079e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 2089e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 2099e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 2109e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 2119e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 2129e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 2130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 214076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 219875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (kEGLAndroidSwapRectangle) { 22289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (mFlags & SWAP_RECTANGLE) { 22389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Region newDirty(dirty.intersect(bounds())); 22489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Rect b(newDirty.getBounds()); 22589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe eglSetSwapRectangleANDROID(mDisplay, mSurface, 22689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe b.left, b.top, b.width(), b.height()); 22789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe } 22801e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 229d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 230076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2337143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2347143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 235028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 236028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 2379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 2389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 2399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 2409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 2419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 2449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 2459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 2469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 2479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 2489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 2499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 2519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 2539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 2599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 26038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 261da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwc.hasClientComposition(mHwcDisplayId)) { 26399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 26499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 26599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 26699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 26799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 26899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 26999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 27099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 27199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 27299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 273da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 274da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 275da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 27652e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 27799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 27899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 27999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 28099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 28132341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 282da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 283da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 2859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 2869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 287da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2880f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2937f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I WuEGLBoolean DisplayDevice::makeCurrent() const { 294da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 29552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 296875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 2977f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I Wu result = mFlinger->getRenderEngine().setCurrentSurface(mSurface); 298da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 299f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 3007f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I Wu eglSwapInterval(mDisplay, 0); 301da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 30252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 303931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 304da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 30552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 30652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 307875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 308875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 309875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 310c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 311c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 312c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 313bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 314bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 3159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 3169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 3179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 3189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 32113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 3223b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3233b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3243b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 32513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 3263b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3273b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3283b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 32983806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { 33083806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu mLayersNeedingFences = layers; 33183806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 33283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 33383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { 33483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return mLayersNeedingFences; 33583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 33683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 337cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 338cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 339cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 340cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 341cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 342da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 343cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 344cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 345cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 346cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 347cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 348cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3493b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3502c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 3512c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 352d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 353d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3542c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 3552c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 356d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 357d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3582c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 3592c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 360d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 361d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 362d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3636c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 3646c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 3656c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3666c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3676c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 3686c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 3696c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3706c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3716c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) { 37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 37628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const { 37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 37828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 37979d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 38079d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchtervoid DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { 38179d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 38279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter native_window_set_buffers_data_space(window, dataspace); 38379d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 38428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 3863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 38728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 38828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 38928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 39028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 39128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 39228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 39328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 394c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 395c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 396c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 397c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 398c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 399c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 400c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 401c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 402c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 403c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 404c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 405c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 406c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 407c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 408c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 409c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 410c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 411c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 412c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 4130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 4141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 4151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 4161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 4171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 4183165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 4191b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 4201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4213165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 4221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 4231b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4243165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 4251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 4261b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4273165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 4281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 4291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4301b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 4311b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 4321b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 4341b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 43747e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 43847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 43947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 440f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 441f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 442f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 443f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 444f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 44547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 44647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 44747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 44847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 44947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 45047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 45147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 45247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 45347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 45447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 45547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 45647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 45747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 45800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 459f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 460f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 462da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 463f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 464f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 465da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 466f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 467f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 4681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 469f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 470f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 471f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 472f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 473f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 4746360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 475f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 476f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 477f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 478f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 479f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 480f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 481f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 482f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 483f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 484f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 485766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 487f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 488f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 489f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 490f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 491f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 492f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 493f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 494f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 495f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 496f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 497f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 498f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 499f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 500f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 501f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 502f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 503f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 504f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 505f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 506f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 507f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 508f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 509f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 510f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 511f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 512f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 513f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 514f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 515f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 516f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 517f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 518f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 5196c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 520f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 521f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 522f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 523021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 524021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 525021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 526021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 527021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 528021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 529021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 530021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 531021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 532021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 533021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 534021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 535021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 536021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 537021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 538021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 539021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 540021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 541f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 542f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 5431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 5441d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 545021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 546021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 547021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 548021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 54974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 5501d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 551152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 5520ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter EGLint redSize, greenSize, blueSize, alphaSize; 5530ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &redSize); 5540ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &greenSize); 5550ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &blueSize); 5560ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &alphaSize); 5570ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 5580ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 5590ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 5600ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 561152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window, 562152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter redSize, greenSize, blueSize, alphaSize, mOrientation, tr.getType(), 563152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 5640ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 5650ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 5660ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 5670ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 5680ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 5690ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 5700ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 571152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter auto const surface = static_cast<Surface*>(window); 572152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter android_dataspace dataspace = surface->getBuffersDataSpace(); 573152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter result.appendFormat(" dataspace: %s (%d)\n", dataspaceDetails(dataspace).c_str(), dataspace); 5741d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 57599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 576f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 57799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 5781d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 579ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 580ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 581ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 582ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 583ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 584ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 585ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 586ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 587ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 588ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 589ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 590ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 591ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 592ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 593