16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h>
180594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/Dump.h>
19466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu#include <UeventObserver.h>
206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
246a6081a46a83da606cf21548879b37695adc7e1fAndy QiuHwcomposer* Hwcomposer::sInstance(0);
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
266a6081a46a83da606cf21548879b37695adc7e1fAndy QiuHwcomposer::Hwcomposer()
276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    : mProcs(0),
286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mDrm(0),
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mPlaneManager(0),
306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mBufferManager(0),
3165efc253a628175c7afa95c431b746ea20052794Andy Qiu      mDisplayAnalyzer(0),
324b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu      mDisplayContext(0),
33466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu      mUeventObserver(0),
346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mInitialized(false)
356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
36e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
388a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    mDisplayDevices.setCapacity(IDisplayDevice::DEVICE_COUNT);
3974710b4ad2ddb93327eb3518d9662a6656d640f8fu jin    mDisplayDevices.clear();
406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
426a6081a46a83da606cf21548879b37695adc7e1fAndy QiuHwcomposer::~Hwcomposer()
436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
44e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
45e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    deinitialize();
466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::initCheck() const
496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return mInitialized;
516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::prepare(size_t numDisplays,
546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                          hwc_display_contents_1_t** displays)
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool ret = true;
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
58e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("display count = %d", numDisplays);
606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!numDisplays || !displays) {
624157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid parameters");
636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
6665efc253a628175c7afa95c431b746ea20052794Andy Qiu    mDisplayAnalyzer->analyzeContents(numDisplays, displays);
6765efc253a628175c7afa95c431b746ea20052794Andy Qiu
686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // disable reclaimed planes
69e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mPlaneManager->disableReclaimedPlanes();
706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // reclaim all allocated planes if possible
726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < numDisplays; i++) {
73c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        if (i >= mDisplayDevices.size()) {
74c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel            continue;
75c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        }
768a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = mDisplayDevices.itemAt(i);
776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!device) {
784157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            VLOGTRACE("device %d doesn't exist", i);
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        device->prePrepare(displays[i]);
826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < numDisplays; i++) {
85c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        if (i >= mDisplayDevices.size()) {
86c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel            continue;
87c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        }
888a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = mDisplayDevices.itemAt(i);
896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!device) {
904157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            VLOGTRACE("device %d doesn't exist", i);
916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        ret = device->prepare(displays[i]);
946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (ret == false) {
954157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            ELOGTRACE("failed to do prepare for device %d", i);
966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return ret;
1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::commit(size_t numDisplays,
1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                         hwc_display_contents_1_t **displays)
1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool ret = true;
1076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
108e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1094157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("display count = %d", numDisplays);
1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!numDisplays || !displays) {
1124157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid parameters");
1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
116e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mDisplayContext->commitBegin(numDisplays, displays);
1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < numDisplays; i++) {
119c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        if (i >= mDisplayDevices.size()) {
120c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel            continue;
121c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        }
1228a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = mDisplayDevices.itemAt(i);
1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!device) {
1244157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            VLOGTRACE("device %d doesn't exist", i);
1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!device->isConnected()) {
1294157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            VLOGTRACE("device %d is disconnected", i);
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1334b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu        ret = device->commit(displays[i], mDisplayContext);
1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (ret == false) {
1354157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            ELOGTRACE("failed to do commit for device %d", i);
1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            continue;
1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
140e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mDisplayContext->commitEnd(numDisplays, displays);
141eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // return true always
142eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return true;
1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::vsyncControl(int disp, int enabled)
1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
147e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("disp = %d, enabled = %d", disp, enabled);
149aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu
150aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
1514157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
152aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu        return false;
153aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    }
154aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    if (disp >= (int) mDisplayDevices.size()) {
155aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu        return false;
156aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    }
157aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
158aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    if (!device) {
1594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
160aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu        return false;
161aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    }
162aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu
163aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu    return device->vsyncControl(enabled ? true : false);
1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::blank(int disp, int blank)
1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
168e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("disp = %d, blank = %d", disp, blank);
1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1718a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
1724157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
1736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1750594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    if (disp >= (int) mDisplayDevices.size()) {
176c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        return false;
177c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel    }
1788a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
1796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!device) {
1804157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
184eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return device->blank(blank ? true : false);
1856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::getDisplayConfigs(int disp,
1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                      uint32_t *configs,
1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                      size_t *numConfigs)
1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
191e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1938a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
1944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1970594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    if (disp >= (int) mDisplayDevices.size()) {
198c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        return false;
199c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel    }
2008a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
2016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!device) {
2024157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device %d found", disp);
2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return device->getDisplayConfigs(configs, numConfigs);
2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::getDisplayAttributes(int disp,
2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                         uint32_t config,
2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                         const uint32_t *attributes,
2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu                                         int32_t *values)
2136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
214e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2168a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
2174157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2200594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    if (disp >= (int) mDisplayDevices.size()) {
221c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        return false;
222c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel    }
2238a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
2246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!device) {
2254157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
2266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return device->getDisplayAttributes(config, attributes, values);
2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::compositionComplete(int disp)
2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
234e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2368a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
2374157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
2386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2414b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    mDisplayContext->compositionComplete();
2420594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    if (disp >= (int) mDisplayDevices.size()) {
243c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        return false;
244c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel    }
2454b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
2468a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
2476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!device) {
2484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return device->compositionComplete();
2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
255452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool Hwcomposer::setPowerMode(int disp, int mode)
256452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
257452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    RETURN_FALSE_IF_NOT_INIT();
258452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
259452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
2604157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
261452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return false;
262452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
263452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
264452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
265452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (!device) {
2664157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
267452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return false;
268452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
269452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
270452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return device->setPowerMode(mode);
271452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
272452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
273452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishint Hwcomposer::getActiveConfig(int disp)
274452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
275452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    RETURN_NULL_IF_NOT_INIT();
276452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
277452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
2784157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
279452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -1;
280452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
281452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
282452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
283452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (!device) {
2844157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
285452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return -1;
286452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
287452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
288452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return device->getActiveConfig();
289452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
290452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
291452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool Hwcomposer::setActiveConfig(int disp, int index)
292452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
293452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    RETURN_FALSE_IF_NOT_INIT();
294452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
295452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
2964157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
297452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return false;
298452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
299452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
300452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    IDisplayDevice *device = mDisplayDevices.itemAt(disp);
301452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    if (!device) {
3024157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no device found");
303452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return false;
304452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
305452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
306452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    return device->setActiveConfig(index);
307452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
308452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
309452fbc109a9c585737bcac18f19aff40574c3d79Jim Bishbool Hwcomposer::setCursorPositionAsync(int disp, int x, int y)
310452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish{
311452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    RETURN_FALSE_IF_NOT_INIT();
312452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
313a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (disp != HWC_DISPLAY_PRIMARY && disp != HWC_DISPLAY_EXTERNAL) {
3144157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
315452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish        return false;
316452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish    }
317452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
318a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return mDisplayContext->setCursorPosition(disp, x, y);
319452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish}
320452fbc109a9c585737bcac18f19aff40574c3d79Jim Bish
3216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid Hwcomposer::vsync(int disp, int64_t timestamp)
3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
323e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_VOID_IF_NOT_INIT();
3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mProcs && mProcs->vsync) {
3264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        VLOGTRACE("report vsync on disp %d, timestamp %llu", disp, timestamp);
327114561fb66d0464f48d373487c29a81859ce33a7Andy Qiu        // workaround to pretend vsync is from primary display
328114561fb66d0464f48d373487c29a81859ce33a7Andy Qiu        // Display will freeze if vsync is from external display.
329114561fb66d0464f48d373487c29a81859ce33a7Andy Qiu        mProcs->vsync(const_cast<hwc_procs_t*>(mProcs), IDisplayDevice::DEVICE_PRIMARY, timestamp);
3306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
333aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiuvoid Hwcomposer::hotplug(__attribute__((unused))int disp, bool connected)
3346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
335e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_VOID_IF_NOT_INIT();
3366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mProcs && mProcs->hotplug) {
3384157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        DLOGTRACE("report hotplug on disp %d, connected %d", disp, connected);
3396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mProcs->hotplug(const_cast<hwc_procs_t*>(mProcs), disp, connected);
3404157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        DLOGTRACE("hotplug callback processed and returned!");
3416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
342114561fb66d0464f48d373487c29a81859ce33a7Andy Qiu
343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mDisplayAnalyzer->postHotplugEvent(connected);
3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
346d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiuvoid Hwcomposer::invalidate()
347d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
348d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    RETURN_VOID_IF_NOT_INIT();
349d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
350d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    if (mProcs && mProcs->invalidate) {
3514157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        DLOGTRACE("invalidating screen...");
352d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        mProcs->invalidate(const_cast<hwc_procs_t*>(mProcs));
353d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
354d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
355d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
3566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::release()
3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
358e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
3596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
3616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3630594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool Hwcomposer::dump(char *buff, int buff_len, int * /* cur_len */)
3646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
365e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
3666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    Dump d(buff, buff_len);
3686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump composer status
370e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    d.append("Hardware Composer state:");
3716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump device status
3726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i= 0; i < mDisplayDevices.size(); i++) {
3738a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = mDisplayDevices.itemAt(i);
3746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (device)
3756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu            device->dump(d);
3766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
3776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump plane manager status
3796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (mPlaneManager)
3806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mPlaneManager->dump(d);
3816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
382569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    // dump buffer manager status
383569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    if (mBufferManager)
384569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li        mBufferManager->dump(d);
385569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li
3866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
3876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid Hwcomposer::registerProcs(hwc_procs_t const *procs)
3906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
391e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
393e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    if (!procs) {
3944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("procs is NULL");
395e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    }
3966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mProcs = procs;
3976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Hwcomposer::initialize()
4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
401e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create drm
404e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    mDrm = new Drm();
405e2ad4c047651d4442f6a0e002290016d45e9201afu jin    if (!mDrm || !mDrm->initialize()) {
406e2ad4c047651d4442f6a0e002290016d45e9201afu jin        DEINIT_AND_RETURN_FALSE("failed to create DRM");
4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create buffer manager
4106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mBufferManager = createBufferManager();
4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!mBufferManager || !mBufferManager->initialize()) {
412e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create buffer manager");
4136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
41527d326d9847a49fa448e370686280db92043ef77Andy Qiu    // create display plane manager
41627d326d9847a49fa448e370686280db92043ef77Andy Qiu    mPlaneManager = createDisplayPlaneManager();
41727d326d9847a49fa448e370686280db92043ef77Andy Qiu    if (!mPlaneManager || !mPlaneManager->initialize()) {
41827d326d9847a49fa448e370686280db92043ef77Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create display plane manager");
41927d326d9847a49fa448e370686280db92043ef77Andy Qiu    }
42027d326d9847a49fa448e370686280db92043ef77Andy Qiu
4214b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    mDisplayContext = createDisplayContext();
4224b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    if (!mDisplayContext || !mDisplayContext->initialize()) {
423e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to create display context");
4244b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    }
4254b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
426466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    mUeventObserver = new UeventObserver();
427466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (!mUeventObserver || !mUeventObserver->initialize()) {
428466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        DEINIT_AND_RETURN_FALSE("failed to initialize uevent observer");
429466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
430466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
4316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // create display device
4328a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu    for (int i = 0; i < IDisplayDevice::DEVICE_COUNT; i++) {
4338a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = createDisplayDevice(i, *mPlaneManager);
4346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!device || !device->initialize()) {
435e2ad4c047651d4442f6a0e002290016d45e9201afu jin            DEINIT_AND_DELETE_OBJ(device);
436e2ad4c047651d4442f6a0e002290016d45e9201afu jin            DEINIT_AND_RETURN_FALSE("failed to create device %d", i);
4376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        }
4386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        // add this device
4396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mDisplayDevices.insertAt(device, i, 1);
4406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
4416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
44265efc253a628175c7afa95c431b746ea20052794Andy Qiu    mDisplayAnalyzer = new DisplayAnalyzer();
44365efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (!mDisplayAnalyzer || !mDisplayAnalyzer->initialize()) {
44465efc253a628175c7afa95c431b746ea20052794Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to initialize display analyzer");
44565efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
44665efc253a628175c7afa95c431b746ea20052794Andy Qiu
447466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    // all initialized, starting uevent observer
448466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    mUeventObserver->start();
449466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = true;
4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
452e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li}
453e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
454e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid Hwcomposer::deinitialize()
455e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{
456e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    DEINIT_AND_DELETE_OBJ(mDisplayAnalyzer);
457114561fb66d0464f48d373487c29a81859ce33a7Andy Qiu
458466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    DEINIT_AND_DELETE_OBJ(mUeventObserver);
459e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // destroy display devices
4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    for (size_t i = 0; i < mDisplayDevices.size(); i++) {
4618a427146c6f68f9add960bbd18c4f84c9eeee4a5Andy Qiu        IDisplayDevice *device = mDisplayDevices.itemAt(i);
462e2ad4c047651d4442f6a0e002290016d45e9201afu jin        DEINIT_AND_DELETE_OBJ(device);
463e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
464e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    mDisplayDevices.clear();
465e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
466e2ad4c047651d4442f6a0e002290016d45e9201afu jin    DEINIT_AND_DELETE_OBJ(mDisplayContext);
467e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    DEINIT_AND_DELETE_OBJ(mPlaneManager);
46827d326d9847a49fa448e370686280db92043ef77Andy Qiu    DEINIT_AND_DELETE_OBJ(mBufferManager);
469e2ad4c047651d4442f6a0e002290016d45e9201afu jin    DEINIT_AND_DELETE_OBJ(mDrm);
4706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = false;
4716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
473e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie LiDrm* Hwcomposer::getDrm()
4746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
475e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    return mDrm;
4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
478e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie LiDisplayPlaneManager* Hwcomposer::getPlaneManager()
4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
480e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    return mPlaneManager;
4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
483e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie LiBufferManager* Hwcomposer::getBufferManager()
4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
485e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    return mBufferManager;
4866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
4884b834ced8031d624fc8bd042275cb0612c7b9f63Andy QiuIDisplayContext* Hwcomposer::getDisplayContext()
4894b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu{
4904b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu    return mDisplayContext;
4914b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu}
4924b834ced8031d624fc8bd042275cb0612c7b9f63Andy Qiu
49365efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer* Hwcomposer::getDisplayAnalyzer()
49465efc253a628175c7afa95c431b746ea20052794Andy Qiu{
49565efc253a628175c7afa95c431b746ea20052794Andy Qiu    return mDisplayAnalyzer;
49665efc253a628175c7afa95c431b746ea20052794Andy Qiu}
49765efc253a628175c7afa95c431b746ea20052794Andy Qiu
4983f1974031c88750a14adc8f2f49538837238abf9Lin XieIDisplayDevice* Hwcomposer::getDisplayDevice(int disp)
4993f1974031c88750a14adc8f2f49538837238abf9Lin Xie{
5003f1974031c88750a14adc8f2f49538837238abf9Lin Xie    if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
5014157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid disp %d", disp);
5023f1974031c88750a14adc8f2f49538837238abf9Lin Xie        return NULL;
5033f1974031c88750a14adc8f2f49538837238abf9Lin Xie    }
5040594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel    if (disp >= (int) mDisplayDevices.size()) {
505c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel        return NULL;
506c3f2abf40207b7f8c344507c1473205e628b8ebfThierry Strudel    }
5073f1974031c88750a14adc8f2f49538837238abf9Lin Xie    return mDisplayDevices.itemAt(disp);
5083f1974031c88750a14adc8f2f49538837238abf9Lin Xie}
5093f1974031c88750a14adc8f2f49538837238abf9Lin Xie
510466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin HuUeventObserver* Hwcomposer::getUeventObserver()
511466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{
512466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    return mUeventObserver;
513466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu}
514466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
515466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
5166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
5176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
518