PhysicalDevice.cpp revision e2ad4c047651d4442f6a0e002290016d45e9201a
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),
416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mVsyncControl(0),
426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mBlankControl(0),
4325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu      mPrepareListener(0),
446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mVsyncObserver(0),
456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mLayerList(0),
466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mConnection(DEVICE_DISCONNECTED),
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");
83e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        delete mLayerList;
84e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
85e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create a new layer list
876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mLayerList = new HwcLayerList(list,
886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                  mDisplayPlaneManager,
896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                  mType);
90e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    if (!mLayerList) {
91e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        WTRACE("failed to create layer list");
9265efc253a628175c7afa95c431b746ea20052794Andy Qiu    } else if (mType == IDisplayDevice::DEVICE_PRIMARY) {
9365efc253a628175c7afa95c431b746ea20052794Andy Qiu#if 0  // display driver does not support run-time power management yet
9465efc253a628175c7afa95c431b746ea20052794Andy Qiu        Hwcomposer& hwc = Hwcomposer::getInstance();
9565efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (hwc.getDisplayAnalyzer()->checkVideoExtendedMode()) {
9665efc253a628175c7afa95c431b746ea20052794Andy Qiu            bool hasVisibleLayer = mLayerList->hasVisibleLayer();
9765efc253a628175c7afa95c431b746ea20052794Andy Qiu            Drm *drm = hwc.getDrm();
9865efc253a628175c7afa95c431b746ea20052794Andy Qiu            if (hasVisibleLayer == true && mDisplayState == DEVICE_DISPLAY_OFF) {
9965efc253a628175c7afa95c431b746ea20052794Andy Qiu                ITRACE("turn on device %d as there is visible layer", mType);
10065efc253a628175c7afa95c431b746ea20052794Andy Qiu                if (drm->setDpmsMode(mType, DEVICE_DISPLAY_ON) == true) {
10165efc253a628175c7afa95c431b746ea20052794Andy Qiu                    mDisplayState = DEVICE_DISPLAY_ON;
10265efc253a628175c7afa95c431b746ea20052794Andy Qiu                }
10365efc253a628175c7afa95c431b746ea20052794Andy Qiu            }
10465efc253a628175c7afa95c431b746ea20052794Andy Qiu            if (hasVisibleLayer == false && mDisplayState == DEVICE_DISPLAY_ON) {
10565efc253a628175c7afa95c431b746ea20052794Andy Qiu                ITRACE("turn off device %d as there is no visible layer", mType);
10665efc253a628175c7afa95c431b746ea20052794Andy Qiu                if (drm->setDpmsMode(mType, DEVICE_DISPLAY_OFF) == true) {
10765efc253a628175c7afa95c431b746ea20052794Andy Qiu                    mDisplayState = DEVICE_DISPLAY_OFF;
10865efc253a628175c7afa95c431b746ea20052794Andy Qiu                }
10965efc253a628175c7afa95c431b746ea20052794Andy Qiu            }
11065efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
11165efc253a628175c7afa95c431b746ea20052794Andy Qiu#endif
112e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    }
1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1158a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prePrepare(hwc_display_contents_1_t *display)
1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
117e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    Mutex::Autolock _l(mLock);
1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
1228a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        return false;
1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // for a null list, delete hwc list
1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!display) {
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        delete mLayerList;
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mLayerList = 0;
1288a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        return true;
1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // check if geometry is changed, if changed delete list
1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if ((display->flags & HWC_GEOMETRY_CHANGED) && mLayerList) {
1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        delete mLayerList;
1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mLayerList = 0;
1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1368a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    return true;
1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1398a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::prepare(hwc_display_contents_1_t *display)
1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
141e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    Mutex::Autolock _l(mLock);
1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return true;
1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!display)
1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return true;
1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // check if geometry is changed
15125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    if (display->flags & HWC_GEOMETRY_CHANGED) {
1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        onGeometryChanged(display);
15325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu        if (mLayerList && mLayerList->hasProtectedLayer()) {
15425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu            mPrepareListener->onProtectedLayerStart(mType);
15525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu        }
15625caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    }
1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!mLayerList) {
158e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("null HWC layer list");
1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // update list with new list
1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return mLayerList->update(display);
1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1664b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
1674b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiubool PhysicalDevice::commit(hwc_display_contents_1_t *display, IDisplayContext *context)
1684b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{
169e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1704b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
1714b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    if (!display || !context) {
1724b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        return false;
1734b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    }
1744b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return context->commitContents(display, mLayerList);
1754b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu}
1764b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
1778a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::vsyncControl(int enabled)
1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
179e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    //Mutex::Autolock _l(mLock);
1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
183e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("disp = %d, enabled = %d", mType, enabled);
1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
185e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    bool ret = mVsyncControl->control(mType, enabled);
1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
187e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed set vsync");
1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mVsyncObserver->control(enabled);
1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1958a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::blank(int blank)
1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
197e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    //Mutex::Autolock _l(mLock);
2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
204e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    bool ret = mBlankControl->blank(mType, blank);
2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
206e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to blank device");
2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2138a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayConfigs(uint32_t *configs,
2146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                         size_t *numConfigs)
2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
216e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
2176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    //Mutex::Autolock _l(mLock);
2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
2216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!configs || !numConfigs) {
224e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("invalid parameters");
2256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    *configs = 0;
2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    *numConfigs = mDisplayConfigs.size();
2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2348a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::getDisplayAttributes(uint32_t configs,
2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                            const uint32_t *attributes,
2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                            int32_t *values)
2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
238e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
2396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    //Mutex::Autolock _l(mLock);
2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
2436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!attributes || !values) {
246e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("invalid parameters");
2476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    DisplayConfig *config = mDisplayConfigs.itemAt(mActiveDisplayConfig);
2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if  (!config) {
252e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to get display config");
2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int i = 0;
2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    while (attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE) {
2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        switch (attributes[i]) {
2596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        case HWC_DISPLAY_VSYNC_PERIOD:
2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            values[i] = 1e9 / config->getRefreshRate();
2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        case HWC_DISPLAY_WIDTH:
2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            values[i] = config->getWidth();
2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        case HWC_DISPLAY_HEIGHT:
2666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            values[i] = config->getHeight();
2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        case HWC_DISPLAY_DPI_X:
26913bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx            values[i] = config->getDpiX() * 1000.0f;
2706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        case HWC_DISPLAY_DPI_Y:
27213bdb2cd1f6556f777b5a17dc549ffc53f2647e8lychenx            values[i] = config->getDpiY() * 1000.0f;
2736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        default:
275e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu            ETRACE("unknown attribute %d", attributes[i]);
2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            break;
2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        i++;
2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2848a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::compositionComplete()
2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
286e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
287e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // do nothing by default
2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2918a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::removeDisplayConfigs()
2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < mDisplayConfigs.size(); i++) {
2946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        DisplayConfig *config = mDisplayConfigs.itemAt(i);
2956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        delete config;
2966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mDisplayConfigs.clear();
2996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mActiveDisplayConfig = -1;
3006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3028a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::updateDisplayConfigs(struct Output *output)
3036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
3046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeConnectorPtr drmConnector;
3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeCrtcPtr drmCrtc;
3066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeModeInfoPtr drmMode;
3076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeModeInfoPtr drmPreferredMode;
3086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeFBPtr drmFb;
3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int drmModeCount;
3106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    float physWidthInch;
3116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    float physHeightInch;
3126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int dpiX, dpiY;
3136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
314e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
3156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    Mutex::Autolock _l(mLock);
3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmConnector = output->connector;
3196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!drmConnector) {
320e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("output has no connector");
3216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    physWidthInch = (float)drmConnector->mmWidth * 0.039370f;
3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    physHeightInch = (float)drmConnector->mmHeight * 0.039370f;
3266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmModeCount = drmConnector->count_modes;
3286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    drmPreferredMode = 0;
3296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // reset display configs
3316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    removeDisplayConfigs();
3326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // reset the number of display configs
3346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mDisplayConfigs.setCapacity(drmModeCount + 1);
3356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
336e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    VTRACE("mode count %d", drmModeCount);
3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // find preferred mode of this display device
3396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (int i = 0; i < drmModeCount; i++) {
3406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        drmMode = &drmConnector->modes[i];
3416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiX = drmMode->hdisplay / physWidthInch;
3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiY = drmMode->vdisplay / physHeightInch;
3436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if ((drmMode->type & DRM_MODE_TYPE_PREFERRED)) {
3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            drmPreferredMode = drmMode;
3466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
3476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
349e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("adding new config %dx%d@%d",
3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->hdisplay,
3516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->vdisplay,
3526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->vrefresh);
3536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // if not preferred mode add it to display configs
3556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        DisplayConfig *config = new DisplayConfig(drmMode->vrefresh,
3566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmMode->hdisplay,
3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmMode->vdisplay,
3586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  dpiX, dpiY);
3596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mDisplayConfigs.add(config);
3606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // update device connection status
3636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mConnection = (output->connected) ? DEVICE_CONNECTED : DEVICE_DISCONNECTED;
3646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // if device is connected, continue checking current mode
3666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
3676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        goto use_preferred_mode;
3686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    else if (mConnection == DEVICE_CONNECTED) {
3696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // use active fb and mode
3706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        drmCrtc = output->crtc;
3716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        drmFb = output->fb;
3726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!drmCrtc || !drmFb) {
373e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu            ETRACE("impossible");
3746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            goto use_preferred_mode;
3756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
3766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        drmMode = &drmCrtc->mode;
3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!drmCrtc->mode_valid)
3796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            goto use_preferred_mode;
3806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
381e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("using current mode %dx%d@%d",
3826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->hdisplay,
3836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->vdisplay,
3846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmMode->vrefresh);
3856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // use current drm mode, likely it's preferred mode
3876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiX = drmMode->hdisplay / physWidthInch;
3886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiY = drmMode->vdisplay / physHeightInch;
3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // use active fb dimension as config width/height
3906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        DisplayConfig *config = new DisplayConfig(drmMode->vrefresh,
3916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  //drmFb->width,
3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  //drmFb->height,
3936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmMode->hdisplay,
3946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmMode->vdisplay,
3956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  dpiX, dpiY);
3966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // add it to the front of other configs
3976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mDisplayConfigs.push_front(config);
3986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // init the active display config
4016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mActiveDisplayConfig = 0;
4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
4046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuuse_preferred_mode:
4056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (drmPreferredMode) {
4066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiX = drmPreferredMode->hdisplay / physWidthInch;
4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        dpiY = drmPreferredMode->vdisplay / physHeightInch;
4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        DisplayConfig *config = new DisplayConfig(drmPreferredMode->vrefresh,
4096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmPreferredMode->hdisplay,
4106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  drmPreferredMode->vdisplay,
4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                                  dpiX, dpiY);
4126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!config) {
413e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu            ETRACE("failed to allocate display config");
4146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            return false;
4156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
4166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
417e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("using preferred mode %dx%d@%d",
4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmPreferredMode->hdisplay,
4196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmPreferredMode->vdisplay,
4206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu              drmPreferredMode->vrefresh);
4216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // add it to the front of other configs
4236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mDisplayConfigs.push_front(config);
4246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // init the active display config
4276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mActiveDisplayConfig = 0;
4286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
4296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4318a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::detectDisplayConfigs()
4326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
4336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    struct Output *output;
4346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool ret;
435e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    Drm *drm = Hwcomposer::getInstance().getDrm();
436e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
437e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
4386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
439e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (!drm) {
440e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to get drm");
441e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        return false;
442e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
4436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // detect
445e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    ret = drm->detect();
4466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
447e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("drm detection failed");
4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
4496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // get output
45265efc253a628175c7afa95c431b746ea20052794Andy Qiu    output = drm->getOutput(mType);
4536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!output) {
454e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to get output");
4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
4566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // update display configs
4596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return updateDisplayConfigs(output);
4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4628a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::initialize()
4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
464e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
46665efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (mType != DEVICE_PRIMARY && mType != DEVICE_EXTERNAL) {
46765efc253a628175c7afa95c431b746ea20052794Andy Qiu        ETRACE("invalid device type");
46865efc253a628175c7afa95c431b746ea20052794Andy Qiu        return false;
46965efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
47065efc253a628175c7afa95c431b746ea20052794Andy Qiu
4716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // detect display configs
472e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    bool ret = detectDisplayConfigs();
4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret == false) {
474e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to detect display config");
4756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create vsync control
4786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mVsyncControl = createVsyncControl();
4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!mVsyncControl) {
480e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create vsync control");
4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create blank control
4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mBlankControl = createBlankControl();
4856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!mBlankControl) {
486e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create blank control");
4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
48925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    // create hwc prepare listener
49025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    mPrepareListener = createPrepareListener();
49125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    if (!mPrepareListener) {
49225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create prepare listener");
49325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    }
49425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu
4956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create vsync event observer
4966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mVsyncObserver = new VsyncEventObserver(*this, *mVsyncControl);
4976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!mVsyncObserver.get()) {
498e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create vsync observer");
4996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
5006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = true;
5026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
503e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li}
504e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
5058a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::deinitialize()
506e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{
507e2ad4c047651d4442f6a0e002290016d45e9201afu jin    if (mLayerList) {
508e2ad4c047651d4442f6a0e002290016d45e9201afu jin        delete mLayerList;
509e2ad4c047651d4442f6a0e002290016d45e9201afu jin        mLayerList = 0;
510e2ad4c047651d4442f6a0e002290016d45e9201afu jin    }
511e2ad4c047651d4442f6a0e002290016d45e9201afu jin
512e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // destroy vsync event observer
513e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (mVsyncObserver.get()) {
514e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mVsyncObserver->requestExit();
515e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mVsyncObserver = 0;
516e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
517e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
518e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // destroy blank control
519e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (mBlankControl) {
520e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        delete mBlankControl;
521e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mBlankControl = 0;
522e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
5236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
524e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // destroy vsync control
525e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (mVsyncControl) {
526e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        delete mVsyncControl;
527e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mVsyncControl = 0;
528e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
529e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
53025caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    if (mPrepareListener) {
53125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu        delete mPrepareListener;
53225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu        mPrepareListener = 0;
53325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    }
53425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu
535e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // remove configs
5366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    removeDisplayConfigs();
537e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
5386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = false;
5396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5418a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiubool PhysicalDevice::isConnected() const
5426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
543e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
5446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return (mConnection == DEVICE_CONNECTED) ? true : false;
5466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5488a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuconst char* PhysicalDevice::getName() const
5496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
5506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return mName;
5516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5538a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuint PhysicalDevice::getType() const
5546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
5556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return mType;
5566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5588a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::onVsync(int64_t timestamp)
5596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
560e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_VOID_IF_NOT_INIT();
561e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("timestamp = %lld", timestamp);
5626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    //Mutex::Autolock _l(mLock);
5646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mConnection != DEVICE_CONNECTED)
5666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return;
5676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // notify hwc
5696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mHwc.vsync(mType, timestamp);
5706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5728a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiuvoid PhysicalDevice::dump(Dump& d)
5736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
5746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    d.append("-------------------------------------------------------------\n");
5756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    d.append("Device Name: %s (%s)\n", mName,
5766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            mConnection ? "connected" : "disconnected");
5776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    d.append("Display configs (count = %d):\n", mDisplayConfigs.size());
5786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT | DPI_X | DPI_Y \n");
5796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    d.append("--------+--------------+-------+--------+-------+-------\n");
5806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < mDisplayConfigs.size(); i++) {
5816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        DisplayConfig *config = mDisplayConfigs.itemAt(i);
5826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (config) {
5836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            d.append("%s %2d   |     %4d     | %5d |  %4d  |  %3d  |  %3d  \n",
5846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     (i == (size_t)mActiveDisplayConfig) ? "* " : "  ",
5856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     i,
5866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     config->getRefreshRate(),
5876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     config->getWidth(),
5886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     config->getHeight(),
5896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     config->getDpiX(),
5906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                     config->getDpiY());
5916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
5926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
5936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump layer list
5946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mLayerList)
5956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mLayerList->dump(d);
5966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
5976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
5986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
5996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
600