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