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