DisplayPlaneManager.cpp revision 6a6081a46a83da606cf21548879b37695adc7e1f
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 */ 286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DisplayPlaneManager.h> 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Log.h> 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiustatic Log& log = Log::getInstance(); 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 366a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlaneManager::DisplayPlaneManager() 376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu : mSpritePlaneCount(0), 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlaneCount(0), 396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlaneCount(0), 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mTotalPlaneCount(0), 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummySpritePlane(0), 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummyPrimaryPlane(0), 436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummyOverlayPlane(0), 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeSpritePlanes(0), 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreePrimaryPlanes(0), 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeOverlayPlanes(0), 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedSpritePlanes(0), 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedPrimaryPlanes(0), 496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedOverlayPlanes(0), 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 556a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlaneManager::~DisplayPlaneManager() 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t i; 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mOverlayPlanes.size(); i++) 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mOverlayPlanes.itemAt(i); 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlanes.clear(); 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mSpritePlanes.size(); i++) 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mSpritePlanes.itemAt(i); 656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlanes.clear(); 666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mPrimaryPlanes.size(); i++) 686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mPrimaryPlanes.itemAt(i); 696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlanes.clear(); 706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::initialize() 736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i; 756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu size_t j; 766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.v("DisplayPlaneManager::initialize"); 786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // detect display plane usage. Hopefully throw DRM ioctl 806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu detect(); 816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // allocate primary plane pool 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mPrimaryPlaneCount) { 846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlanes.setCapacity(mPrimaryPlaneCount); 856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mPrimaryPlaneCount; i++) { 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = allocPlane(i, DisplayPlane::PLANE_PRIMARY); 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!plane) { 896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate primary plane %d", i); 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto primary_err;; 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // reset overlay plane 936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->reset(); 946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // insert plane 956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlanes.push_back(plane); 966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // allocate dummy primary plane 996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummyPrimaryPlane = allocPlane(-1, DisplayPlane::PLANE_PRIMARY); 1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mDummyPrimaryPlane) { 1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate dummy primary plane"); 1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto dummy_primary_err; 1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // allocate sprite plane pool 1076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mSpritePlaneCount) { 1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlanes.setCapacity(mSpritePlaneCount); 1096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mSpritePlaneCount; i++) { 1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = allocPlane(i, DisplayPlane::PLANE_SPRITE); 1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!plane) { 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate sprite plane %d", i); 1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto sprite_err; 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // reset overlay plane 1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->reset(); 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // insert plane 1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlanes.push_back(plane); 1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // allocate dummy primary plane 1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummySpritePlane = allocPlane(-1, DisplayPlane::PLANE_SPRITE); 1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mDummySpritePlane) { 1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate dummy sprite plane"); 1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto dummy_sprite_err; 1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mOverlayPlaneCount) { 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // allocate overlay plane pool 1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlanes.setCapacity(mOverlayPlaneCount); 1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < mOverlayPlaneCount; i++) { 1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = allocPlane(i, DisplayPlane::PLANE_OVERLAY); 1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!plane) { 1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate sprite plane %d", i); 1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto overlay_err; 1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // reset overlay plane 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->reset(); 1416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // insert plane 1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlanes.push_back(plane); 1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDummyOverlayPlane = allocPlane(-1, DisplayPlane::PLANE_OVERLAY); 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mDummyOverlayPlane) { 1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("initialize: failed to allocate dummy overlay plane"); 1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu goto overlay_err; 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuoverlay_err: 1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mDummySpritePlane; 1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiudummy_sprite_err: 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (j = 0; j < mOverlayPlanes.size(); j++) 1586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mOverlayPlanes.itemAt(j); 1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlanes.clear(); 1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiusprite_err: 1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mDummyPrimaryPlane; 1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiudummy_primary_err: 1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (j = 0; j < mSpritePlanes.size(); j++) 1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mSpritePlanes.itemAt(j); 1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlanes.clear(); 1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuprimary_err: 1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (j = 0; j < mPrimaryPlanes.size(); j++) 1686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu delete mPrimaryPlanes.itemAt(j); 1696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlanes.clear(); 1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 1716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getPlane(uint32_t& mask) 1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mask) 1776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < 32; i++) { 1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask &= ~bit; 1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return i; 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putPlane(int index, uint32_t& mask) 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (index < 0 || index >= 32) 1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 1946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << index); 1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 1986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.w("putPlane: bit %d was set", index); 1996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask |= bit; 2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getPlane(uint32_t& mask, int index) 2066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mask || index < 0 || index > mTotalPlaneCount) 2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << index); 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask &= ~bit; 2136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return index; 2146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 2176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2196a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getSpritePlane() 2206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 2226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getSpritePlane: plane manager was not initialized\n"); 2236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int freePlaneIndex; 2276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check reclaimed overlay planes 2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mReclaimedSpritePlanes); 2306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mSpritePlanes.itemAt(freePlaneIndex); 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check free overlay planes 2346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mFreeSpritePlanes); 2356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mSpritePlanes.itemAt(freePlaneIndex); 2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getSpritePlane: failed to get a sprite plane\n"); 2386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2416a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getPrimaryPlane(int pipe) 2426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 2446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getSpritePlane: plane manager was not initialized\n"); 2456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int freePlaneIndex; 2496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check reclaimed primary planes 2516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mReclaimedPrimaryPlanes, pipe); 2526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 2536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mPrimaryPlanes.itemAt(freePlaneIndex); 2546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check free overlay planes 2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mFreePrimaryPlanes, pipe); 2576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mPrimaryPlanes.itemAt(freePlaneIndex); 2596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getPrimaryPlane: failed to get a primary plane\n"); 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2636a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getOverlayPlane() 2646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 2666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: plane manager was not initialized\n"); 2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int freePlaneIndex; 2716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check reclaimed overlay planes 2736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mReclaimedOverlayPlanes); 2746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex < 0) { 2756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check free overlay planes 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mFreeOverlayPlanes); 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex < 0) { 2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: failed to get a overlay plane\n"); 2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mOverlayPlanes.itemAt(freePlaneIndex); 2856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putSpritePlane(DisplayPlane& plane) 2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 2906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (plane.getType() == DisplayPlane::PLANE_SPRITE) 2926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mFreeSpritePlanes); 2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putOverlayPlane(DisplayPlane& plane) 2966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 2986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (plane.getType() == DisplayPlane::PLANE_OVERLAY) 2996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mFreeOverlayPlanes); 3006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3026a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getSpritePlane(int& where) 3036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getSpritePlane: plane manager was not initialized\n"); 3066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 3076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int freePlaneIndex; 3106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check reclaimed overlay planes 3126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mReclaimedSpritePlanes); 3136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) { 3146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu where = PLANE_ON_RECLAIMED_LIST; 3156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mSpritePlanes.itemAt(freePlaneIndex); 3166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check free overlay planes 3196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mFreeSpritePlanes); 3206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) { 3216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu where = PLANE_ON_FREE_LIST; 3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mSpritePlanes.itemAt(freePlaneIndex); 3236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getSpritePlane: failed to get a sprite plane\n"); 3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 3266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3286a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getOverlayPlane(int& where) 3296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 3316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: plane manager was not initialized\n"); 3326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int freePlaneIndex; 3366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // check reclaimed overlay planes 3386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mReclaimedOverlayPlanes); 3396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) { 3406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu where = PLANE_ON_RECLAIMED_LIST; 3416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mOverlayPlanes.itemAt(freePlaneIndex); 3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu freePlaneIndex = getPlane(mFreeOverlayPlanes); 3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) { 3466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu where = PLANE_ON_FREE_LIST; 3476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mOverlayPlanes.itemAt(freePlaneIndex); 3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: failed to get a overlay plane\n"); 3516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 3526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putSpritePlane(DisplayPlane& plane, int where) 3556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (plane.getType() == DisplayPlane::PLANE_SPRITE) { 3596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (where) { 3606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case PLANE_ON_RECLAIMED_LIST: 3616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mReclaimedSpritePlanes); 3626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 3636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case PLANE_ON_FREE_LIST: 3646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mFreeSpritePlanes); 3656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 3666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putOverlayPlane(DisplayPlane& plane, int where) 3716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 3736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (plane.getType() == DisplayPlane::PLANE_OVERLAY) { 3756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu switch (where) { 3766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case PLANE_ON_RECLAIMED_LIST: 3776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mReclaimedOverlayPlanes); 3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu break; 3796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu case PLANE_ON_FREE_LIST: 3806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mFreeOverlayPlanes); 3816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3856a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getDummyPrimaryPlane() 3866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 3886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: plane manager was not initialized\n"); 3896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 3906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mDummyPrimaryPlane; 3936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3956a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getDummySpritePlane() 3966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 3986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: plane manager was not initialized\n"); 3996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 4006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mDummySpritePlane; 4036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4056a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane* DisplayPlaneManager::getDummyOverlayPlane() 4066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("getOverlayPlane: plane manager was not initialized\n"); 4096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 4106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mDummyOverlayPlane; 4136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::hasFreeSprites() 4166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return (mFreeSpritePlanes || mReclaimedSpritePlanes) ? true : false; 4216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::hasFreeOverlays() 4246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return (mFreeOverlayPlanes || mReclaimedOverlayPlanes) ? true : false; 4296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getFreeSpriteCount() const 4326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 4356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t availableSprites = mFreeSpritePlanes; 4376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu availableSprites |= mReclaimedSpritePlanes; 4386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int count = 0; 4396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < 32; i++) { 4406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 4416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & availableSprites) 4426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu count++; 4436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return count; 4466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getFreeOverlayCount() const 4496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 4526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t availableOverlays = mFreeOverlayPlanes; 4546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu availableOverlays |= mReclaimedOverlayPlanes; 4556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int count = 0; 4566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < 32; i++) { 4576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 4586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & availableOverlays) 4596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu count++; 4606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return count; 4636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::hasReclaimedOverlays() 4666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return (mReclaimedOverlayPlanes) ? true : false; 4716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::primaryAvailable(int pipe) 4746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) 4766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 4776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return ((mFreePrimaryPlanes & (1 << pipe)) || 4796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu (mReclaimedPrimaryPlanes & (1 << pipe))) ? true : false; 4806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 4816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::reclaimPlane(DisplayPlane& plane) 4836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 4846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 4856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("reclaimPlane: plane manager is not initialized\n"); 4866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 4876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 4886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 4906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.v("reclaimPlane: reclaimPlane %d, type %d\n", index, plane.getType()); 4926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 4936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (plane.getType() == DisplayPlane::PLANE_OVERLAY) 4946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mReclaimedOverlayPlanes); 4956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu else if (plane.getType() == DisplayPlane::PLANE_SPRITE) 4966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mReclaimedSpritePlanes); 4976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu else if (plane.getType() == DisplayPlane::PLANE_PRIMARY) 4986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu putPlane(index, mReclaimedPrimaryPlanes); 4996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu else 5006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("reclaimPlane: invalid plane type %d", plane.getType()); 5016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::disableReclaimedPlanes() 5046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 5056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!initCheck()) { 5066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.e("disableReclaimedPlanes: plane manager is not initialized"); 5076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 5086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu log.v("DisplayPlaneManager::disableReclaimedPlanes: " 5116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu "sprite %d, reclaimed 0x%x" 5126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu "primary %d, reclaimed 0x%x" 5136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu "overlay %d, reclaimed 0x%x", 5146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlanes.size(), mReclaimedSpritePlanes, 5156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlanes.size(), mReclaimedPrimaryPlanes, 5166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlanes.size(), mReclaimedOverlayPlanes); 5176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable reclaimed sprite planes 5196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mSpritePlanes.size() && mReclaimedSpritePlanes) { 5206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < mSpritePlaneCount; i++) { 5216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 5226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mReclaimedSpritePlanes & bit) { 5236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = mSpritePlanes.itemAt(i); 5246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable plane 5256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->disable(); 5266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // invalidate plane's data buffer cache 5276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->invalidateBufferCache(); 5286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // merge into free sprite bitmap 5316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeSpritePlanes |= mReclaimedSpritePlanes; 5326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedSpritePlanes = 0; 5336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable reclaimed primary planes 5366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mPrimaryPlanes.size() && mReclaimedPrimaryPlanes) { 5376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < mPrimaryPlaneCount; i++) { 5386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 5396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mReclaimedPrimaryPlanes & bit) { 5406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = mPrimaryPlanes.itemAt(i); 5416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable plane 5426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->disable(); 5436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // invalidate plane's data buffer cache 5446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->invalidateBufferCache(); 5456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // merge into free sprite bitmap 5486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreePrimaryPlanes |= mReclaimedPrimaryPlanes; 5496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedPrimaryPlanes = 0; 5506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable reclaimed overlay planes 5536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mOverlayPlanes.size() && mReclaimedOverlayPlanes) { 5546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < mOverlayPlaneCount; i++) { 5556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 5566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mReclaimedOverlayPlanes & bit) { 5576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DisplayPlane* plane = mOverlayPlanes.itemAt(i); 5586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // disable plane 5596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->disable(); 5606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // invalidate plane's data buffer cache 5616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu plane->invalidateBufferCache(); 5626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // merge into free overlay bitmap 5656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeOverlayPlanes |= mReclaimedOverlayPlanes; 5666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedOverlayPlanes = 0; 5676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 5686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::dump(Dump& d) 5716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 5726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display Plane Manager state:\n"); 5736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 5746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" PLANE TYPE | COUNT | FREE | RECLAIMED \n"); 5756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("------------+-------+----------+-----------\n"); 5766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" SPRITE | %2d | %08x | %08x\n", 5776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSpritePlaneCount, 5786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeSpritePlanes, 5796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedSpritePlanes); 5806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" OVERLAY | %2d | %08x | %08x\n", 5816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mOverlayPlaneCount, 5826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreeOverlayPlanes, 5836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedOverlayPlanes); 5846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" PRIMARY | %2d | %08x | %08x\n", 5856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mPrimaryPlaneCount, 5866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mFreePrimaryPlanes, 5876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mReclaimedPrimaryPlanes); 5886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 5896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 5916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 5926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 5936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 594