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> 17c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li#include <IDisplayDevice.h> 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DisplayPlaneManager.h> 196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 236a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlaneManager::DisplayPlaneManager() 24c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li : mTotalPlaneCount(0), 259d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mPrimaryPlaneCount(DEFAULT_PRIMARY_PLANE_COUNT), 269d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mSpritePlaneCount(0), 279d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mOverlayPlaneCount(0), 286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 30c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int i; 316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 32c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (i = 0; i < DisplayPlane::PLANE_MAX; i++) { 33c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlaneCount[i] = 0; 34c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mFreePlanes[i] = 0; 35c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mReclaimedPlanes[i] = 0; 36c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 396a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlaneManager::~DisplayPlaneManager() 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 41e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 44c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlaneManager::deinitialize() 45c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 46c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int i; 47c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li size_t j; 48c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 49c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (i = 0; i < DisplayPlane::PLANE_MAX; i++) { 50c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (j = 0; j < mPlanes[i].size(); j++) { 51c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // reset plane 52c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane *plane = mPlanes[i].itemAt(j); 53c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li plane->reset(); 54c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 55c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DEINIT_AND_DELETE_OBJ(plane); 56c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 57c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlanes[i].clear(); 58c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 59d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li 60e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu mInitialized = false; 61c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 62c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlaneManager::initialize() 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 65c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int i, j; 66e2ad4c047651d4442f6a0e002290016d45e9201afu jin 67e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mInitialized) { 684157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("object has been initialized"); 69e2ad4c047651d4442f6a0e002290016d45e9201afu jin return true; 70e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 71e2ad4c047651d4442f6a0e002290016d45e9201afu jin 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 73c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // calculate total plane number and free plane bitmaps 749d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mPlaneCount[DisplayPlane::PLANE_SPRITE] = mSpritePlaneCount; 759d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mPlaneCount[DisplayPlane::PLANE_OVERLAY] = mOverlayPlaneCount; 769d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu mPlaneCount[DisplayPlane::PLANE_PRIMARY] = mPrimaryPlaneCount; 77a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang mPlaneCount[DisplayPlane::PLANE_CURSOR] = mCursorPlaneCount; 789d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 79a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang mTotalPlaneCount = mSpritePlaneCount+ mOverlayPlaneCount+ mPrimaryPlaneCount + mCursorPlaneCount; 809d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if (mTotalPlaneCount == 0) { 814157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("plane count is not initialized"); 829d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return false; 839d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu } 846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 85c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (i = 0; i < DisplayPlane::PLANE_MAX; i++) { 86c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mFreePlanes[i] = ((1 << mPlaneCount[i]) - 1); 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 89c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // allocate plane pools 90c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (i = 0; i < DisplayPlane::PLANE_MAX; i++) { 91c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mPlaneCount[i]) { 92c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlanes[i].setCapacity(mPlaneCount[i]); 93c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 94c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (j = 0; j < mPlaneCount[i]; j++) { 95c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane* plane = allocPlane(j, i); 96c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!plane) { 974157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate plane %d, type %d", j, i); 98c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DEINIT_AND_RETURN_FALSE(); 99c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 100c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlanes[i].push_back(plane); 1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 107e2ad4c047651d4442f6a0e002290016d45e9201afu jin} 108e2ad4c047651d4442f6a0e002290016d45e9201afu jin 1096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getPlane(uint32_t& mask) 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mask) 1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (int i = 0; i < 32; i++) { 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << i); 1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask &= ~bit; 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return i; 1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::putPlane(int index, uint32_t& mask) 1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (index < 0 || index >= 32) 1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << index); 1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 1334157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("bit %d was set", index); 1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask |= bit; 1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuint DisplayPlaneManager::getPlane(uint32_t& mask, int index) 1416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mask || index < 0 || index > mTotalPlaneCount) 1436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int bit = (1 << index); 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (bit & mask) { 1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mask &= ~bit; 1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return index; 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return -1; 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1549d1d3833469f52dbd2a017702bf0116fddc703bcAndy QiuDisplayPlane* DisplayPlaneManager::getPlane(int type, int index) 1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 156c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_NULL_IF_NOT_INIT(); 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1589d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 1594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 160c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return 0; 161c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1639d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu int freePlaneIndex = getPlane(mReclaimedPlanes[type], index); 1649d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if (freePlaneIndex >= 0) 1659d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return mPlanes[type].itemAt(freePlaneIndex); 1669d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 1679d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu freePlaneIndex = getPlane(mFreePlanes[type], index); 1689d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if (freePlaneIndex >= 0) 1699d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return mPlanes[type].itemAt(freePlaneIndex); 1709d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 1719d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return 0; 1729d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu} 1739d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 1749d1d3833469f52dbd2a017702bf0116fddc703bcAndy QiuDisplayPlane* DisplayPlaneManager::getAnyPlane(int type) 1759d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu{ 1769d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu RETURN_NULL_IF_NOT_INIT(); 1779d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 1780f3087a3fcd76560a54aa167d2fb8b67129730baGreg Cantrell if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 1794157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 180c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return 0; 181c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1839d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu int freePlaneIndex = getPlane(mReclaimedPlanes[type]); 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 185c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return mPlanes[type].itemAt(freePlaneIndex); 186c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1879d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu freePlaneIndex = getPlane(mFreePlanes[type]); 1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (freePlaneIndex >= 0) 189c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return mPlanes[type].itemAt(freePlaneIndex); 190c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return 0; 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1940594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelvoid DisplayPlaneManager::putPlane(int /* dsp */, DisplayPlane& plane) 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 196c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int index; 197c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int type; 1986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 199c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 201c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li index = plane.getIndex(); 202c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li type = plane.getType(); 2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2040f3087a3fcd76560a54aa167d2fb8b67129730baGreg Cantrell if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 2054157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 206c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return; 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 209c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putPlane(index, mFreePlanes[type]); 2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2129d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiubool DisplayPlaneManager::isFreePlane(int type, int index) 2136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2149d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 2154157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 2169d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return false; 2179d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu } 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2199d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu int freePlanes = mFreePlanes[type] | mReclaimedPlanes[type]; 2209d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if ((freePlanes & (1 << index)) == 0) 2219d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return false; 2229d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 2239d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return true; 2249d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu} 2259d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 2269d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiuint DisplayPlaneManager::getFreePlanes(int dsp, int type) 2279d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu{ 2289d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu RETURN_NULL_IF_NOT_INIT(); 2296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 230c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (dsp < 0 || dsp > IDisplayDevice::DEVICE_EXTERNAL) { 2314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid display device %d", dsp); 232c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return 0; 233c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 2346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2350f3087a3fcd76560a54aa167d2fb8b67129730baGreg Cantrell if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 2364157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 237c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return 0; 238c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 239c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 2409d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu 2419d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu uint32_t freePlanes = mFreePlanes[type] | mReclaimedPlanes[type]; 242a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang if (type == DisplayPlane::PLANE_PRIMARY || 243a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang type == DisplayPlane::PLANE_CURSOR) { 2449d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return ((freePlanes & (1 << dsp)) == 0) ? 0 : 1; 245c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } else { 2469d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu int count = 0; 2479d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu for (int i = 0; i < 32; i++) { 2489d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu if ((1 << i) & freePlanes) { 2499d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu count++; 2509d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu } 2519d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu } 2529d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return count; 253c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 2549d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu return 0; 2556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2570594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelvoid DisplayPlaneManager::reclaimPlane(int /* dsp */, DisplayPlane& plane) 2586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 259e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 2606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int index = plane.getIndex(); 262c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int type = plane.getType(); 2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2644157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("reclaimPlane = %d, type = %d", index, plane.getType()); 2656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2660f3087a3fcd76560a54aa167d2fb8b67129730baGreg Cantrell if (type < 0 || type >= DisplayPlane::PLANE_MAX) { 2674157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Invalid plane type %d", type); 268c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return; 269e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 270c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 271c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putPlane(index, mReclaimedPlanes[type]); 272c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 273c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // NOTE: don't invalidate plane's data cache here because the reclaimed 274c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // plane might be re-assigned to the same layer later 2756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::disableReclaimedPlanes() 2786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 279c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int i, j; 2806a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu bool ret; 2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 282c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 2836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 284c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (i = 0; i < DisplayPlane::PLANE_MAX; i++) { 285c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // disable reclaimed planes 286c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mReclaimedPlanes[i]) { 287c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (j = 0; j < mPlaneCount[i]; j++) { 288c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li int bit = (1 << j); 289c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mReclaimedPlanes[i] & bit) { 290c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane* plane = mPlanes[i].itemAt(j); 29168dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // check plane state first 29268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang ret = plane->isDisabled(); 293c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // reset plane 2946a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (ret) 2956a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu ret = plane->reset(); 2966a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (ret) { 2976a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu // only merge into free bitmap if it is successfully disabled and reset 2986a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu // otherwise, plane will be disabled and reset again. 2996a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mFreePlanes[i] |=bit; 3006a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mReclaimedPlanes[i] &= ~bit; 3016a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 302c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 3036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 3064ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu} 3074ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu 308009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhangbool DisplayPlaneManager::isOverlayPlanesDisabled() 3094ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu{ 3104ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu for (int i = 0; i < DisplayPlane::PLANE_MAX; i++) { 3114ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu for (int j = 0; j < mPlaneCount[i]; j++) { 3124ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu DisplayPlane* plane = (DisplayPlane *)mPlanes[i][j]; 3134ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (plane && plane->getType() == DisplayPlane::PLANE_OVERLAY) { 314009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhang if (!plane->isDisabled()) 315009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhang return false; 3164ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3174ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3184ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 319009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhang 320009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhang return true; 3216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlaneManager::dump(Dump& d) 3246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 3256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("Display Plane Manager state:\n"); 3266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("-------------------------------------------------------------\n"); 3276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" PLANE TYPE | COUNT | FREE | RECLAIMED \n"); 3286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append("------------+-------+----------+-----------\n"); 3296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" SPRITE | %2d | %08x | %08x\n", 330c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlaneCount[DisplayPlane::PLANE_SPRITE], 331c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mFreePlanes[DisplayPlane::PLANE_SPRITE], 332c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mReclaimedPlanes[DisplayPlane::PLANE_SPRITE]); 3336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" OVERLAY | %2d | %08x | %08x\n", 334c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlaneCount[DisplayPlane::PLANE_OVERLAY], 335c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mFreePlanes[DisplayPlane::PLANE_OVERLAY], 336c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mReclaimedPlanes[DisplayPlane::PLANE_OVERLAY]); 3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu d.append(" PRIMARY | %2d | %08x | %08x\n", 338c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mPlaneCount[DisplayPlane::PLANE_PRIMARY], 339c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mFreePlanes[DisplayPlane::PLANE_PRIMARY], 340c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mReclaimedPlanes[DisplayPlane::PLANE_PRIMARY]); 341a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang d.append(" CURSOR | %2d | %08x | %08x\n", 342a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang mPlaneCount[DisplayPlane::PLANE_CURSOR], 343a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang mFreePlanes[DisplayPlane::PLANE_CURSOR], 344a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang mReclaimedPlanes[DisplayPlane::PLANE_CURSOR]); 3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 3496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 351