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 31c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplayHardware/DisplaySurface.h" 391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include "DisplayHardware/HWC2.h" 429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 43875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 45da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian#include "clz.h" 460f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 47c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h" 4813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian#include "Layer.h" 491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 50a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 52a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ---------------------------------------------------------------------------- 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#ifdef EGL_ANDROID_swap_rectangle 5589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = true; 5689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#else 5789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampestatic constexpr bool kEGLAndroidSwapRectangle = false; 5889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 5989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 6089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#if !defined(EGL_EGLEXT_PROTOTYPES) || !defined(EGL_ANDROID_swap_rectangle) 6189fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe// Dummy implementation in case it is missing. 6289fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampeinline void eglSetSwapRectangleANDROID (EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint) { 6389fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe} 6489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe#endif 6589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 71021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; 72021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 730f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice( 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 75dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis DisplayType type, 76ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall int32_t hwcId, 779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 7819e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall int format, 799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 80dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool isSecure, 81dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis const wp<IBinder>& displayToken, 8299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall const sp<DisplaySurface>& displaySurface, 83db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferProducer>& producer, 84a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config) 85b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall : lastCompositionHadVisibleLayers(false), 86b7a0549c983bef103ce07eb3af5905febc6e538eJesse Hall mFlinger(flinger), 879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mType(type), 889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcDisplayId(hwcId), 8927e2562868dcd3ad26f9b4677b64ae272941704eChih-Wei Huang mDisplayToken(displayToken), 9099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplaySurface(displaySurface), 9192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDisplay(EGL_NO_DISPLAY), 9292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mSurface(EGL_NO_SURFACE), 939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayWidth(), 949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplayHeight(), 959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mFormat(), 979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mFlags(), 9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mPageFlipCount(), 100dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis mIsSecure(isSecure), 10101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall mLayerStack(NO_LAYER_STACK), 1022c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mOrientation(), 1036c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mPowerMode(HWC_POWER_MODE_OFF), 1046c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig(0) 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1065e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang Surface* surface; 1075e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mNativeWindow = surface = new Surface(producer, false); 108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ANativeWindow* const window = mNativeWindow.get(); 109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian /* 111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian * Create our display's surface 112b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian */ 113385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian 1145e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang EGLSurface eglSurface; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 11619e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall if (config == EGL_NO_CONFIG) { 1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888); 1199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 12019e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall config = RenderEngine::chooseEglConfig(display, format); 1219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 12219e872912af66c53a4350afcc333bbafaf6a2294Jesse Hall } 1235e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglSurface = eglCreateWindowSurface(display, config, window, NULL); 1245e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth); 1255e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang eglQuerySurface(display, eglSurface, EGL_HEIGHT, &mDisplayHeight); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1274ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // Make sure that composition can never be stalled by a virtual display 1284ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // consumer that isn't processing buffers fast enough. We have to do this 1294ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // in two places: 1304ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * Here, in case the display is composed entirely by HWC. 1314ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the 1324ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // window's swap interval in eglMakeCurrent, so they'll override the 1334ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong // interval we set here. 1344ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 1354ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong window->setSwapInterval(window, 0); 1364ee5696dfbcea1078b24e7c089de74e7cf4e55caJohn Dong 13747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mConfig = config; 1381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mDisplay = display; 1395e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang mSurface = eglSurface; 1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 1419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mFormat = format; 1429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian mPageFlipCount = 0; 144da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mViewport.makeInvalid(); 145da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian mFrame.makeInvalid(); 1461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 147ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall // virtual displays are always considered enabled 1482c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = (mType >= DisplayDevice::DISPLAY_VIRTUAL) ? 1492c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF; 1505f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 1518dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // Name the display. The name will be replaced shortly if the display 1528dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden // was created with createDisplay(). 1538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden switch (mType) { 1548dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_PRIMARY: 1558dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Built-in Screen"; 1568dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1578dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden case DISPLAY_EXTERNAL: 1588dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "HDMI Screen"; 1598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1608dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden default: 1618dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden mDisplayName = "Virtual Screen"; // e.g. Overlay #n 1628dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden break; 1638dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden } 1648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden 16598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian // initialize the display orientation transform. 16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian setProjection(DisplayState::eOrientationDefault, mViewport, mFrame); 1675e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang 1685e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#ifdef NUM_FRAMEBUFFER_SURFACE_BUFFERS 1695e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang surface->allocateBuffers(); 1705e8eb5ead16fa1136d769d7f8625b882e6465afcjames.zhang#endif 171a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 172a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 173ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallDisplayDevice::~DisplayDevice() { 174ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall if (mSurface != EGL_NO_SURFACE) { 175ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall eglDestroySurface(mDisplay, mSurface); 176ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall mSurface = EGL_NO_SURFACE; 177ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall } 178ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 179ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 18002d86567d95b99e1142941ed7ec23a4465822813Jesse Hallvoid DisplayDevice::disconnect(HWComposer& hwc) { 18102d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= 0) { 18202d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.disconnectDisplay(mHwcDisplayId); 1839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 18402d86567d95b99e1142941ed7ec23a4465822813Jesse Hall if (mHwcDisplayId >= DISPLAY_VIRTUAL) 18502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall hwc.freeDisplayId(mHwcDisplayId); 1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 18702d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mHwcDisplayId = -1; 18802d86567d95b99e1142941ed7ec23a4465822813Jesse Hall } 18902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall} 19002d86567d95b99e1142941ed7ec23a4465822813Jesse Hall 191ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallbool DisplayDevice::isValid() const { 192ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFlinger != NULL; 193ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 194ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 195ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getWidth() const { 196ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayWidth; 197ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 198ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 199ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hallint DisplayDevice::getHeight() const { 200ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mDisplayHeight; 201ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 202ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 204ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallPixelFormat DisplayDevice::getFormat() const { 205ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mFormat; 206ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 208ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 209ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse HallEGLSurface DisplayDevice::getEGLSurface() const { 210ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall return mSurface; 211ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall} 212ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall 2139e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopianvoid DisplayDevice::setDisplayName(const String8& displayName) { 2149e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian if (!displayName.isEmpty()) { 2159e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian // never override the name with an empty name 2169e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian mDisplayName = displayName; 2179e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian } 2189e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian} 2199e2463e71796964cfaa06bf09a880875ac3537bcMathias Agopian 2200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const { 221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 2250f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const { 22699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return mDisplaySurface->compositionComplete(); 22774faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2300f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 232875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian mFlinger->getRenderEngine().checkErrors(); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23489fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (kEGLAndroidSwapRectangle) { 23589fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe if (mFlags & SWAP_RECTANGLE) { 23689fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Region newDirty(dirty.intersect(bounds())); 23789fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe const Rect b(newDirty.getBounds()); 23889fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe eglSetSwapRectangleANDROID(mDisplay, mSurface, 23989fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe b.left, b.top, b.width(), b.height()); 24089fd4f7fa6bd17ce5400979c3b9e5ba0bf7e919eAndreas Gampe } 24101e29054e672301e4adbbca15b3562a59a20f267Jesse Hall } 242d870703d5566490cfdfb389d9336b2b8d3c6cc7aMathias Agopian 243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2467143316af216fa92c31a60d4407b707637382da1Dan Stozastatus_t DisplayDevice::beginFrame(bool mustRecompose) const { 2477143316af216fa92c31a60d4407b707637382da1Dan Stoza return mDisplaySurface->beginFrame(mustRecompose); 248028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 249028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 2519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t DisplayDevice::prepareFrame(HWComposer& hwc) { 2529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t error = hwc.prepare(*this); 2539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != NO_ERROR) { 2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return error; 2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplaySurface::CompositionType compositionType; 2589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasClient = hwc.hasClientComposition(mHwcDisplayId); 2599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasDevice = hwc.hasDeviceComposition(mHwcDisplayId); 2609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hasClient && hasDevice) { 2619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_MIXED; 2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasClient) { 2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_GLES; 2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (hasDevice) { 2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Nothing to do -- when turning the screen off we get a frame like 2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this. Call it a HWC frame since we won't be doing any GLES work but 2699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // will do a prepare/set cycle. 2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = DisplaySurface::COMPOSITION_HWC; 2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->prepareFrame(compositionType); 2739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 27538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallstatus_t DisplayDevice::prepareFrame(const HWComposer& hwc) const { 27638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall DisplaySurface::CompositionType compositionType; 27738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveGles = hwc.hasGlesComposition(mHwcDisplayId); 27838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId); 27938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall if (haveGles && haveHwc) { 28038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_MIXED; 28138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveGles) { 28238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_GLES; 28338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else if (haveHwc) { 28438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 28538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } else { 28638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // Nothing to do -- when turning the screen off we get a frame like 28738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // this. Call it a HWC frame since we won't be doing any GLES work but 28838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall // will do a prepare/set cycle. 28938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall compositionType = DisplaySurface::COMPOSITION_HWC; 29038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall } 29138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return mDisplaySurface->prepareFrame(compositionType); 29238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 2939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 29438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 295da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::swapBuffers(HWComposer& hwc) const { 2969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 2979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwc.hasClientComposition(mHwcDisplayId)) { 2989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 29922a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // We need to call eglSwapBuffers() if: 30022a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (1) we don't have a hardware composer, or 30122a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (2) we did GLES composition this frame, and either 30222a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (a) we have framebuffer target support (not present on legacy 30322a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // devices, where HWComposer::commit() handles things); or 30422a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden // (b) this is a virtual display 30599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (hwc.initCheck() != NO_ERROR || 30699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall (hwc.hasGlesComposition(mHwcDisplayId) && 30722a99f0fc2884227b9d7e46959fcbe6270667efbAndy McFadden (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) { 3089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 30999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); 31099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (!success) { 31199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall EGLint error = eglGetError(); 31299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (error == EGL_CONTEXT_LOST || 31399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mType == DisplayDevice::DISPLAY_PRIMARY) { 31499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall LOG_ALWAYS_FATAL("eglSwapBuffers(%p, %p) failed with 0x%08x", 31599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 31699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall } else { 31799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("eglSwapBuffers(%p, %p) failed with 0x%08x", 31899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplay, mSurface, error); 319da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 320da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 321da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 32252e21483fa48baeb4a88372d75e083bca2e92923Mathias Agopian 32399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall status_t result = mDisplaySurface->advanceFrame(); 32499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall if (result != NO_ERROR) { 32599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall ALOGE("[%s] failed pushing new frame to HWC: %d", 32699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall mDisplayName.string(), result); 32732341381c9493d7953e40f7f79653cfc52868863Mathias Agopian } 328da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 329da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 3319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid DisplayDevice::onSwapBuffersCompleted() const { 3329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mDisplaySurface->onFrameCommitted(); 3339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 3349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 335da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianvoid DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const { 336da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 337851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall mDisplaySurface->onFrameCommitted(); 338da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 339da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 3409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 341da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3420f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 347875d8e1323536e16dcfc90c9674d7ad32116a69aMathias AgopianEGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { 348da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = EGL_TRUE; 34952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian EGLSurface sur = eglGetCurrentSurface(EGL_DRAW); 350875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian if (sur != mSurface) { 351875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); 352da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian if (result == EGL_TRUE) { 353f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall if (mType >= DisplayDevice::DISPLAY_VIRTUAL) 354f460f55c84b0a75de749b8a784059f5ff423ed93Jesse Hall eglSwapInterval(dpy, 0); 355da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian } 35652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 357931bda1c472ba8c8e965bdba6757ff94154df903Mathias Agopian setViewportAndProjection(); 358da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian return result; 35952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian} 36052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 361875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopianvoid DisplayDevice::setViewportAndProjection() const { 362875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t w = mDisplayWidth; 363875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t h = mDisplayHeight; 364c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop(0, 0, w, h); 365c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, 366c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews false, Transform::ROT_0); 367bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian} 368bae92d0d605e99a14731add4f11b72413b2835e5Mathias Agopian 3699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { 3709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mDisplaySurface->getClientTargetAcquireFence(); 3719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 3729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ---------------------------------------------------------------------------- 3741b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 37513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { 3763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleLayersSortedByZ = layers; 3773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 37913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianconst Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { 3803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return mVisibleLayersSortedByZ; 3813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian} 3823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 383cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const { 384cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region dirty; 385cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (repaintEverything) { 386cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.set(getBounds()); 387cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 388da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian const Transform& planeTransform(mGlobalTransform); 389cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty = planeTransform.transform(this->dirtyRegion); 390cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian dirty.andSelf(getBounds()); 391cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 392cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return dirty; 393cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 394cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 3953b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ---------------------------------------------------------------------------- 3962c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid DisplayDevice::setPowerMode(int mode) { 3972c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani mPowerMode = mode; 398d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 399d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4002c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malaniint DisplayDevice::getPowerMode() const { 4012c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return mPowerMode; 402d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 403d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 4042c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanibool DisplayDevice::isDisplayOn() const { 4052c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return (mPowerMode != HWC_POWER_MODE_OFF); 406d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 407d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 408d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ---------------------------------------------------------------------------- 4096c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentinevoid DisplayDevice::setActiveConfig(int mode) { 4106c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mActiveConfig = mode; 4116c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4126c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4136c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentineint DisplayDevice::getActiveConfig() const { 4146c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine return mActiveConfig; 4156c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine} 4166c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine 4176c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine// ---------------------------------------------------------------------------- 4183b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 41928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) { 42028947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian mLayerStack = stack; 42128947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian dirtyRegion.set(bounds()); 42228947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian} 42328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 42428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ---------------------------------------------------------------------------- 42528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian 426c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianuint32_t DisplayDevice::getOrientationTransform() const { 427c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian uint32_t transform = 0; 428c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian switch (mOrientation) { 429c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientationDefault: 430c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_0; 431c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 432c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation90: 433c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_90; 434c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 435c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation180: 436c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_180; 437c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 438c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian case DisplayState::eOrientation270: 439c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian transform = Transform::ROT_270; 440c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian break; 441c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 442c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian return transform; 443c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian} 444c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 4450f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom( 4461b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian int orientation, int w, int h, Transform* tr) 4471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{ 4481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian uint32_t flags = 0; 4491b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian switch (orientation) { 4503165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientationDefault: 4511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_0; 4521b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4533165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation90: 4541b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_90; 4551b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4563165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation180: 4571b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_180; 4581b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4593165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case DisplayState::eOrientation270: 4601b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian flags = Transform::ROT_270; 4611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian break; 4621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian default: 4631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return BAD_VALUE; 4641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 4651b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian tr->set(flags, w, h); 4661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian return NO_ERROR; 4671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 4681b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 46947e45405d1533aa73307014f7bf371e118695cf3Michael Lentinevoid DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { 47047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine dirtyRegion.set(getBounds()); 47147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 472f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine if (mSurface != EGL_NO_SURFACE) { 473f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine eglDestroySurface(mDisplay, mSurface); 474f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine mSurface = EGL_NO_SURFACE; 475f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine } 476f2568dea419562ad75b2e79dcbd358af34e9f8adMichael Lentine 47747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mDisplaySurface->resizeBuffers(newWidth, newHeight); 47847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 47947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine ANativeWindow* const window = mNativeWindow.get(); 48047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine mSurface = eglCreateWindowSurface(mDisplay, mConfig, window, NULL); 48147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mDisplayWidth); 48247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mDisplayHeight); 48347e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 48447e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayWidth != newWidth, 48547e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new width to %d", newWidth); 48647e45405d1533aa73307014f7bf371e118695cf3Michael Lentine LOG_FATAL_IF(mDisplayHeight != newHeight, 48747e45405d1533aa73307014f7bf371e118695cf3Michael Lentine "Unable to set new height to %d", newHeight); 48847e45405d1533aa73307014f7bf371e118695cf3Michael Lentine} 48947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine 49000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid DisplayDevice::setProjection(int orientation, 491f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const Rect& newViewport, const Rect& newFrame) { 492f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect viewport(newViewport); 493f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Rect frame(newFrame); 494da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 495f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int w = mDisplayWidth; 496f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const int h = mDisplayHeight; 497da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 498f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform R; 499f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian DisplayDevice::orientationToTransfrom(orientation, w, h, &R); 5001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 501f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (!frame.isValid()) { 502f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // the destination frame can be invalid if it has never been set, 503f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // in that case we assume the whole display frame. 504f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian frame = Rect(w, h); 505f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 5066360ec42d414b1351ecb6c5fc4b8afa30d8f4ebfJesse Hall 507f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (viewport.isEmpty()) { 508f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport can be invalid if it has never been set, in that case 509f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // we assume the whole display size. 510f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // it's also invalid to have an empty viewport, so we handle that 511f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // case in the same way. 512f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian viewport = Rect(w, h); 513f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (R.getOrientation() & Transform::ROT_90) { 514f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // viewport is always specified in the logical orientation 515f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // of the display (ie: post-rotation). 516f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian swap(viewport.right, viewport.bottom); 517766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian } 5181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian } 519f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 520f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian dirtyRegion.set(getBounds()); 521f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 522f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian Transform TL, TP, S; 523f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_width = viewport.width(); 524f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_height = viewport.height(); 525f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_width = frame.width(); 526f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_height = frame.height(); 527f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (src_width != dst_width || src_height != dst_height) { 528f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sx = dst_width / src_width; 529f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float sy = dst_height / src_height; 530f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian S.set(sx, 0, 0, sy); 531f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 532f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 533f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_x = viewport.left; 534f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float src_y = viewport.top; 535f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_x = frame.left; 536f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian float dst_y = frame.top; 537f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TL.set(-src_x, -src_y); 538f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian TP.set(dst_x, dst_y); 539f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 540f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // The viewport and frame are both in the logical orientation. 541f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // Apply the logical translation, scale to physical size, apply the 542f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian // physical translation and finally rotate to the physical orientation. 543f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mGlobalTransform = R * TP * S * TL; 544f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 545f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian const uint8_t type = mGlobalTransform.getType(); 546f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mNeedsFiltering = (!mGlobalTransform.preserveRects() || 547f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian (type >= Transform::SCALE)); 548f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 549f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mScissor = mGlobalTransform.transform(viewport); 550f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian if (mScissor.isEmpty()) { 5516c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian mScissor = getBounds(); 552f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian } 553f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian 554f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mOrientation = orientation; 555021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos if (mType == DisplayType::DISPLAY_PRIMARY) { 556021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 0; 557021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos switch (mOrientation) { 558021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientationDefault: 559021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_0; 560021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 561021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation90: 562021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_90; 563021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 564021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation180: 565021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_180; 566021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 567021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos case DisplayState::eOrientation270: 568021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos transform = Transform::ROT_270; 569021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos break; 570021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 571021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos sPrimaryDisplayOrientation = transform; 572021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos } 573f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mViewport = viewport; 574f5f714aa188884098aaecbe39d0bc61b40311c0dMathias Agopian mFrame = frame; 5751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian} 5761d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 577021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballosuint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { 578021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos return sPrimaryDisplayOrientation; 579021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos} 580021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos 58174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid DisplayDevice::dump(String8& result) const { 5821d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian const Transform& tr(mGlobalTransform); 58374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 5841d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "+ DisplayDevice: %s\n" 58502d86567d95b99e1142941ed7ec23a4465822813Jesse Hall " type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), " 586b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos "flips=%u, isSecure=%d, powerMode=%d, activeConfig=%d, numLayers=%zu\n" 587766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian " v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d]," 5881d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian "transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n", 58902d86567d95b99e1142941ed7ec23a4465822813Jesse Hall mDisplayName.string(), mType, mHwcDisplayId, 5901d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(), 5911d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mOrientation, tr.getType(), getPageFlipCount(), 592b5b3563058c178811d434ab6e8c4ead4a519701bPablo Ceballos mIsSecure, mPowerMode, mActiveConfig, 5936c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine mVisibleLayersSortedByZ.size(), 5941d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mViewport.left, mViewport.top, mViewport.right, mViewport.bottom, 5951d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian mFrame.left, mFrame.top, mFrame.right, mFrame.bottom, 596766dc49c17dda977bf7b93a5fd8da41c0b737611Mathias Agopian mScissor.left, mScissor.top, mScissor.right, mScissor.bottom, 5971d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][0], tr[1][0], tr[2][0], 5981d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][1], tr[1][1], tr[2][1], 5991d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian tr[0][2], tr[1][2], tr[2][2]); 6001d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian 60199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall String8 surfaceDump; 602f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza mDisplaySurface->dumpAsString(surfaceDump); 60399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall result.append(surfaceDump); 6041d12d8a8e61163b35cf42c51c558a67138014e82Mathias Agopian} 605