16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h> 18452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish#include <common/base/Drm.h> 198a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu#include <PhysicalDevice.h> 206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 248a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy QiuPhysicalDevice::PhysicalDevice(uint32_t type, Hwcomposer& hwc, DisplayPlaneManager& dpm) 256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu : mType(type), 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc(hwc), 276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayPlaneManager(dpm), 286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig(-1), 29eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankControl(NULL), 30eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVsyncObserver(NULL), 31eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mLayerList(NULL), 3230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected(false), 332413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin mBlank(false), 3465efc253a628175c7afa95c431b746ea20052794Andy Qiu mDisplayState(DEVICE_DISPLAY_ON), 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 37e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (type) { 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_PRIMARY: 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Primary"; 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case DEVICE_EXTERNAL: 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "External"; 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mName = "Unknown"; 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.setCapacity(DEVICE_COUNT); 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 538a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy QiuPhysicalDevice::~PhysicalDevice() 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 55e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 588a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onGeometryChanged(hwc_display_contents_1_t *list) 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 60e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!list) { 614157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("list is NULL"); 62e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu return; 63e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 64e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 654157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("disp = %d, layer number = %d", mType, list->numHwLayers); 66e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 67e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // NOTE: should NOT be here 68e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mLayerList) { 694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("mLayerList exists"); 70d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 71e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 72e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create a new layer list 749d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mLayerList = new HwcLayerList(list, mType); 75e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (!mLayerList) { 764157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("failed to create layer list"); 77e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 808a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prePrepare(hwc_display_contents_1_t *display) 816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 82e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // for a null list, delete hwc list 8594dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!mConnected || !display || mBlank) { 86eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mLayerList) { 87d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 88eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 898a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed, if changed delete list 936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if ((display->flags & HWC_GEOMETRY_CHANGED) && mLayerList) { 94d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 968a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu return true; 976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 998a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prepare(hwc_display_contents_1_t *display) 1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 101e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 10394dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!mConnected || !display || mBlank) 1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check if geometry is changed 10725caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu if (display->flags & HWC_GEOMETRY_CHANGED) { 1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu onGeometryChanged(display); 10925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu } 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mLayerList) { 1114157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("null HWC layer list"); 112be7e9c0f7c3a2016141e4cb57f44cfcdb5df4a65Andy Qiu return true; 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update list with new list 1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mLayerList->update(display); 1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1194b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 1204b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiubool PhysicalDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context) 1214b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{ 122e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1234b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 12494dea62dfa3ec5a26a39e68f39ff0c166f126affTan Wei if (!display || !context || !mLayerList || mBlank) { 125eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return true; 1264b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu } 1274b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu return context->commitContents(display, mLayerList); 1284b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu} 1294b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu 130eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::vsyncControl(bool enabled) 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 132e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1344157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("disp = %d, enabled = %d", mType, enabled); 135eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mVsyncObserver->control(enabled); 1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 138eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool PhysicalDevice::blank(bool blank) 1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 140e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1419c9829d3ea5f72dbe1ceb1f09607b1c2ed13faa7Marc Mao 1429c9829d3ea5f72dbe1ceb1f09607b1c2ed13faa7Marc Mao mBlank = blank; 143e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = mBlankControl->blank(mType, blank); 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 1454157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to blank device"); 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1520131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool PhysicalDevice::getDisplaySize(int *width, int *height) 1530131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu{ 1540131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1550131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Mutex::Autolock _l(mLock); 1560131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!width || !height) { 1574157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid parameters"); 1580131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 1590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 1600131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 1610131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = 0; 1620131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = 0; 1630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu drmModeModeInfo mode; 1640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 1650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu bool ret = drm->getModeInfo(mType, mode); 1660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!ret) { 1670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 1680131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 1690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 1700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *width = mode.hdisplay; 1710131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu *height = mode.vdisplay; 1720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 1730131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu} 1740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 175452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishtemplate <typename T> 176452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishstatic inline T min(T a, T b) { 177452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return a<b ? a : b; 178452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish} 179452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 1808a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayConfigs(uint32_t *configs, 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t *numConfigs) 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 183e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 185eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1873f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 1884157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ILOGTRACE("device is not connected"); 1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1903f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 192452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (!configs || !numConfigs || *numConfigs < 1) { 1934157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid parameters"); 1946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 197452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish // fill in all config handles 198452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish *numConfigs = min(*numConfigs, mDisplayConfigs.size()); 199452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish for (int i = 0; i < static_cast<int>(*numConfigs); i++) { 200452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish configs[i] = i; 201452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish } 2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 206452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool PhysicalDevice::getDisplayAttributes(uint32_t config, 2070594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel const uint32_t *attributes, 2080594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel int32_t *values) 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 210e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 212eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2143f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!mConnected) { 2154157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ILOGTRACE("device is not connected"); 2166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2173f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!attributes || !values) { 2204157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid parameters"); 2216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 224452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish DisplayConfig *configChosen = mDisplayConfigs.itemAt(config); 225452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (!configChosen) { 2264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("failed to get display config"); 2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i = 0; 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) { 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (attributes[i]) { 2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_VSYNC_PERIOD: 234452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (configChosen->getRefreshRate()) { 235452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish values[i] = 1e9 / configChosen->getRefreshRate(); 236bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 2374157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("refresh rate is 0!!!"); 238bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu values[i] = 0; 239bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_WIDTH: 242452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish values[i] = configChosen->getWidth(); 2436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_HEIGHT: 245452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish values[i] = configChosen->getHeight(); 2466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_X: 248452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish values[i] = configChosen->getDpiX() * 1000.0f; 2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case HWC_DISPLAY_DPI_Y: 251452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish values[i] = configChosen->getDpiY() * 1000.0f; 2526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu default: 2544157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("unknown attribute %d", attributes[i]); 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i++; 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2638a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::compositionComplete() 2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 265e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 266e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // do nothing by default 2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2708a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::removeDisplayConfigs() 2716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 2736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 2746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete config; 2756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDisplayConfigs.clear(); 2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mActiveDisplayConfig = -1; 2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 28130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiubool PhysicalDevice::detectDisplayConfigs() 2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 283eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock _l(mLock); 2846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2853f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 2863f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (!drm->detect(mType)) { 2874157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("drm detection on device %d failed ", mType); 28830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return false; 2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2903f1974031c88750a14adc8f2f49538837238abf9Lin Xie return updateDisplayConfigs(); 2913f1974031c88750a14adc8f2f49538837238abf9Lin Xie} 2923f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2933f1974031c88750a14adc8f2f49538837238abf9Lin Xiebool PhysicalDevice::updateDisplayConfigs() 2943f1974031c88750a14adc8f2f49538837238abf9Lin Xie{ 2953f1974031c88750a14adc8f2f49538837238abf9Lin Xie bool ret; 2963f1974031c88750a14adc8f2f49538837238abf9Lin Xie Drm *drm = Hwcomposer::getInstance().getDrm(); 2973f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2983f1974031c88750a14adc8f2f49538837238abf9Lin Xie // reset display configs 2993f1974031c88750a14adc8f2f49538837238abf9Lin Xie removeDisplayConfigs(); 3006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update device connection status 30230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = drm->isConnected(mType); 30330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) { 30430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 30730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // reset the number of display configs 30830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.setCapacity(1); 3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 31030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu drmModeModeInfo mode; 31130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getModeInfo(mType, mode); 31230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 3134157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get mode info"); 31430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 315e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 316e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 31830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu uint32_t mmWidth, mmHeight; 31930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ret = drm->getPhysicalSize(mType, mmWidth, mmHeight); 32030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!ret) { 3214157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get physical size"); 32230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected = false; 3236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 32630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physWidthInch = (float)mmWidth * 0.039370f; 32730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu float physHeightInch = (float)mmHeight * 0.039370f; 32830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 32930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use current drm mode, likely it's preferred mode 330bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiX = 0; 331bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu int dpiY = 0; 332bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu if (physWidthInch && physHeightInch) { 333bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiX = mode.hdisplay / physWidthInch; 334bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu dpiY = mode.vdisplay / physHeightInch; 335bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } else { 3364157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid physical size, EDID read error?"); 337bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu // don't bail out as it is not a fatal error 338bf6077e87709f8b025a040030e38c1af9aba73f5Andy Qiu } 33930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // use active fb dimension as config width/height 34030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu DisplayConfig *config = new DisplayConfig(mode.vrefresh, 34130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.hdisplay, 34230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mode.vdisplay, 34330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu dpiX, dpiY); 34430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // add it to the front of other configs 34530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mDisplayConfigs.push_front(config); 34630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 34730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // init the active display config 34830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mActiveDisplayConfig = 0; 3496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 350452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish drmModeModeInfoPtr modes; 351452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish drmModeModeInfoPtr compatMode; 352452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish int modeCount = 0; 353452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 354452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish modes = drm->detectAllConfigs(mType, &modeCount); 355452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 356452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish for (int i = 0; i < modeCount; i++) { 357452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (modes) { 358452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish compatMode = &modes[i]; 359452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (!compatMode) 360452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish continue; 361452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (compatMode->hdisplay == mode.hdisplay && 362452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish compatMode->vdisplay == mode.vdisplay && 363452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish compatMode->vrefresh != mode.vrefresh) { 3645cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang 3655cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang bool found = false; 3665cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang for (size_t j = 0; j < mDisplayConfigs.size(); j++) { 3675cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang DisplayConfig *config = mDisplayConfigs.itemAt(j); 3685cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang if (config->getRefreshRate() == (int)compatMode->vrefresh) { 3695cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang found = true; 3705cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang break; 3715cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang } 3725cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang } 3735cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang 3745cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang if (found) { 3755cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang continue; 3765cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang } 3775cffb38618ebbaa5627edcc0b8068ba28b0d50e8Lei Zhang 378452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish DisplayConfig *config = new DisplayConfig(compatMode->vrefresh, 379452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish compatMode->hdisplay, 380452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish compatMode->vdisplay, 381452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish dpiX, dpiY); 382452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish // add it to the end of configs 383452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish mDisplayConfigs.push_back(config); 384452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish } 385452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish } 386452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish } 387452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 38830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return true; 3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3918a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::initialize() 3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 393e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 3946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 39565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (mType != DEVICE_PRIMARY && mType != DEVICE_EXTERNAL) { 3964157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid device type"); 39765efc253a628175c7afa95c431b746ea20052794Andy Qiu return false; 39865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 39965efc253a628175c7afa95c431b746ea20052794Andy Qiu 4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect display configs 401e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu bool ret = detectDisplayConfigs(); 4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 403e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to detect display config"); 4046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create blank control 4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBlankControl = createBlankControl(); 4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBlankControl) { 409e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create blank control"); 4106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create vsync event observer 413eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVsyncObserver = new VsyncEventObserver(*this); 414eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mVsyncObserver || !mVsyncObserver->initialize()) { 415e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create vsync observer"); 4166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 4196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 420e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 421e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 4228a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::deinitialize() 423e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 424e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mLayerList) { 425d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DEINIT_AND_DELETE_OBJ(mLayerList); 426e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 427e2ad4c047651d4442f6a0e002290016d45e9201afu jin 428eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mVsyncObserver); 429e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 430e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // destroy blank control 431e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (mBlankControl) { 432e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li delete mBlankControl; 433e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mBlankControl = 0; 434e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 4356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 436e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // remove configs 4376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu removeDisplayConfigs(); 438e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 4396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 4406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4428a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::isConnected() const 4436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 444e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 4456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 44630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return mConnected; 4476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4498a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuconst char* PhysicalDevice::getName() const 4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mName; 4526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4548a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuint PhysicalDevice::getType() const 4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mType; 4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4598a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onVsync(int64_t timestamp) 4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 461e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 4624157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("timestamp = %lld", timestamp); 4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 46430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mConnected) 4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 4666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // notify hwc 4686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mHwc.vsync(mType, timestamp); 4696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4718a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::dump(Dump& d) 4726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 4746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Device Name: %s (%s)\n", mName, 47530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mConnected ? "connected" : "disconnected"); 4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display configs (count = %d):\n", mDisplayConfigs.size()); 4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT | DPI_X | DPI_Y \n"); 4786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("--------+--------------+-------+--------+-------+-------\n"); 4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (size_t i = 0; i < mDisplayConfigs.size(); i++) { 4806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayConfig *config = mDisplayConfigs.itemAt(i); 4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (config) { 4826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("%s %2d | %4d | %5d | %4d | %3d | %3d \n", 4836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu (i == (size_t)mActiveDisplayConfig) ? "* " : " ", 4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu i, 4856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getRefreshRate(), 4866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getWidth(), 4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getHeight(), 4886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiX(), 4896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu config->getDpiY()); 4906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // dump layer list 4936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mLayerList) 4946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mLayerList->dump(d); 4956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 497452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool PhysicalDevice::setPowerMode(int mode) 498452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{ 499452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish // TODO: set proper blanking modes for HWC 1.4 modes 500452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish switch (mode) { 501452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish case HWC_POWER_MODE_OFF: 502452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish case HWC_POWER_MODE_DOZE: 503452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return blank(true); 504452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish case HWC_POWER_MODE_NORMAL: 505452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish case HWC_POWER_MODE_DOZE_SUSPEND: 506452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return blank(false); 507452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish default: 508452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return false; 509452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish } 510452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return false; 511452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish} 512452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 513452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishint PhysicalDevice::getActiveConfig() 514452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{ 515452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return mActiveDisplayConfig; 516452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish} 517452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 518452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool PhysicalDevice::setActiveConfig(int index) 519452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{ 520452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish // TODO: for now only implement in external 521452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish if (index == 0) 522452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return true; 523452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish return false; 524452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish} 525452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish 5266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 5276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 528