DisplayPlane.cpp revision 9f379685f09ddd7c4d98b23121487e8ac4b4dd40
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 */
28e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#include <HwcTrace.h>
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h>
306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DisplayPlane.h>
3125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu#include <GraphicBuffer.h>
326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
366a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane::DisplayPlane(int index, int type, int disp)
376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    : mIndex(index),
386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mType(type),
39d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li      mZOrder(-1),
406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mDevice(disp),
416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mInitialized(false),
42e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li      mDataBuffers(),
43c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li      mActiveBuffers(),
44569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li      mCacheCapacity(0),
4525caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu      mIsProtectedBuffer(false),
464a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li      mTransform(PLANE_TRANSFORM_0),
470fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang      mPlaneAlpha(0),
48ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li      mCurrentDataBuffer(0),
49ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li      mUpdateMasks(0)
506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
51e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
52e2ad4c047651d4442f6a0e002290016d45e9201afu jin    memset(&mPosition, 0, sizeof(mPosition));
53e2ad4c047651d4442f6a0e002290016d45e9201afu jin    memset(&mSrcCrop, 0, sizeof(mSrcCrop));
546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
566a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane::~DisplayPlane()
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
58e2ad4c047651d4442f6a0e002290016d45e9201afu jin    WARN_IF_NOT_DEINIT();
596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
61e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool DisplayPlane::initialize(uint32_t bufferCount)
626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
63e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
65e2ad4c047651d4442f6a0e002290016d45e9201afu jin    if (bufferCount < MIN_DATA_BUFFER_COUNT) {
66e2ad4c047651d4442f6a0e002290016d45e9201afu jin        WTRACE("buffer count %d is too small", bufferCount);
67e2ad4c047651d4442f6a0e002290016d45e9201afu jin        bufferCount = MIN_DATA_BUFFER_COUNT;
68e2ad4c047651d4442f6a0e002290016d45e9201afu jin    }
696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
70e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // create buffer cache, adding few extra slots as buffer rendering is async
71e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // buffer could still be queued in the display pipeline such that they
72569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    // can't be unmapped]
73569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    mCacheCapacity = bufferCount;
74c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mDataBuffers.setCapacity(bufferCount);
75c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveBuffers.setCapacity(MIN_DATA_BUFFER_COUNT);
766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = true;
776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
78e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li}
79e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
80e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid DisplayPlane::deinitialize()
81e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{
82c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // invalidate cached data buffers
83c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mDataBuffers.size()) {
84e2ad4c047651d4442f6a0e002290016d45e9201afu jin        // invalidateBufferCache will assert if object is not initialized
85e2ad4c047651d4442f6a0e002290016d45e9201afu jin        // so invoking it only there is buffer to invalidate.
86e2ad4c047651d4442f6a0e002290016d45e9201afu jin        invalidateBufferCache();
87e2ad4c047651d4442f6a0e002290016d45e9201afu jin    }
88c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
89c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // invalidate active buffers
90c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size()) {
91c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveBuffers();
92c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
93c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
94e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mCurrentDataBuffer = 0;
956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = false;
966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
984a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Livoid DisplayPlane::checkPosition(int& x, int& y, int& w, int& h)
994a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{
1004a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    Drm *drm = Hwcomposer::getInstance().getDrm();
10130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfo modeInfo;
10230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    if (!drm->getModeInfo(mDevice, modeInfo)) {
10330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu        ETRACE("failed to get mode info");
1044a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        return;
1054a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    }
10630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfoPtr mode = &modeInfo;
1074a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
1084a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if (x < 0)
1094a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        x = 0;
1104a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if (y < 0)
1114a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        y = 0;
1124a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if ((x + w) > mode->hdisplay)
1134a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        w = mode->hdisplay - x;
1144a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if ((y + h) > mode->vdisplay)
1154a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        h = mode->vdisplay - y;
1164a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li}
1174a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setPosition(int x, int y, int w, int h)
1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
120e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("Position = %d, %d - %dx%d", x, y, w, h);
121e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
12293d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu    if (mPosition.x != x || mPosition.y != y ||
12393d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mPosition.w != w || mPosition.h != h) {
12493d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mUpdateMasks |= PLANE_POSITION_CHANGED;
12593d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mPosition.x = x;
12693d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mPosition.y = y;
12793d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mPosition.w = w;
12893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mPosition.h = h;
129ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setSourceCrop(int x, int y, int w, int h)
1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
134e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("Source crop = %d, %d - %dx%d", x, y, w, h);
1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
13693d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu    if (mSrcCrop.x != x || mSrcCrop.y != y ||
13793d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mSrcCrop.w != w || mSrcCrop.h != h) {
13893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mUpdateMasks |= PLANE_SOURCE_CROP_CHANGED;
13993d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mSrcCrop.x = x;
14093d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mSrcCrop.y = y;
14193d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mSrcCrop.w = w;
14293d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu        mSrcCrop.h = h;
143ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setTransform(int trans)
1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
148e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("transform = %d", trans);
1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
150ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mTransform == trans) {
151ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return;
152ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
153ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    switch (trans) {
1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_90:
1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_180:
1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_270:
1586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mTransform = trans;
1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        break;
1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    default:
1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mTransform = PLANE_TRANSFORM_0;
162ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        break;
1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
164ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
165ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    mUpdateMasks |= PLANE_TRANSFORM_CHANGED;
1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1680fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhangvoid DisplayPlane::setPlaneAlpha(uint8_t alpha)
1690fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang{
1700fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang    ATRACE("plane alpha = 0x%x", alpha);
1710fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang
1720fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang    if (mPlaneAlpha != alpha) {
1730fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang        mPlaneAlpha = alpha;
1740fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang    }
1750fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang}
1760fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang
1776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlane::setDataBuffer(uint32_t handle)
1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    DataBuffer *buffer;
1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    BufferMapper *mapper;
181e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    ssize_t index;
182ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    bool ret;
1839f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li    bool isCompression;
184e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
1856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
186e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
187e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("handle = %#x", handle);
1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!handle) {
19051779bcebdb675fefc8a23f17e4e1070590f85a0Andy Qiu        WTRACE("invalid buffer handle");
1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1944a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    // do not need to update the buffer handle
195ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mCurrentDataBuffer != handle)
196ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks |= PLANE_BUFFER_CHANGED;
197ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
198ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // if no update then do Not need set data buffer
199ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (!mUpdateMasks)
2004a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        return true;
2014a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
202eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    buffer = bm->lockDataBuffer(handle);
2036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!buffer) {
204e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to get buffer");
2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
20825caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    mIsProtectedBuffer = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer);
2099f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li    isCompression = GraphicBuffer::isCompressionBuffer((GraphicBuffer*)buffer);
2109f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li
2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // map buffer if it's not in cache
212e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    index = mDataBuffers.indexOfKey(buffer->getKey());
213e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (index < 0) {
214e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("unmapped buffer, mapping...");
215c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper = mapBuffer(buffer);
2166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!mapper) {
217853b12aa319e4557a300923590538282c88314beAndy Qiu            ETRACE("failed to map buffer %#x", handle);
218853b12aa319e4557a300923590538282c88314beAndy Qiu            bm->unlockDataBuffer(buffer);
219853b12aa319e4557a300923590538282c88314beAndy Qiu            return false;
220e2ad4c047651d4442f6a0e002290016d45e9201afu jin        }
221e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    } else {
22219d923771eec99940aecc2ceba6bb877cbe3cd7elychenx        VTRACE("got mapper in saved data buffers and update source Crop");
223e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mapper = mDataBuffers.valueAt(index);
2246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2261585c7f1592c5f979fec68646191eccde79d2dfaJackie Li    // always update source crop to mapper
2271585c7f1592c5f979fec68646191eccde79d2dfaJackie Li    mapper->setCrop(mSrcCrop.x, mSrcCrop.y, mSrcCrop.w, mSrcCrop.h);
2281585c7f1592c5f979fec68646191eccde79d2dfaJackie Li
2299f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li    mapper->setIsCompression(isCompression);
2309f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li
231eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // unlock buffer after getting mapper
232eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bm->unlockDataBuffer(buffer);
233eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    buffer = NULL;
2346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
235ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    ret = setDataBuffer(*mapper);
236c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (ret) {
237ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mCurrentDataBuffer = handle;
238c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // update active buffers
239c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        updateActiveBuffers(mapper);
240c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
241eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return ret;
242c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
243c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
244c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie LiBufferMapper* DisplayPlane::mapBuffer(DataBuffer *buffer)
245c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
246c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
247569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li
248853b12aa319e4557a300923590538282c88314beAndy Qiu    // invalidate buffer cache  if cache is full
2493f1974031c88750a14adc8f2f49538837238abf9Lin Xie    if ((int)mDataBuffers.size() >= mCacheCapacity) {
250853b12aa319e4557a300923590538282c88314beAndy Qiu        invalidateBufferCache();
251569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    }
252569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li
253c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper *mapper = bm->map(*buffer);
254c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!mapper) {
255c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        ETRACE("failed to map buffer");
256c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        return NULL;
257c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
258c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
259c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // add it to data buffers
260c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    ssize_t index = mDataBuffers.add(buffer->getKey(), mapper);
261c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (index < 0) {
262c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        ETRACE("failed to add mapper");
263eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
264c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        return NULL;
265c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
266c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
267c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    return mapper;
268c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
269c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
270c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool DisplayPlane::isActiveBuffer(BufferMapper *mapper)
271c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
272c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveBuffers.size(); i++) {
273c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *activeMapper = mActiveBuffers.itemAt(i);
274c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (!activeMapper)
275c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            continue;
276c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (activeMapper->getKey() == mapper->getKey())
277c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            return true;
278c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
279c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
2806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return false;
2816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
283c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::updateActiveBuffers(BufferMapper *mapper)
2846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
285c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
2866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
287c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // unmap the first entry (oldest buffer)
288c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size() >= MIN_DATA_BUFFER_COUNT) {
289c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *oldest = mActiveBuffers.itemAt(0);
290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(oldest);
291c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveBuffers.removeAt(0);
292c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
293c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
294c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // queue it to active buffers
295c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!isActiveBuffer(mapper)) {
296c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper->incRef();
297c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveBuffers.push_back(mapper);
298c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
299c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
300e2ad4c047651d4442f6a0e002290016d45e9201afu jin
301c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::invalidateActiveBuffers()
302c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
303e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
304c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper* mapper;
305c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
306c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    RETURN_VOID_IF_NOT_INIT();
307c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
308c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    VTRACE("invalidating active buffers");
309c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
310c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveBuffers.size(); i++) {
311c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper = mActiveBuffers.itemAt(i);
312c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // unmap it
313eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
314e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
315c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
316c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // clear recorded data buffers
317c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveBuffers.clear();
318e2ad4c047651d4442f6a0e002290016d45e9201afu jin}
319e2ad4c047651d4442f6a0e002290016d45e9201afu jin
320c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::invalidateBufferCache()
321e2ad4c047651d4442f6a0e002290016d45e9201afu jin{
322e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
323e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferMapper* mapper;
324e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
325c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    RETURN_VOID_IF_NOT_INIT();
326c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
327e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    for (size_t i = 0; i < mDataBuffers.size(); i++) {
328e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mapper = mDataBuffers.valueAt(i);
329eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
3306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
331e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
332e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    mDataBuffers.clear();
333ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // reset current buffer
3344a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    mCurrentDataBuffer = 0;
3356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlane::assignToDevice(int disp)
3386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
339e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
340e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("disp = %d", disp);
3416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mDevice = disp;
3436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
346e2ad4c047651d4442f6a0e002290016d45e9201afu jinbool DisplayPlane::flip(void *ctx)
3474a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{
3484a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    RETURN_FALSE_IF_NOT_INIT();
3494a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
350bef339f4733b9442d8e82e6349ec9ff04e1bca16Geng, Xiujun    // always flip
351bef339f4733b9442d8e82e6349ec9ff04e1bca16Geng, Xiujun    return true;
3524a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li}
3534a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
35493d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiuvoid DisplayPlane::postFlip()
35593d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu{
35693d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu    mUpdateMasks = 0;
35793d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu}
35893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu
359c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool DisplayPlane::reset()
360c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
361c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // reclaim all allocated resources
362c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mDataBuffers.size() > 0) {
363c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateBufferCache();
364c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
365c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
366c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size() > 0) {
367c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveBuffers();
368c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
369c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
370c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    return true;
371c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
372c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
373d9045abeda7b707f3c55779989fc77b2197bc38eJackie Livoid DisplayPlane::setZOrder(int zorder)
374d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li{
375d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    mZOrder = zorder;
376d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li}
377d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
378d9045abeda7b707f3c55779989fc77b2197bc38eJackie Liint DisplayPlane::getZOrder() const
379d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li{
380d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    return mZOrder;
381d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li}
382d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
3836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
3846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
385