DisplayPlane.cpp revision 3f1974031c88750a14adc8f2f49538837238abf9
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),
396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mDevice(disp),
406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu      mInitialized(false),
41e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li      mDataBuffers(),
42c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li      mActiveBuffers(),
43569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li      mCacheCapacity(0),
4425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu      mIsProtectedBuffer(false),
454a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li      mTransform(PLANE_TRANSFORM_0),
46ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li      mCurrentDataBuffer(0),
47ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li      mUpdateMasks(0)
486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
49e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
50e2ad4c047651d4442f6a0e002290016d45e9201afu jin    memset(&mPosition, 0, sizeof(mPosition));
51e2ad4c047651d4442f6a0e002290016d45e9201afu jin    memset(&mSrcCrop, 0, sizeof(mSrcCrop));
526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
546a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane::~DisplayPlane()
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
56e2ad4c047651d4442f6a0e002290016d45e9201afu jin    WARN_IF_NOT_DEINIT();
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
59e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool DisplayPlane::initialize(uint32_t bufferCount)
606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
61e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
63e2ad4c047651d4442f6a0e002290016d45e9201afu jin    if (bufferCount < MIN_DATA_BUFFER_COUNT) {
64e2ad4c047651d4442f6a0e002290016d45e9201afu jin        WTRACE("buffer count %d is too small", bufferCount);
65e2ad4c047651d4442f6a0e002290016d45e9201afu jin        bufferCount = MIN_DATA_BUFFER_COUNT;
66e2ad4c047651d4442f6a0e002290016d45e9201afu jin    }
676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
68e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // create buffer cache, adding few extra slots as buffer rendering is async
69e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // buffer could still be queued in the display pipeline such that they
70569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    // can't be unmapped]
71569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    mCacheCapacity = bufferCount;
72c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mDataBuffers.setCapacity(bufferCount);
73c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveBuffers.setCapacity(MIN_DATA_BUFFER_COUNT);
746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = true;
756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
76e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li}
77e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
78e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid DisplayPlane::deinitialize()
79e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{
80c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // invalidate cached data buffers
81c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mDataBuffers.size()) {
82e2ad4c047651d4442f6a0e002290016d45e9201afu jin        // invalidateBufferCache will assert if object is not initialized
83e2ad4c047651d4442f6a0e002290016d45e9201afu jin        // so invoking it only there is buffer to invalidate.
84e2ad4c047651d4442f6a0e002290016d45e9201afu jin        invalidateBufferCache();
85e2ad4c047651d4442f6a0e002290016d45e9201afu jin    }
86c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
87c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // invalidate active buffers
88c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size()) {
89c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveBuffers();
90c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
91c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
92e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mCurrentDataBuffer = 0;
936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mInitialized = false;
946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
964a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Livoid DisplayPlane::checkPosition(int& x, int& y, int& w, int& h)
974a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{
984a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    Drm *drm = Hwcomposer::getInstance().getDrm();
9930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfo modeInfo;
10030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    if (!drm->getModeInfo(mDevice, modeInfo)) {
10130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu        ETRACE("failed to get mode info");
1024a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        return;
1034a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    }
10430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfoPtr mode = &modeInfo;
1054a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
1064a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if (x < 0)
1074a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        x = 0;
1084a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if (y < 0)
1094a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        y = 0;
1104a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if ((x + w) > mode->hdisplay)
1114a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        w = mode->hdisplay - x;
1124a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    if ((y + h) > mode->vdisplay)
1134a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        h = mode->vdisplay - y;
1144a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li}
1154a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setPosition(int x, int y, int w, int h)
1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
118e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("Position = %d, %d - %dx%d", x, y, w, h);
119e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
120ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // if position is unchanged, skip it
121ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mPosition.x == x && mPosition.y == y &&
122ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mPosition.w == w && mPosition.h == h) {
123ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks &= ~PLANE_POSITION_CHANGED;
124ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return;
125ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mPosition.x = x;
1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mPosition.y = y;
1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mPosition.w = w;
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mPosition.h = h;
131ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
132ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    mUpdateMasks |= PLANE_POSITION_CHANGED;
1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setSourceCrop(int x, int y, int w, int h)
1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
137e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("Source crop = %d, %d - %dx%d", x, y, w, h);
1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
139ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // if source crop is unchanged, skip it
140ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mSrcCrop.x == x && mSrcCrop.y == y &&
141ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mSrcCrop.w == w && mSrcCrop.h == h) {
142ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks &= ~PLANE_SOURCE_CROP_CHANGED;
143ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return;
144ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
145ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mSrcCrop.x = x;
1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mSrcCrop.y = y;
1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mSrcCrop.w = w;
1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mSrcCrop.h = h;
150ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
151ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    mUpdateMasks |= PLANE_SOURCE_CROP_CHANGED;
1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setTransform(int trans)
1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
156e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("transform = %d", trans);
1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
158ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mTransform == trans) {
159ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks &= ~PLANE_TRANSFORM_CHANGED;
160ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return;
161ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    }
162ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    switch (trans) {
1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_90:
1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_180:
1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    case PLANE_TRANSFORM_270:
1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mTransform = trans;
1686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        break;
1696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    default:
1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        mTransform = PLANE_TRANSFORM_0;
171ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        break;
1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
173ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
174ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    mUpdateMasks |= PLANE_TRANSFORM_CHANGED;
1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
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;
183e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
185e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
186e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("handle = %#x", handle);
1876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!handle) {
189e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("invalid buffer handle");
1906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1934a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    // do not need to update the buffer handle
194ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (mCurrentDataBuffer != handle)
195ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks |= PLANE_BUFFER_CHANGED;
196ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    else
197ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mUpdateMasks &= ~PLANE_BUFFER_CHANGED;
198ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li
199ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // if no update then do Not need set data buffer
200eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // TODO: this design assumes position/transform/sourcecrop are all set
201ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (!mUpdateMasks)
2024a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li        return true;
2034a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    buffer = bm->lockDataBuffer(handle);
2056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (!buffer) {
206e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        ETRACE("failed to get buffer");
2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // update buffer's source crop
2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    buffer->setCrop(mSrcCrop.x, mSrcCrop.y, mSrcCrop.w, mSrcCrop.h);
2126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
21325caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    mIsProtectedBuffer = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer);
2146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // map buffer if it's not in cache
215e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    index = mDataBuffers.indexOfKey(buffer->getKey());
216e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    if (index < 0) {
217e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("unmapped buffer, mapping...");
218c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper = mapBuffer(buffer);
2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        if (!mapper) {
220c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            // NOTE: this barely happens, but if it happened it means either the
221c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            // graphics memory is low, or buffer cache is full.
222c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            WTRACE("map failed, invalidate and try again...");
223c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            // invalidate buffer cache will release all old mappers and clear
224c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            // the buffer cache
2259e1a20bf84ccee98e619de69649699764d3daf8cmahongpe            invalidateBufferCache();
226c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            mapper = mapBuffer(buffer);
2279e1a20bf84ccee98e619de69649699764d3daf8cmahongpe            if (!mapper) {
228c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li                ETRACE("failed to map buffer %#x", handle);
229eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                bm->unlockDataBuffer(buffer);
230c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li                return false;
231e2ad4c047651d4442f6a0e002290016d45e9201afu jin            }
232e2ad4c047651d4442f6a0e002290016d45e9201afu jin        }
233e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    } else {
234e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu        VTRACE("got mapper in saved data buffers");
235e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mapper = mDataBuffers.valueAt(index);
2366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
2376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
238eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // unlock buffer after getting mapper
239eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bm->unlockDataBuffer(buffer);
240eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    buffer = NULL;
2416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
242ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    ret = setDataBuffer(*mapper);
243c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (ret) {
244ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        mCurrentDataBuffer = handle;
245c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // update active buffers
246c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        updateActiveBuffers(mapper);
247c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
248eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return ret;
249c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
250c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
251c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie LiBufferMapper* DisplayPlane::mapBuffer(DataBuffer *buffer)
252c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
253c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
254569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li
255569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    // don't map buffer if cache was full
2563f1974031c88750a14adc8f2f49538837238abf9Lin Xie    if ((int)mDataBuffers.size() >= mCacheCapacity) {
257569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li        return NULL;
258569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    }
259569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li
260c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper *mapper = bm->map(*buffer);
261c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!mapper) {
262c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        ETRACE("failed to map buffer");
263c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        return NULL;
264c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
265c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
266c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // add it to data buffers
267c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    ssize_t index = mDataBuffers.add(buffer->getKey(), mapper);
268c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (index < 0) {
269c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        ETRACE("failed to add mapper");
270eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
271c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        return NULL;
272c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
273c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
274c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    return mapper;
275c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
276c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
277c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool DisplayPlane::isActiveBuffer(BufferMapper *mapper)
278c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
279c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveBuffers.size(); i++) {
280c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *activeMapper = mActiveBuffers.itemAt(i);
281c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (!activeMapper)
282c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            continue;
283c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (activeMapper->getKey() == mapper->getKey())
284c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            return true;
285c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
286c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
2876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return false;
2886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
2896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
290c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::updateActiveBuffers(BufferMapper *mapper)
2916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
292c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
2936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
294c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // unmap the first entry (oldest buffer)
295c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size() >= MIN_DATA_BUFFER_COUNT) {
296c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *oldest = mActiveBuffers.itemAt(0);
297eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(oldest);
298c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveBuffers.removeAt(0);
299c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
300c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
301c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // queue it to active buffers
302c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!isActiveBuffer(mapper)) {
303c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper->incRef();
304c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveBuffers.push_back(mapper);
305c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
306c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
307e2ad4c047651d4442f6a0e002290016d45e9201afu jin
308c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::invalidateActiveBuffers()
309c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
310e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
311c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper* mapper;
312c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
313c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    RETURN_VOID_IF_NOT_INIT();
314c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
315c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    VTRACE("invalidating active buffers");
316c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
317c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveBuffers.size(); i++) {
318c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper = mActiveBuffers.itemAt(i);
319c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // unmap it
320eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
321e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    }
322c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
323c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // clear recorded data buffers
324c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveBuffers.clear();
325e2ad4c047651d4442f6a0e002290016d45e9201afu jin}
326e2ad4c047651d4442f6a0e002290016d45e9201afu jin
327c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid DisplayPlane::invalidateBufferCache()
328e2ad4c047651d4442f6a0e002290016d45e9201afu jin{
329e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
330e2ad4c047651d4442f6a0e002290016d45e9201afu jin    BufferMapper* mapper;
331e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
332c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    RETURN_VOID_IF_NOT_INIT();
333c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
334e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    for (size_t i = 0; i < mDataBuffers.size(); i++) {
335e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li        mapper = mDataBuffers.valueAt(i);
336eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unmap(mapper);
3376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
338e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
339e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    mDataBuffers.clear();
340ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // reset current buffer
3414a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    mCurrentDataBuffer = 0;
3426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlane::assignToDevice(int disp)
3456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
346e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    RETURN_FALSE_IF_NOT_INIT();
347e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    ATRACE("disp = %d", disp);
3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
3496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mDevice = disp;
3506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
3516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
3526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
353e2ad4c047651d4442f6a0e002290016d45e9201afu jinbool DisplayPlane::flip(void *ctx)
3544a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{
3554a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    RETURN_FALSE_IF_NOT_INIT();
3564a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
357ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    // don't flip if no updates
358ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    if (!mUpdateMasks)
359ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return false;
360ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    else
361ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        return true;
3624a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li}
3634a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
364c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool DisplayPlane::reset()
365c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
366c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // reclaim all allocated resources
367c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mDataBuffers.size() > 0) {
368c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateBufferCache();
369c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
370c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
371c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveBuffers.size() > 0) {
372c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveBuffers();
373c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
374c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
375c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    return true;
376c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
377c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
3786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
3796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
380