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