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