16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h> 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DisplayPlane.h> 1925caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu#include <GraphicBuffer.h> 20af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu#include <DisplayQuery.h> 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 256a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane::DisplayPlane(int index, int type, int disp) 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu : mIndex(index), 276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mType(type), 28d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li mZOrder(-1), 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDevice(disp), 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false), 31e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mDataBuffers(), 32c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveBuffers(), 33569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mCacheCapacity(0), 3425caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mIsProtectedBuffer(false), 35c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mTransform(0), 360fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang mPlaneAlpha(0), 37c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBlending(HWC_BLENDING_NONE), 38ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li mCurrentDataBuffer(0), 39af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mUpdateMasks(0), 40af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mForceScaling(false), 41af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mDisplayWidth(0), 42af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mDisplayHeight(0), 43af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mScalingSource(0), 44af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mScalingTarget(0) 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 46e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 47e2ad4c047651d4442f6a0e002290016d45e9201afu jin memset(&mPosition, 0, sizeof(mPosition)); 48e2ad4c047651d4442f6a0e002290016d45e9201afu jin memset(&mSrcCrop, 0, sizeof(mSrcCrop)); 496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 516a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDisplayPlane::~DisplayPlane() 526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 53e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 56e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool DisplayPlane::initialize(uint32_t bufferCount) 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 58e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 60e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (bufferCount < MIN_DATA_BUFFER_COUNT) { 614157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("buffer count %d is too small", bufferCount); 62e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount = MIN_DATA_BUFFER_COUNT; 63e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 65e2ad4c047651d4442f6a0e002290016d45e9201afu jin // create buffer cache, adding few extra slots as buffer rendering is async 66e2ad4c047651d4442f6a0e002290016d45e9201afu jin // buffer could still be queued in the display pipeline such that they 67569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li // can't be unmapped] 68569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mCacheCapacity = bufferCount; 69c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mDataBuffers.setCapacity(bufferCount); 70c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveBuffers.setCapacity(MIN_DATA_BUFFER_COUNT); 716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 73e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 74e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 75e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid DisplayPlane::deinitialize() 76e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 77c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // invalidate cached data buffers 78c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mDataBuffers.size()) { 79e2ad4c047651d4442f6a0e002290016d45e9201afu jin // invalidateBufferCache will assert if object is not initialized 80e2ad4c047651d4442f6a0e002290016d45e9201afu jin // so invoking it only there is buffer to invalidate. 81e2ad4c047651d4442f6a0e002290016d45e9201afu jin invalidateBufferCache(); 82e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 83c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 84c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // invalidate active buffers 85c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveBuffers.size()) { 86c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveBuffers(); 87c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 88c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 89e2ad4c047651d4442f6a0e002290016d45e9201afu jin mCurrentDataBuffer = 0; 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = false; 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 934a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Livoid DisplayPlane::checkPosition(int& x, int& y, int& w, int& h) 944a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{ 95ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley drmModeModeInfoPtr mode = &mModeInfo; 96ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 97ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley if (mode->hdisplay == 0 || mode->vdisplay == 0) 984a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li return; 994a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 1004a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (x < 0) 1014a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li x = 0; 1024a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (y < 0) 1034a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li y = 0; 1044a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if ((x + w) > mode->hdisplay) 1054a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li w = mode->hdisplay - x; 1064a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if ((y + h) > mode->vdisplay) 1074a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li h = mode->vdisplay - y; 1084a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li} 1094a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setPosition(int x, int y, int w, int h) 1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1124157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("Position = %d, %d - %dx%d", x, y, w, h); 113e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 114af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu if (mForceScaling) { 115af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu // set in assignToDevice 1160127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mPosition.x = (int) (((float)x/DEFAULT_DRM_FB_WIDTH)*mDisplayWidth); 1170127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mPosition.y = (int) (((float)y/DEFAULT_DRM_FB_HEIGHT)*mDisplayHeight); 1180127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mPosition.w = (int) (((float)w/DEFAULT_DRM_FB_WIDTH)*mDisplayWidth); 1190127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mPosition.h = (int) (((float)h/DEFAULT_DRM_FB_HEIGHT)*mDisplayHeight); 1200127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang 1210127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mDisplayCrop.x = 0; 1220127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mDisplayCrop.y = 0; 1230127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mDisplayCrop.w = mDisplayWidth; 1240127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang mDisplayCrop.h = mDisplayHeight; 1250127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang 126af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu return; 127af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu } 128af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu 12993d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu if (mPosition.x != x || mPosition.y != y || 13093d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mPosition.w != w || mPosition.h != h) { 13193d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mUpdateMasks |= PLANE_POSITION_CHANGED; 13293d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mPosition.x = x; 13393d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mPosition.y = y; 13493d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mPosition.w = w; 13593d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mPosition.h = h; 136ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li } 1376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setSourceCrop(int x, int y, int w, int h) 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1414157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("Source crop = %d, %d - %dx%d", x, y, w, h); 1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 14393d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu if (mSrcCrop.x != x || mSrcCrop.y != y || 14493d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mSrcCrop.w != w || mSrcCrop.h != h) { 14593d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mUpdateMasks |= PLANE_SOURCE_CROP_CHANGED; 14693d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mSrcCrop.x = x; 14793d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mSrcCrop.y = y; 14893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mSrcCrop.w = w; 14993d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mSrcCrop.h = h; 150ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li } 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid DisplayPlane::setTransform(int trans) 1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1554157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("transform = %d", trans); 1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 157ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li if (mTransform == trans) { 158ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li return; 159ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li } 160ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li 161c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mTransform = trans; 162ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li 163ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li mUpdateMasks |= PLANE_TRANSFORM_CHANGED; 1646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 16610e89b1bb0d08ad3d037691125908641a914b58elychenxvoid DisplayPlane::setPlaneAlpha(uint8_t alpha, uint32_t blending) 1670fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang{ 1684157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("plane alpha = 0x%x", alpha); 1690fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang 1700fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang if (mPlaneAlpha != alpha) { 1710fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang mPlaneAlpha = alpha; 172501adda518a5e4fce00773343ec116fe2b11c2c1akumaraX mUpdateMasks |= PLANE_BUFFER_CHANGED; 1730fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang } 17410e89b1bb0d08ad3d037691125908641a914b58elychenx 17510e89b1bb0d08ad3d037691125908641a914b58elychenx if (mBlending != blending) { 17610e89b1bb0d08ad3d037691125908641a914b58elychenx mBlending = blending; 17710e89b1bb0d08ad3d037691125908641a914b58elychenx mUpdateMasks |= PLANE_BUFFER_CHANGED; 17810e89b1bb0d08ad3d037691125908641a914b58elychenx } 1790fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang} 1800fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool DisplayPlane::setDataBuffer(uint32_t handle) 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DataBuffer *buffer; 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu BufferMapper *mapper; 185e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ssize_t index; 186ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li bool ret; 1879f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li bool isCompression; 188e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 1896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 190e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu RETURN_FALSE_IF_NOT_INIT(); 1914157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("handle = %#x", handle); 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!handle) { 1944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("invalid buffer handle"); 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1984a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li // do not need to update the buffer handle 199ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li if (mCurrentDataBuffer != handle) 200ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li mUpdateMasks |= PLANE_BUFFER_CHANGED; 201ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li 202ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li // if no update then do Not need set data buffer 203ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li if (!mUpdateMasks) 2044a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li return true; 2054a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 206eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buffer = bm->lockDataBuffer(handle); 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!buffer) { 2084157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get buffer"); 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 2106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 21225caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu mIsProtectedBuffer = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer); 2139f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li isCompression = GraphicBuffer::isCompressionBuffer((GraphicBuffer*)buffer); 2149f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li 2156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // map buffer if it's not in cache 216e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li index = mDataBuffers.indexOfKey(buffer->getKey()); 217e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (index < 0) { 2184157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("unmapped buffer, mapping..."); 219c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper = mapBuffer(buffer); 2208d2f0025fc6c15c3fe0e4ecab89c54c34a63eefbAustin Hu // Skip the unsupported format in case that a new gralloc buffer was 2218d2f0025fc6c15c3fe0e4ecab89c54c34a63eefbAustin Hu // created and added into the mapped list, triggered by SoftwareRender 2228d2f0025fc6c15c3fe0e4ecab89c54c34a63eefbAustin Hu // with color conversion from known formats to YV12. 2238d2f0025fc6c15c3fe0e4ecab89c54c34a63eefbAustin Hu if (!mapper || mapper->getFormat() == HAL_PIXEL_FORMAT_YV12) { 2244157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map buffer %#x", handle); 225853b12aa319e4557a300923590538282c88314beAndy Qiu bm->unlockDataBuffer(buffer); 226853b12aa319e4557a300923590538282c88314beAndy Qiu return false; 227e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 228e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } else { 2294157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("got mapper in saved data buffers and update source Crop"); 230e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mapper = mDataBuffers.valueAt(index); 2316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2331585c7f1592c5f979fec68646191eccde79d2dfaJackie Li // always update source crop to mapper 2341585c7f1592c5f979fec68646191eccde79d2dfaJackie Li mapper->setCrop(mSrcCrop.x, mSrcCrop.y, mSrcCrop.w, mSrcCrop.h); 2351585c7f1592c5f979fec68646191eccde79d2dfaJackie Li 2369f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li mapper->setIsCompression(isCompression); 2379f379685f09ddd7c4d98b23121487e8ac4b4dd40Jackie Li 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 255853b12aa319e4557a300923590538282c88314beAndy Qiu // invalidate buffer cache if cache is full 2563f1974031c88750a14adc8f2f49538837238abf9Lin Xie if ((int)mDataBuffers.size() >= mCacheCapacity) { 257853b12aa319e4557a300923590538282c88314beAndy Qiu invalidateBufferCache(); 258569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li } 259569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li 260c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *mapper = bm->map(*buffer); 261c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!mapper) { 2624157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("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) { 2694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("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 3154157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("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(); 3474157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("disp = %d", disp); 3486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mDevice = disp; 350ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 351ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley Drm *drm = Hwcomposer::getInstance().getDrm(); 352ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley if (!drm->getModeInfo(mDevice, mModeInfo)) { 3534157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get mode info"); 354ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley } 355ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 356ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley mPanelOrientation = drm->getPanelOrientation(mDevice); 357ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 358af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mForceScaling = DisplayQuery::forceFbScaling(disp); 359af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu drm->getDisplayResolution(disp, mDisplayWidth, mDisplayHeight); 360af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu 361af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu if (mForceScaling) { 362af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mModeInfo.hdisplay = mDisplayWidth; 363af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu mModeInfo.vdisplay = mDisplayHeight; 3640127c89d2fbf729e671497ecd19a76d3837cf042Lei Zhang 365af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu } 366af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu 3676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 3686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 3696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 3700594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool DisplayPlane::flip(void * /* ctx */) 3714a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li{ 3724a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li RETURN_FALSE_IF_NOT_INIT(); 3734a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 374bef339f4733b9442d8e82e6349ec9ff04e1bca16Geng, Xiujun // always flip 375bef339f4733b9442d8e82e6349ec9ff04e1bca16Geng, Xiujun return true; 3764a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li} 3774a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 37893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiuvoid DisplayPlane::postFlip() 37993d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu{ 38093d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu mUpdateMasks = 0; 38193d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu} 38293d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu 383c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool DisplayPlane::reset() 384c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 385c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // reclaim all allocated resources 386c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mDataBuffers.size() > 0) { 387c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateBufferCache(); 388c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 389c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 390c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveBuffers.size() > 0) { 391c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveBuffers(); 392c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 393c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 394c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return true; 395c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 396c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 397d9045abeda7b707f3c55779989fc77b2197bc38eJackie Livoid DisplayPlane::setZOrder(int zorder) 398d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li{ 399d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li mZOrder = zorder; 400d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li} 401d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 402d9045abeda7b707f3c55779989fc77b2197bc38eJackie Liint DisplayPlane::getZOrder() const 403d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li{ 404d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li return mZOrder; 405d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li} 406d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 4076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 4086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 409