PhysicalDevice.cpp revision bf6077e87709f8b025a040030e38c1af9aba73f5
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), 41eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankControl(NULL), 42eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPrepareListener(NULL), 43eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVsyncObserver(NULL), 44eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mLayerList(NULL), 4530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected(false), 4665efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState(DEVICE_DISPLAY_ON), 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 49e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (type) { 526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_PRIMARY: 536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Primary"; 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_EXTERNAL: 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "External"; 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Unknown"; 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.setCapacity(DEVICE_COUNT); 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 658a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy QiuPhysicalDevice::~PhysicalDevice() 666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 67e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 708a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onGeometryChanged(hwc_display_contents_1_t *list) 716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 72e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!list) { 73e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("list is NULL"); 74e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu return; 75e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 76e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 77e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("disp = %d, layer number = %d", mType, list->numHwLayers); 78e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 79e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // NOTE: should NOT be here 80e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mLayerList) { 81e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu WTRACE("mLayerList exists"); 82e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mLayerList; 83e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 84e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create a new layer list 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList = new HwcLayerList(list, 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayPlaneManager, 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mType); 89e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!mLayerList) { 90e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu WTRACE("failed to create layer list"); 9165efc253a628175c7afa95c431b746ea20052794Andy Qiu } else if (mType == IDisplayDevice::DEVICE_PRIMARY) { 9265efc253a628175c7afa95c431b746ea20052794Andy Qiu#if 0 // display driver does not support run-time power management yet 9365efc253a628175c7afa95c431b746ea20052794Andy Qiu Hwcomposer& hwc = Hwcomposer::getInstance(); 9465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hwc.getDisplayAnalyzer()->checkVideoExtendedMode()) { 9565efc253a628175c7afa95c431b746ea20052794Andy Qiu bool hasVisibleLayer = mLayerList->hasVisibleLayer(); 9665efc253a628175c7afa95c431b746ea20052794Andy Qiu Drm *drm = hwc.getDrm(); 9765efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hasVisibleLayer == true && mDisplayState == DEVICE_DISPLAY_OFF) { 9865efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("turn on device %d as there is visible layer", mType); 9965efc253a628175c7afa95c431b746ea20052794Andy Qiu if (drm->setDpmsMode(mType, DEVICE_DISPLAY_ON) == true) { 10065efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState = DEVICE_DISPLAY_ON; 10165efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10365efc253a628175c7afa95c431b746ea20052794Andy Qiu if (hasVisibleLayer == false && mDisplayState == DEVICE_DISPLAY_ON) { 10465efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("turn off device %d as there is no visible layer", mType); 10565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (drm->setDpmsMode(mType, DEVICE_DISPLAY_OFF) == true) { 10665efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState = DEVICE_DISPLAY_OFF; 10765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11065efc253a628175c7afa95c431b746ea20052794Andy Qiu#endif 111e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1148a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prePrepare(hwc_display_contents_1_t *display) 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 116e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // for a null list, delete hwc list 119eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mConnected || !display) { 120eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mLayerList) { 121eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mLayerList; 122eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mLayerList = 0; 123eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 1248a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed, if changed delete list 1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if ((display->flags & HWC_GEOMETRY_CHANGED) && mLayerList) { 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mLayerList; 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList = 0; 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1328a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1358a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prepare(hwc_display_contents_1_t *display) 1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 137e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 139eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mConnected || !display) 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed 14325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (display->flags & HWC_GEOMETRY_CHANGED) { 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu onGeometryChanged(display); 14525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (mLayerList && mLayerList->hasProtectedLayer()) { 14625caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener->onProtectedLayerStart(mType); 14725caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 14825caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mLayerList) { 150e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("null HWC layer list"); 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update list with new list 1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mLayerList->update(display); 1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1584b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1594b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiubool PhysicalDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context) 1604b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{ 161e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1624b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 163eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!display || !context || !mLayerList) { 164eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return true; 1654b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu } 1664b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu return context->commitContents(display, mLayerList); 1674b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu} 1684b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 169eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::vsyncControl(bool enabled) 1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 171e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 173e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("disp = %d, enabled = %d", mType, enabled); 174eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mVsyncObserver->control(enabled); 1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 177eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::blank(bool blank) 1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 179e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 18130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 184e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = mBlankControl->blank(mType, blank); 1856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 186e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to blank device"); 1876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1930131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool PhysicalDevice::getDisplaySize(int *width, int *height) 1940131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu{ 1950131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1960131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Mutex::Autolock _l(mLock); 1970131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!width || !height) { 1980131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ETRACE("invalid parameters"); 1990131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2000131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2010131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2020131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = 0; 2030131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = 0; 2040131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu drmModeModeInfo mode; 2050131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 2060131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu bool ret = drm->getModeInfo(mType, mode); 2070131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!ret) { 2080131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2090131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2100131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2110131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = mode.hdisplay; 2120131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = mode.vdisplay; 2130131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 2140131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu} 2150131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2168a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayConfigs(uint32_t *configs, 2176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t *numConfigs) 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 219e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 221eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2233f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 2243f1974031c88750a14adc8f2f49538837238abf9Lin Xie ITRACE("device is not connected"); 2256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2263f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!configs || !numConfigs) { 229e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *configs = 0; 2346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *numConfigs = mDisplayConfigs.size(); 2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2398a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayAttributes(uint32_t configs, 2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu const uint32_t *attributes, 2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int32_t *values) 2426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 243e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 245eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2473f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 2483f1974031c88750a14adc8f2f49538837238abf9Lin Xie ITRACE("device is not connected"); 2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2503f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!attributes || !values) { 253e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(mActiveDisplayConfig); 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!config) { 259e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to get display config"); 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i = 0; 2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) { 2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (attributes[i]) { 2666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_VSYNC_PERIOD: 267bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu if (config->getRefreshRate()) { 268bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu values[i] = 1e9 / config->getRefreshRate(); 269bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 270bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu ETRACE("refresh rate is 0!!!"); 271bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu values[i] = 0; 272bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 2736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_WIDTH: 2756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getWidth(); 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_HEIGHT: 2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getHeight(); 2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_X: 28113bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiX() * 1000.0f; 2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_Y: 28413bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiY() * 1000.0f; 2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 287e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("unknown attribute %d", attributes[i]); 2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i++; 2916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2968a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::compositionComplete() 2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 298e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 299e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // do nothing by default 3006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 3016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3038a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::removeDisplayConfigs() 3046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 3066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 3076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete config; 3086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.clear(); 3116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = -1; 3126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 31430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiubool PhysicalDevice::detectDisplayConfigs() 3156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 316eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3183f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 3193f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!drm->detect(mType)) { 32030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("drm detection on device %d failed ", mType); 32130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return false; 3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3233f1974031c88750a14adc8f2f49538837238abf9Lin Xie return updateDisplayConfigs(); 3243f1974031c88750a14adc8f2f49538837238abf9Lin Xie} 3253f1974031c88750a14adc8f2f49538837238abf9Lin Xie 3263f1974031c88750a14adc8f2f49538837238abf9Lin Xiebool PhysicalDevice::updateDisplayConfigs() 3273f1974031c88750a14adc8f2f49538837238abf9Lin Xie{ 3283f1974031c88750a14adc8f2f49538837238abf9Lin Xie bool ret; 3293f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 3303f1974031c88750a14adc8f2f49538837238abf9Lin Xie 3313f1974031c88750a14adc8f2f49538837238abf9Lin Xie // reset display configs 3323f1974031c88750a14adc8f2f49538837238abf9Lin Xie removeDisplayConfigs(); 3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update device connection status 33530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = drm->isConnected(mType); 33630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) { 33730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 34030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // reset the number of display configs 34130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.setCapacity(1); 3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 34330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu drmModeModeInfo mode; 34430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getModeInfo(mType, mode); 34530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 34630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("failed to get mode info"); 34730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 348e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 349e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 35130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu uint32_t mmWidth, mmHeight; 35230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getPhysicalSize(mType, mmWidth, mmHeight); 35330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 35430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("failed to get physical size"); 35530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 3566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 35930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physWidthInch = (float)mmWidth * 0.039370f; 36030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physHeightInch = (float)mmHeight * 0.039370f; 36130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 36230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use current drm mode, likely it's preferred mode 363bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiX = 0; 364bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiY = 0; 365bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu if (physWidthInch && physHeightInch) { 366bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiX = mode.hdisplay / physWidthInch; 367bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiY = mode.vdisplay / physHeightInch; 368bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 369bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu ETRACE("invalid physical size, EDID read error?"); 370bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu // don't bail out as it is not a fatal error 371bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 37230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use active fb dimension as config width/height 37330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu DisplayConfig *config = new DisplayConfig(mode.vrefresh, 37430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.hdisplay, 37530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.vdisplay, 37630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu dpiX, dpiY); 37730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // add it to the front of other configs 37830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.push_front(config); 37930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 38030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // init the active display config 38130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mActiveDisplayConfig = 0; 3826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 38330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3868a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::initialize() 3876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 388e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 39065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (mType != DEVICE_PRIMARY && mType != DEVICE_EXTERNAL) { 39165efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("invalid device type"); 39265efc253a628175c7afa95c431b746ea20052794Andy Qiu return false; 39365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 39465efc253a628175c7afa95c431b746ea20052794Andy Qiu 3956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect display configs 396e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = detectDisplayConfigs(); 3976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 398e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to detect display config"); 3996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create blank control 4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBlankControl = createBlankControl(); 4036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBlankControl) { 404e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create blank control"); 4056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 40725caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu // create hwc prepare listener 40825caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = createPrepareListener(); 40925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (!mPrepareListener) { 41025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create prepare listener"); 41125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 41225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 4136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create vsync event observer 414eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVsyncObserver = new VsyncEventObserver(*this); 415eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mVsyncObserver || !mVsyncObserver->initialize()) { 416e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create vsync observer"); 4176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 4206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 421e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 422e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 4238a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::deinitialize() 424e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 425e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mLayerList) { 426e2ad4c047651d4442f6a0e002290016d45e9201afu jin delete mLayerList; 427e2ad4c047651d4442f6a0e002290016d45e9201afu jin mLayerList = 0; 428e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 429e2ad4c047651d4442f6a0e002290016d45e9201afu jin 430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mVsyncObserver); 431e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 432e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy blank control 433e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mBlankControl) { 434e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mBlankControl; 435e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mBlankControl = 0; 436e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 4376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 43825caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (mPrepareListener) { 43925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu delete mPrepareListener; 44025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = 0; 44125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 44225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 443e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // remove configs 4446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu removeDisplayConfigs(); 445e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 4466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 4476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4498a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::isConnected() const 4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 451e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 4526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 45330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return mConnected; 4546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4568a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuconst char* PhysicalDevice::getName() const 4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mName; 4596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4618a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuint PhysicalDevice::getType() const 4626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mType; 4646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4668a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onVsync(int64_t timestamp) 4676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 468e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 469e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("timestamp = %lld", timestamp); 4706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 47130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) 4726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // notify hwc 4756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc.vsync(mType, timestamp); 4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4788a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::dump(Dump& d) 4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Device Name: %s (%s)\n", mName, 48230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected ? "connected" : "disconnected"); 4836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display configs (count = %d):\n", mDisplayConfigs.size()); 4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT | DPI_X | DPI_Y \n"); 4856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("--------+--------------+-------+--------+-------+-------\n"); 4866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 4886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (config) { 4896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("%s %2d | %4d | %5d | %4d | %3d | %3d \n", 4906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu (i == (size_t)mActiveDisplayConfig) ? "* " : " ", 4916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i, 4926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getRefreshRate(), 4936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getWidth(), 4946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getHeight(), 4956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiX(), 4966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiY()); 4976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // dump layer list 5006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mLayerList) 5016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList->dump(d); 5026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 5056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 506