PhysicalDevice.cpp revision 94dea62dfa3ec5a26a39e68f39ff0c166f126aff
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), 462413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin mBlank(false), 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"); 83d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 84e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 85e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create a new layer list 879d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mLayerList = new HwcLayerList(list, mType); 88e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!mLayerList) { 89e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu WTRACE("failed to create layer list"); 90e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 938a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prePrepare(hwc_display_contents_1_t *display) 946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 95e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // for a null list, delete hwc list 9894dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!mConnected || !display || mBlank) { 99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mLayerList) { 100d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 101eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 1028a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed, if changed delete list 1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if ((display->flags & HWC_GEOMETRY_CHANGED) && mLayerList) { 107d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1098a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1128a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prepare(hwc_display_contents_1_t *display) 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 114e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 11694dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!mConnected || !display || mBlank) 1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed 12025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (display->flags & HWC_GEOMETRY_CHANGED) { 1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu onGeometryChanged(display); 12225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mLayerList) { 124be7e9c0f7c3a2016141e4cb57f44cfcdb5df4a65Andy Qiu WTRACE("null HWC layer list"); 125be7e9c0f7c3a2016141e4cb57f44cfcdb5df4a65Andy Qiu return true; 1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update list with new list 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mLayerList->update(display); 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1324b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1334b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiubool PhysicalDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context) 1344b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{ 135e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1364b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 13794dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!display || !context || !mLayerList || mBlank) { 138eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return true; 1394b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu } 1404b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu return context->commitContents(display, mLayerList); 1414b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu} 1424b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 143eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::vsyncControl(bool enabled) 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 145e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 147e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("disp = %d, enabled = %d", mType, enabled); 148eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mVsyncObserver->control(enabled); 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 151eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::blank(bool blank) 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 153e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1549c9829d3ea5f72dbe1ceb1f09607b1c2ed13faa7Marc Mao 15530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) 1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1589c9829d3ea5f72dbe1ceb1f09607b1c2ed13faa7Marc Mao mBlank = blank; 159e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = mBlankControl->blank(mType, blank); 1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 161e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("failed to blank device"); 1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1680131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool PhysicalDevice::getDisplaySize(int *width, int *height) 1690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu{ 1700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1710131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Mutex::Autolock _l(mLock); 1720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!width || !height) { 1730131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ETRACE("invalid parameters"); 1740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 1750131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 1760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 1770131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = 0; 1780131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = 0; 1790131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu drmModeModeInfo mode; 1800131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 1810131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu bool ret = drm->getModeInfo(mType, mode); 1820131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!ret) { 1830131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 1840131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 1850131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 1860131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = mode.hdisplay; 1870131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = mode.vdisplay; 1880131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 1890131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu} 1900131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 1918a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayConfigs(uint32_t *configs, 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t *numConfigs) 1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 194e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 196eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 1976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1983f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 1993f1974031c88750a14adc8f2f49538837238abf9Lin Xie ITRACE("device is not connected"); 2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2013f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!configs || !numConfigs) { 204e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *configs = 0; 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *numConfigs = mDisplayConfigs.size(); 2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2148a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayAttributes(uint32_t configs, 2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu const uint32_t *attributes, 2166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int32_t *values) 2176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 218e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 220eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2223f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 2233f1974031c88750a14adc8f2f49538837238abf9Lin Xie ITRACE("device is not connected"); 2246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2253f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!attributes || !values) { 228e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("invalid parameters"); 2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(mActiveDisplayConfig); 2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!config) { 23451779bcebdb675fefc8a23f17e4e1070590f85a0Andy Qiu WTRACE("failed to get display config"); 2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i = 0; 2396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) { 2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (attributes[i]) { 2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_VSYNC_PERIOD: 242bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu if (config->getRefreshRate()) { 243bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu values[i] = 1e9 / config->getRefreshRate(); 244bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 245bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu ETRACE("refresh rate is 0!!!"); 246bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu values[i] = 0; 247bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 2486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_WIDTH: 2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getWidth(); 2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_HEIGHT: 2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu values[i] = config->getHeight(); 2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_X: 25613bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiX() * 1000.0f; 2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_Y: 25913bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx values[i] = config->getDpiY() * 1000.0f; 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 262e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ETRACE("unknown attribute %d", attributes[i]); 2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i++; 2666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2718a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::compositionComplete() 2726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 273e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 274e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // do nothing by default 2756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2788a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::removeDisplayConfigs() 2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete config; 2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.clear(); 2866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = -1; 2876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 28930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiubool PhysicalDevice::detectDisplayConfigs() 2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 291eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2933f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 2943f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!drm->detect(mType)) { 29530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("drm detection on device %d failed ", mType); 29630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return false; 2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2983f1974031c88750a14adc8f2f49538837238abf9Lin Xie return updateDisplayConfigs(); 2993f1974031c88750a14adc8f2f49538837238abf9Lin Xie} 3003f1974031c88750a14adc8f2f49538837238abf9Lin Xie 3013f1974031c88750a14adc8f2f49538837238abf9Lin Xiebool PhysicalDevice::updateDisplayConfigs() 3023f1974031c88750a14adc8f2f49538837238abf9Lin Xie{ 3033f1974031c88750a14adc8f2f49538837238abf9Lin Xie bool ret; 3043f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 3053f1974031c88750a14adc8f2f49538837238abf9Lin Xie 3063f1974031c88750a14adc8f2f49538837238abf9Lin Xie // reset display configs 3073f1974031c88750a14adc8f2f49538837238abf9Lin Xie removeDisplayConfigs(); 3086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update device connection status 31030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = drm->isConnected(mType); 31130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) { 31230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 31530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // reset the number of display configs 31630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.setCapacity(1); 3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 31830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu drmModeModeInfo mode; 31930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getModeInfo(mType, mode); 32030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 32130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("failed to get mode info"); 32230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 323e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 324e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 32630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu uint32_t mmWidth, mmHeight; 32730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getPhysicalSize(mType, mmWidth, mmHeight); 32830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 32930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("failed to get physical size"); 33030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 3316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 3326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 33430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physWidthInch = (float)mmWidth * 0.039370f; 33530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physHeightInch = (float)mmHeight * 0.039370f; 33630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 33730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use current drm mode, likely it's preferred mode 338bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiX = 0; 339bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiY = 0; 340bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu if (physWidthInch && physHeightInch) { 341bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiX = mode.hdisplay / physWidthInch; 342bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiY = mode.vdisplay / physHeightInch; 343bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 344bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu ETRACE("invalid physical size, EDID read error?"); 345bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu // don't bail out as it is not a fatal error 346bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 34730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use active fb dimension as config width/height 34830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu DisplayConfig *config = new DisplayConfig(mode.vrefresh, 34930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.hdisplay, 35030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.vdisplay, 35130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu dpiX, dpiY); 35230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // add it to the front of other configs 35330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.push_front(config); 35430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 35530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // init the active display config 35630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mActiveDisplayConfig = 0; 3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 35830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3618a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::initialize() 3626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 363e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 3646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 36565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (mType != DEVICE_PRIMARY && mType != DEVICE_EXTERNAL) { 36665efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("invalid device type"); 36765efc253a628175c7afa95c431b746ea20052794Andy Qiu return false; 36865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 36965efc253a628175c7afa95c431b746ea20052794Andy Qiu 3706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect display configs 371e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = detectDisplayConfigs(); 3726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 373e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to detect display config"); 3746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create blank control 3776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBlankControl = createBlankControl(); 3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBlankControl) { 379e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create blank control"); 3806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 38225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu // create hwc prepare listener 38325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = createPrepareListener(); 38425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (!mPrepareListener) { 38525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create prepare listener"); 38625caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 38725caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 3886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create vsync event observer 389eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVsyncObserver = new VsyncEventObserver(*this); 390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mVsyncObserver || !mVsyncObserver->initialize()) { 391e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create vsync observer"); 3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 3956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 396e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 397e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 3988a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::deinitialize() 399e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 400e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mLayerList) { 401d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 402e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 403e2ad4c047651d4442f6a0e002290016d45e9201afu jin 404eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mVsyncObserver); 405e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 406e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy blank control 407e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mBlankControl) { 408e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mBlankControl; 409e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mBlankControl = 0; 410e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 41225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (mPrepareListener) { 41325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu delete mPrepareListener; 41425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mPrepareListener = 0; 41525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 41625caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu 417e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // remove configs 4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu removeDisplayConfigs(); 419e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 4206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 4216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4238a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::isConnected() const 4246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 425e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 4266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 42730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return mConnected; 4286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4308a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuconst char* PhysicalDevice::getName() const 4316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mName; 4336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4358a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuint PhysicalDevice::getType() const 4366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mType; 4386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4408a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onVsync(int64_t timestamp) 4416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 442e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 443e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu ATRACE("timestamp = %lld", timestamp); 4446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 44530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) 4466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 4476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // notify hwc 4496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc.vsync(mType, timestamp); 4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4528a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::dump(Dump& d) 4536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Device Name: %s (%s)\n", mName, 45630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected ? "connected" : "disconnected"); 4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display configs (count = %d):\n", mDisplayConfigs.size()); 4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT | DPI_X | DPI_Y \n"); 4596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("--------+--------------+-------+--------+-------+-------\n"); 4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 4616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 4626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (config) { 4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("%s %2d | %4d | %5d | %4d | %3d | %3d \n", 4646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu (i == (size_t)mActiveDisplayConfig) ? "* " : " ", 4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i, 4666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getRefreshRate(), 4676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getWidth(), 4686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getHeight(), 4696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiX(), 4706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiY()); 4716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // dump layer list 4746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mLayerList) 4756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList->dump(d); 4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 480