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