PhysicalDevice.cpp revision e2ad4c047651d4442f6a0e002290016d45e9201a
16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 26a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Copyright © 2012 Intel Corporation 36a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * All rights reserved. 46a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 56a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Permission is hereby granted, free of charge, to any person obtaining a 66a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * copy of this software and associated documentation files (the "Software"), 76a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * to deal in the Software without restriction, including without limitation 86a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 96a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * and/or sell copies of the Software, and to permit persons to whom the 106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Software is furnished to do so, subject to the following conditions: 116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * The above copyright notice and this permission notice (including the next 136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * paragraph) shall be included in all copies or substantial portions of the 146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Software. 156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * IN THE SOFTWARE. 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Authors: 256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Jackie Li <yaodong.li@intel.com> 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu */ 28e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#include <HwcTrace.h> 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Drm.h> 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h> 318a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu#include <PhysicalDevice.h> 326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 368a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy QiuPhysicalDevice::PhysicalDevice(uint32_t type, Hwcomposer& hwc, DisplayPlaneManager& dpm) 376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu : mType(type), 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc(hwc), 396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayPlaneManager(dpm), 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig(-1), 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mVsyncControl(0), 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBlankControl(0), 4325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener(0), 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mVsyncObserver(0), 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList(0), 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mConnection(DEVICE_DISCONNECTED), 4765efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState(DEVICE_DISPLAY_ON), 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 50e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (type) { 536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_PRIMARY: 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Primary"; 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_EXTERNAL: 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "External"; 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Unknown"; 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.setCapacity(DEVICE_COUNT); 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 668a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy QiuPhysicalDevice::~PhysicalDevice() 676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 68e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 718a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onGeometryChanged(hwc_display_contents_1_t *list) 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 73e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!list) { 74e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("list is NULL"); 75e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu return; 76e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 77e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 78e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("disp = %d, layer number = %d", mType, list->numHwLayers); 79e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 80e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // NOTE: should NOT be here 81e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mLayerList) { 82e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu WTRACE("mLayerList exists"); 83e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mLayerList; 84e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 85e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create a new layer list 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList = new HwcLayerList(list, 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayPlaneManager, 896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mType); 90e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!mLayerList) { 91e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu WTRACE("failed to create layer list"); 9265efc253a628175c7afa95c431b746ea20052794Andy Qiu } else if (mType == IDisplayDevice::DEVICE_PRIMARY) { 9365efc253a628175c7afa95c431b746ea20052794Andy Qiu#if 0 // display driver does not support run-time power management yet 9465efc253a628175c7afa95c431b746ea20052794Andy Qiu Hwcomposer& hwc = Hwcomposer::getInstance(); 9565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hwc.getDisplayAnalyzer()->checkVideoExtendedMode()) { 9665efc253a628175c7afa95c431b746ea20052794Andy Qiu bool hasVisibleLayer = mLayerList->hasVisibleLayer(); 9765efc253a628175c7afa95c431b746ea20052794Andy Qiu Drm *drm = hwc.getDrm(); 9865efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hasVisibleLayer == true && mDisplayState == DEVICE_DISPLAY_OFF) { 9965efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("turn on device %d as there is visible layer", mType); 10065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (drm->setDpmsMode(mType, DEVICE_DISPLAY_ON) == true) { 10165efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState = DEVICE_DISPLAY_ON; 10265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hasVisibleLayer == false && mDisplayState == DEVICE_DISPLAY_ON) { 10565efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("turn off device %d as there is no visible layer", mType); 10665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (drm->setDpmsMode(mType, DEVICE_DISPLAY_OFF) == true) { 10765efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState = DEVICE_DISPLAY_OFF; 10865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11165efc253a628175c7afa95c431b746ea20052794Andy Qiu#endif 112e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1158a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prePrepare(hwc_display_contents_1_t *display) 1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 117e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu Mutex::Autolock _l(mLock); 1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 1228a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return false; 1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // for a null list, delete hwc list 1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!display) { 1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mLayerList; 1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList = 0; 1288a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed, if changed delete list 1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if ((display->flags & HWC_GEOMETRY_CHANGED) && mLayerList) { 1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mLayerList; 1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList = 0; 1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1368a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1398a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prepare(hwc_display_contents_1_t *display) 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 141e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu Mutex::Autolock _l(mLock); 1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!display) 1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed 15125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (display->flags & HWC_GEOMETRY_CHANGED) { 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu onGeometryChanged(display); 15325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (mLayerList && mLayerList->hasProtectedLayer()) { 15425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener->onProtectedLayerStart(mType); 15525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 15625caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mLayerList) { 158e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("null HWC layer list"); 1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update list with new list 1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mLayerList->update(display); 1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1664b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1674b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiubool PhysicalDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context) 1684b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{ 169e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1704b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1714b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu if (!display || !context) { 1724b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu return false; 1734b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu } 1744b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu return context->commitContents(display, mLayerList); 1754b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu} 1764b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1778a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::vsyncControl(int enabled) 1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 179e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //Mutex::Autolock _l(mLock); 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 183e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("disp = %d, enabled = %d", mType, enabled); 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 185e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = mVsyncControl->control(mType, enabled); 1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 187e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed set vsync"); 1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mVsyncObserver->control(enabled); 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1958a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::blank(int blank) 1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 197e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //Mutex::Autolock _l(mLock); 2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 204e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = mBlankControl->blank(mType, blank); 2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 206e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to blank device"); 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2138a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayConfigs(uint32_t *configs, 2146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t *numConfigs) 2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 216e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //Mutex::Autolock _l(mLock); 2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 2216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!configs || !numConfigs) { 224e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *configs = 0; 2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *numConfigs = mDisplayConfigs.size(); 2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2348a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayAttributes(uint32_t configs, 2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu const uint32_t *attributes, 2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int32_t *values) 2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 238e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //Mutex::Autolock _l(mLock); 2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 2436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!attributes || !values) { 246e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(mActiveDisplayConfig); 2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!config) { 252e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to get display config"); 2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i = 0; 2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) { 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (attributes[i]) { 2596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_VSYNC_PERIOD: 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = 1e9 / config->getRefreshRate(); 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_WIDTH: 2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getWidth(); 2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_HEIGHT: 2666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getHeight(); 2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_X: 26913bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiX() * 1000.0f; 2706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_Y: 27213bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiY() * 1000.0f; 2736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 275e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("unknown attribute %d", attributes[i]); 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i++; 2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2848a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::compositionComplete() 2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 286e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 287e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // do nothing by default 2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2918a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::removeDisplayConfigs() 2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 2946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 2956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete config; 2966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.clear(); 2996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = -1; 3006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3028a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::updateDisplayConfigs(struct Output *output) 3036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeConnectorPtr drmConnector; 3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeCrtcPtr drmCrtc; 3066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeModeInfoPtr drmMode; 3076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeModeInfoPtr drmPreferredMode; 3086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeFBPtr drmFb; 3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int drmModeCount; 3106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu float physWidthInch; 3116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu float physHeightInch; 3126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int dpiX, dpiY; 3136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 314e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 3156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu Mutex::Autolock _l(mLock); 3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmConnector = output->connector; 3196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!drmConnector) { 320e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("output has no connector"); 3216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu physWidthInch = (float)drmConnector->mmWidth * 0.039370f; 3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu physHeightInch = (float)drmConnector->mmHeight * 0.039370f; 3266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmModeCount = drmConnector->count_modes; 3286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode = 0; 3296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // reset display configs 3316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu removeDisplayConfigs(); 3326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // reset the number of display configs 3346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.setCapacity(drmModeCount + 1); 3356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 336e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu VTRACE("mode count %d", drmModeCount); 3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // find preferred mode of this display device 3396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < drmModeCount; i++) { 3406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode = &drmConnector->modes[i]; 3416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX = drmMode->hdisplay / physWidthInch; 3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiY = drmMode->vdisplay / physHeightInch; 3436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if ((drmMode->type & DRM_MODE_TYPE_PREFERRED)) { 3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode = drmMode; 3466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu continue; 3476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 349e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu VTRACE("adding new config %dx%d@%d", 3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->hdisplay, 3516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vdisplay, 3526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vrefresh); 3536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // if not preferred mode add it to display configs 3556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = new DisplayConfig(drmMode->vrefresh, 3566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->hdisplay, 3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vdisplay, 3586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX, dpiY); 3596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.add(config); 3606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update device connection status 3636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mConnection = (output->connected) ? DEVICE_CONNECTED : DEVICE_DISCONNECTED; 3646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // if device is connected, continue checking current mode 3666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 3676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto use_preferred_mode; 3686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu else if (mConnection == DEVICE_CONNECTED) { 3696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // use active fb and mode 3706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmCrtc = output->crtc; 3716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmFb = output->fb; 3726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!drmCrtc || !drmFb) { 373e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("impossible"); 3746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto use_preferred_mode; 3756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode = &drmCrtc->mode; 3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!drmCrtc->mode_valid) 3796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto use_preferred_mode; 3806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 381e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu VTRACE("using current mode %dx%d@%d", 3826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->hdisplay, 3836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vdisplay, 3846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vrefresh); 3856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // use current drm mode, likely it's preferred mode 3876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX = drmMode->hdisplay / physWidthInch; 3886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiY = drmMode->vdisplay / physHeightInch; 3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // use active fb dimension as config width/height 3906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = new DisplayConfig(drmMode->vrefresh, 3916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //drmFb->width, 3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //drmFb->height, 3936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->hdisplay, 3946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmMode->vdisplay, 3956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX, dpiY); 3966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // add it to the front of other configs 3976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.push_front(config); 3986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // init the active display config 4016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = 0; 4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 4046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuuse_preferred_mode: 4056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (drmPreferredMode) { 4066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX = drmPreferredMode->hdisplay / physWidthInch; 4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiY = drmPreferredMode->vdisplay / physHeightInch; 4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = new DisplayConfig(drmPreferredMode->vrefresh, 4096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode->hdisplay, 4106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode->vdisplay, 4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu dpiX, dpiY); 4126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!config) { 413e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to allocate display config"); 4146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 417e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu VTRACE("using preferred mode %dx%d@%d", 4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode->hdisplay, 4196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode->vdisplay, 4206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu drmPreferredMode->vrefresh); 4216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // add it to the front of other configs 4236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.push_front(config); 4246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // init the active display config 4276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = 0; 4286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 4296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4318a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::detectDisplayConfigs() 4326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu struct Output *output; 4346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 435e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li Drm *drm = Hwcomposer::getInstance().getDrm(); 436e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 437e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 4386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 439e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!drm) { 440e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to get drm"); 441e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 442e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 4436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect 445e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ret = drm->detect(); 4466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 447e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("drm detection failed"); 4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // get output 45265efc253a628175c7afa95c431b746ea20052794Andy Qiu output = drm->getOutput(mType); 4536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!output) { 454e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to get output"); 4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update display configs 4596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return updateDisplayConfigs(output); 4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4628a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::initialize() 4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 464e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 46665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (mType != DEVICE_PRIMARY && mType != DEVICE_EXTERNAL) { 46765efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("invalid device type"); 46865efc253a628175c7afa95c431b746ea20052794Andy Qiu return false; 46965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 47065efc253a628175c7afa95c431b746ea20052794Andy Qiu 4716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect display configs 472e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = detectDisplayConfigs(); 4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 474e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to detect display config"); 4756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create vsync control 4786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mVsyncControl = createVsyncControl(); 4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mVsyncControl) { 480e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create vsync control"); 4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create blank control 4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBlankControl = createBlankControl(); 4856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBlankControl) { 486e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create blank control"); 4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 48925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu // create hwc prepare listener 49025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = createPrepareListener(); 49125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (!mPrepareListener) { 49225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create prepare listener"); 49325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 49425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 4956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create vsync event observer 4966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mVsyncObserver = new VsyncEventObserver(*this, *mVsyncControl); 4976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mVsyncObserver.get()) { 498e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create vsync observer"); 4996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 5026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 503e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 504e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 5058a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::deinitialize() 506e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 507e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mLayerList) { 508e2ad4c047651d4442f6a0e002290016d45e9201afu jin delete mLayerList; 509e2ad4c047651d4442f6a0e002290016d45e9201afu jin mLayerList = 0; 510e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 511e2ad4c047651d4442f6a0e002290016d45e9201afu jin 512e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy vsync event observer 513e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mVsyncObserver.get()) { 514e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mVsyncObserver->requestExit(); 515e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mVsyncObserver = 0; 516e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 517e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 518e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy blank control 519e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mBlankControl) { 520e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mBlankControl; 521e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mBlankControl = 0; 522e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 5236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 524e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy vsync control 525e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mVsyncControl) { 526e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mVsyncControl; 527e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mVsyncControl = 0; 528e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 529e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 53025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (mPrepareListener) { 53125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu delete mPrepareListener; 53225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = 0; 53325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 53425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 535e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // remove configs 5366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu removeDisplayConfigs(); 537e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 5386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 5396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5418a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::isConnected() const 5426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 543e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 5446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return (mConnection == DEVICE_CONNECTED) ? true : false; 5466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5488a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuconst char* PhysicalDevice::getName() const 5496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 5506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mName; 5516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5538a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuint PhysicalDevice::getType() const 5546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 5556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mType; 5566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5588a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onVsync(int64_t timestamp) 5596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 560e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 561e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("timestamp = %lld", timestamp); 5626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //Mutex::Autolock _l(mLock); 5646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mConnection != DEVICE_CONNECTED) 5666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 5676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // notify hwc 5696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc.vsync(mType, timestamp); 5706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5728a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::dump(Dump& d) 5736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 5746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 5756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Device Name: %s (%s)\n", mName, 5766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mConnection ? "connected" : "disconnected"); 5776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display configs (count = %d):\n", mDisplayConfigs.size()); 5786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT | DPI_X | DPI_Y \n"); 5796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("--------+--------------+-------+--------+-------+-------\n"); 5806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 5816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 5826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (config) { 5836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("%s %2d | %4d | %5d | %4d | %3d | %3d \n", 5846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu (i == (size_t)mActiveDisplayConfig) ? "* " : " ", 5856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i, 5866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getRefreshRate(), 5876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getWidth(), 5886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getHeight(), 5896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiX(), 5906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiY()); 5916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // dump layer list 5946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mLayerList) 5956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList->dump(d); 5966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 5996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 600