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