DisplayDevice.cpp revision b02087dbd6a25e9d077fde16039050da8012b413
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 56720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee// retrieve triple buffer setting from configstore 57720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore; 58720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Leeusing namespace android::hardware::configstore::V1_0; 59720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 601971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglardstatic bool useTripleFramebuffer = getInt64< ISurfaceFlingerConfigs, 6148eb5659c312e63c3876a0d95480f71f9184bfdeFabien Sanglard &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2) >= 3; 62720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 69021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 705d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// clang-format off 710f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 73dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 74ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 76dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 7799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 78db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter bool supportWideColor) 80b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 81b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 8427e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 8599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayWidth(), 899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayHeight(), 9092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 91dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 9201e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 932c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 946c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 954f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mActiveConfig(0) 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // clang-format on 985e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang Surface* surface; 995e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mNativeWindow = surface = new Surface(producer, false); 100a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 102901a86e1edd983968dda2218f87a35064114c08dNaseer Ahmed mActiveColorMode = HAL_COLOR_MODE_NATIVE; 1034f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter mDisplayHasWideColor = supportWideColor; 104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 106b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 107385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1085e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang EGLSurface eglSurface; 1092b6386e16ebdc1bdaee81ce37d0e5cbbdfffddb3Chia-I Wu EGLDisplay display = mFlinger->getRenderEngine().getEGLDisplay(); 110c670d50b2e1a33ee4e0a8b6967f3e99e03149447Chia-I Wu EGLConfig config = mFlinger->getRenderEngine().getEGLConfig(); 1112b6386e16ebdc1bdaee81ce37d0e5cbbdfffddb3Chia-I Wu 11219e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 11394e35b93537c7f9da018688ac8a8ba87f4689915Steven Thomas config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888, 11494e35b93537c7f9da018688ac8a8ba87f4689915Steven Thomas /*logConfig*/ false); 11519e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 1165e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglSurface = eglCreateWindowSurface(display, config, window, NULL); 1175e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth); 1185e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1204ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 1214ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 1224ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 1234ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1244ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1254ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1264ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1274ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1284ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1294ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 13047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mConfig = config; 1311f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1325e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mSurface = eglSurface; 1331f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 134da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 135da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1361f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 137ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1382c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1392c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1405f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1418dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1428dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1438dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1448dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1458dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1468dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1478dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1488dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1498dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1508dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1518dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 15598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 15600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 1575e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang 158720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee if (useTripleFramebuffer) { 159720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee surface->allocateBuffers(); 160720a72479292406b821cbb17b93e6e1659ce0c3eJaesoo Lee } 161a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 162a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 163ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 164ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 165ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 166ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 167ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 168ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 169ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 17002d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 17102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 17202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 17302d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 17402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 17502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 17602d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 177ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 178ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 179ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 180ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 181ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 182ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 183ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 184ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 185ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 186ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 187ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 188ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 189ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 190ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 1939e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 1949e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 1959e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 1969e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 1979e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 1989e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 1999e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 2000f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wuvoid DisplayDevice::flip() const 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2107143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2117143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 212028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 213028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 2319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 2339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 2369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 23738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 238da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 2399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwc.hasClientComposition(mHwcDisplayId)) { 24099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 24199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 24299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 24399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 24499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 24599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 24699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 24799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 24899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 24999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 250da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 251da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 252da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 25352e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 25499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 25599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 25699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 25799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 25832341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 259da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 260da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 264da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2657f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I WuEGLBoolean DisplayDevice::makeCurrent() const { 266da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 26752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 268875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 2697f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I Wu result = mFlinger->getRenderEngine().setCurrentSurface(mSurface); 270da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 271f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 2727f40290b223afe1fea1d173da43e8e3d6ae49590Chia-I Wu eglSwapInterval(mDisplay, 0); 273da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 27452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 275931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 276da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 27752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 27852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 279875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 280875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 281875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 282c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 283c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 284c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 285bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 286bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 2879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 2889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 2899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 2921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 2943b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 2953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 2963b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 2983b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 2993b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3003b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 30183806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuvoid DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { 30283806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu mLayersNeedingFences = layers; 30383806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 30483806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 30583806897c6366d841971a38f4a007bb83a7afb64Chia-I Wuconst Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { 30683806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu return mLayersNeedingFences; 30783806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu} 30883806897c6366d841971a38f4a007bb83a7afb64Chia-I Wu 309cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 310cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 311cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 312cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 313cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 314da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 315cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 316cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 317cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 318cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3213b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3222c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 3232c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 324d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 325d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 3272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 328d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 329d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 3302c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 3312c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 332d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 333d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 334d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 3356c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 3366c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 3376c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3386c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3396c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 3406c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 3416c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 3426c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 3436c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 34428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightvoid DisplayDevice::setActiveColorMode(android_color_mode_t mode) { 34528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright mActiveColorMode = mode; 34628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 34728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 34828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightandroid_color_mode_t DisplayDevice::getActiveColorMode() const { 34928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return mActiveColorMode; 35028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 35179d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter 35279d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchtervoid DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { 35379d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 35479d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter native_window_set_buffers_data_space(window, dataspace); 35579d272442ce13418c3ea81c95d7fea0159b4b481Courtney Goeltzenleuchter} 35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright// ---------------------------------------------------------------------------- 3583b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 35928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 36028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 36128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 36228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 36328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 36428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 36528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 366c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 367c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 368c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 369c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 370c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 371c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 372c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 373c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 374c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 375c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 376c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 377c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 378c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 379c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 380c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 381c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 382c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 383c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 384c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 3850f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 3861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 3871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 3881b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 3891b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 3903165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 3911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 3921b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3933165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 3941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 3951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3963165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 3971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 3981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 3993165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 4001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 4011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 4031b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 4041b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4051b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 4061b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4071b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4081b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 40947e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 41047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 41147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 412f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 413f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 414f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 415f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 416f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 41747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 41847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 41947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 42047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 42147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 42247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 42347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 42447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 42547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 42647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 42747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 42847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 42947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 43000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 431f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 432f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 433f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 434da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 435f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 436f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 437da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 438f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 439f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 4401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 441f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 442f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 443f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 444f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 445f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 4466360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 447f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 448f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 449f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 450f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 451f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 452f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 453f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 454f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 455f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 456f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 457766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 4581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 459f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 460f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 461f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 462f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 463f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 464f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 465f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 466f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 467f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 468f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 469f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 470f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 471f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 472f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 473f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 474f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 475f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 476f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 477f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 478f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 479f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 480f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 481f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 482f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 483f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 484f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 485f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 486f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 487f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 488f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 489f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 490f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 4916c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 492f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 493f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 494f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 495021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 496021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 497021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 498021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 499021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 500021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 501021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 502021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 503021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 504021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 505021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 506021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 507021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 508021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 509021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 510021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 511021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 512021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 513f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 514f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 5151b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 5161d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 517021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 518021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 519021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 520021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 52174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 5221d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 523152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter ANativeWindow* const window = mNativeWindow.get(); 5240ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter EGLint redSize, greenSize, blueSize, alphaSize; 5250ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &redSize); 5260ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &greenSize); 5270ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &blueSize); 5280ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &alphaSize); 5290ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat("+ DisplayDevice: %s\n", mDisplayName.string()); 5300ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p " 5310ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "(%d:%d:%d:%d), orient=%2d (type=%08x), " 5320ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n", 533152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter mType, mHwcDisplayId, mLayerStack, mDisplayWidth, mDisplayHeight, window, 534152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter redSize, greenSize, blueSize, alphaSize, mOrientation, tr.getType(), 535152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter getPageFlipCount(), mIsSecure, mPowerMode, mActiveConfig, 5360ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mVisibleLayersSortedByZ.size()); 5370ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter result.appendFormat(" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 5380ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 5390ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 5400ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, mScissor.left, 5410ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter mScissor.top, mScissor.right, mScissor.bottom, tr[0][0], tr[1][0], tr[2][0], 5420ebaac3fb967f48c9b5f1d579ede853fc495a7cdCourtney Goeltzenleuchter tr[0][1], tr[1][1], tr[2][1], tr[0][2], tr[1][2], tr[2][2]); 543152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter auto const surface = static_cast<Surface*>(window); 544152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter android_dataspace dataspace = surface->getBuffersDataSpace(); 545152279d2725cd59369bcdf70f9622b011cae5a14Courtney Goeltzenleuchter result.appendFormat(" dataspace: %s (%d)\n", dataspaceDetails(dataspace).c_str(), dataspace); 5461d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 54799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 548f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 54999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 5501d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 551ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 552ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelstd::atomic<int32_t> DisplayDeviceState::nextDisplayId(1); 553ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel 554ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvelDisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure) 555ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel : type(type), 556ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel layerStack(DisplayDevice::NO_LAYER_STACK), 557ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel orientation(0), 558ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel width(0), 559ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel height(0), 560ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel isSecure(isSecure) 561ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel{ 562ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel viewport.makeInvalid(); 563ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel frame.makeInvalid(); 564ffc9efc4b55df38ac524f20cdd1a2fca8e259faeIrvel} 565