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