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