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