1f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li/*
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*/
16f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
17f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li#include <math.h>
180594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h>
20f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li#include <Hwcomposer.h>
210594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/anniedale/AnnOverlayPlane.h>
220594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/tangier/TngGrallocBuffer.h>
23fceeb45070ca7323f692f5ee25d62e079ce8c5c3Thierry Strudel#include <khronos/openmax/OMX_IntelVideoExt.h>
24af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu#include <DisplayQuery.h>
25f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
26f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Linamespace android {
27f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Linamespace intel {
28f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
29f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie LiAnnOverlayPlane::AnnOverlayPlane(int index, int disp)
30c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    : OverlayPlaneBase(index, disp),
31c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu      mRotationBufProvider(NULL),
32f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li      mRotationConfig(0),
33c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu      mZOrderConfig(0),
34c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu      mUseOverlayRotation(true)
35f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
36f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
37c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
38c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    memset(&mContext, 0, sizeof(mContext));
39f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
40f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
41f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie LiAnnOverlayPlane::~AnnOverlayPlane()
42f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
43f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
44f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
45f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
46af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiubool AnnOverlayPlane::setDataBuffer(uint32_t handle)
47af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu{
48af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    if (handle == 0) {
49af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu        ELOGTRACE("handle == 0");
50af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu        return true;
51af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    }
52af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu
53af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    return DisplayPlane::setDataBuffer(handle);
54af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu}
55af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu
560594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelvoid AnnOverlayPlane::setZOrderConfig(ZOrderConfig& /* zorderConfig */,
570594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel        void *nativeConfig)
58f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
59f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int slot = (int)nativeConfig;
60f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
61f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
62f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
63f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    switch (slot) {
64f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case 0:
65f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        mZOrderConfig = 0;
66f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
67f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case 1:
68f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        mZOrderConfig = (1 << 8);
69f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
70f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case 2:
71f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        mZOrderConfig = (2 << 8);
72f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
73f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case 3:
74f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        mZOrderConfig = (3 << 8);
75f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
76f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    default:
774157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("Invalid overlay plane zorder %d", slot);
78f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return;
79f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
80f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
81f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
82f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::reset()
83f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
84c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    OverlayPlaneBase::reset();
85c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mRotationBufProvider) {
86c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mRotationBufProvider->reset();
87f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
88f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
89f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
90f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
91f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::enable()
92f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
93f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    RETURN_FALSE_IF_NOT_INIT();
94c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
95c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // by default always use overlay rotation
96c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    mUseOverlayRotation = true;
97f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
98f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (mContext.ctx.ov_ctx.ovadd & (0x1 << 15))
99f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return true;
100f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
101f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    mContext.ctx.ov_ctx.ovadd |= (0x1 << 15);
102f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
103f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // flush
104f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    flush(PLANE_ENABLE);
105c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
106f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
107f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
108f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
109f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::disable()
110f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
111f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    RETURN_FALSE_IF_NOT_INIT();
112f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
113c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (!(mContext.ctx.ov_ctx.ovadd & (0x1 << 15)))
114c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return true;
115f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
116c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    mContext.ctx.ov_ctx.ovadd &= ~(0x1 << 15);
117f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
118c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    mContext.ctx.ov_ctx.ovadd &= ~(0x300);
119f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
120c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    mContext.ctx.ov_ctx.ovadd |= mPipeConfig;
121f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
122f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // flush
123f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    flush(PLANE_DISABLE);
124f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
125f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
126f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
127f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
1289d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiuvoid AnnOverlayPlane::postFlip()
1299d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu{
1309d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // when using AnnOverlayPlane through AnnDisplayPlane as proxy, postFlip is never
1319d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // called so mUpdateMasks is never reset.
1329d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // When using AnnOverlayPlane directly, postFlip is invoked and mUpdateMasks is reset
1339d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // post-flip.
1349d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
1359d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // need to check why mUpdateMasks = 0 causes video freeze.
1369d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
1379d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    //DisplayPlane::postFlip();
1389d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu}
1399d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
140f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
141f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Livoid AnnOverlayPlane::resetBackBuffer(int buf)
142f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
143f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
144f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
145f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (!mBackBuffer[buf] || !mBackBuffer[buf]->buf)
146f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return;
147f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
148f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    OverlayBackBufferBlk *backBuffer = mBackBuffer[buf]->buf;
149f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
150f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    memset(backBuffer, 0, sizeof(OverlayBackBufferBlk));
151f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
152f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // reset overlay
153f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) |
154f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         (OVERLAY_INIT_BRIGHTNESS & 0xff);
155f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION;
156f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY;
157f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK;
158f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCONFIG = 0;
159f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCONFIG |= (0x1 << 27);
160f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // use 3 line buffers
161f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCONFIG |= 0x1;
162f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->SCHRKEN &= ~(0x7 << 24);
163f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->SCHRKEN |= 0xff;
164f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
165f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
166f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::bufferOffsetSetup(BufferMapper& mapper)
167f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
168f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
169f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
170f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf;
171f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (!backBuffer) {
1724157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid back buffer");
173f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
174f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
175f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
176f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t format = mapper.getFormat();
177f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12);
178f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t yStride = mapper.getStride().yuv.yStride;
179f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t uvStride = mapper.getStride().yuv.uvStride;
180f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t h = mapper.getHeight();
181f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t srcX= mapper.getCrop().x;
182f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t srcY= mapper.getCrop().y;
183f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t ySurface, uSurface, vSurface;
184f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t yTileOffsetX, yTileOffsetY;
185f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t uTileOffsetX, uTileOffsetY;
186f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t vTileOffsetX, vTileOffsetY;
187f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
1888b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
1898b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        format == HAL_PIXEL_FORMAT_BGRA_8888) {
1908b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        // set source format XRGB
1918b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        backBuffer->OCMD = OVERLAY_FORMAT_PLANAR_XRGB;
1928b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        // by pass YUV->RGB conversion, 8-bit output
1938b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        backBuffer->OCONFIG |= OVERLAY_CONFIG_BYPASS_DISABLE;
1948b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        backBuffer->OSTART_0Y = gttOffsetInBytes;
1958b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        backBuffer->OBUF_0Y = srcX * XRGB_BPP + srcY *
1968b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang            mapper.getStride().rgb.stride;
1978b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        return true;
1988b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang    }
1998b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang
200f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // clear original format setting
201f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCMD &= ~(0xf << 10);
202f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED;
203f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
2048960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0Y = 0;
2058960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0V = 0;
2068960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0U = 0;
207f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Y/U/V plane must be 4k bytes aligned.
208f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ySurface = gttOffsetInBytes;
209f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (mIsProtectedBuffer) {
210f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        // temporary workaround until vsync event logic is corrected.
211f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        // it seems that overlay buffer update and renderring can be overlapped,
212f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        // as such encryption bit may be cleared during HW rendering
213f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        ySurface |= 0x01;
214f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
215f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
216f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    switch(format) {
217530fd5114ebd3862520fa64d491730a845392320Austin Hu    case HAL_PIXEL_FORMAT_YV12:    // YV12
218f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = ySurface + yStride * h;
219f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = vSurface + uvStride * (h / 2);
220f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
221f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
222f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetX = srcX / 2;
223f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = srcY / 2;
224f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = uTileOffsetX;
225f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = uTileOffsetY;
226f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
227f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
228530fd5114ebd3862520fa64d491730a845392320Austin Hu    case HAL_PIXEL_FORMAT_INTEL_YV12:    // INTEL_YV12
229530fd5114ebd3862520fa64d491730a845392320Austin Hu        // The height of HAL_PIXEL_FORMAT_INTEL_YV12 gralloc buffer has been aligned with 32 pixels.
230530fd5114ebd3862520fa64d491730a845392320Austin Hu        vSurface = ySurface + yStride * align_to(h, 32);
231530fd5114ebd3862520fa64d491730a845392320Austin Hu        uSurface = vSurface + uvStride * (align_to(h, 32) / 2);
232530fd5114ebd3862520fa64d491730a845392320Austin Hu        yTileOffsetX = srcX;
233530fd5114ebd3862520fa64d491730a845392320Austin Hu        yTileOffsetY = srcY;
234530fd5114ebd3862520fa64d491730a845392320Austin Hu        uTileOffsetX = srcX / 2;
235530fd5114ebd3862520fa64d491730a845392320Austin Hu        uTileOffsetY = srcY / 2;
236530fd5114ebd3862520fa64d491730a845392320Austin Hu        vTileOffsetX = uTileOffsetX;
237530fd5114ebd3862520fa64d491730a845392320Austin Hu        vTileOffsetY = uTileOffsetY;
238530fd5114ebd3862520fa64d491730a845392320Austin Hu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
239530fd5114ebd3862520fa64d491730a845392320Austin Hu        break;
240f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case HAL_PIXEL_FORMAT_I420:    // I420
241f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = ySurface + yStride * h;
242f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = uSurface + uvStride * (h / 2);
243f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
244f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
245f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetX = srcX / 2;
246f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = srcY / 2;
247f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = uTileOffsetX;
248f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = uTileOffsetY;
249f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
250f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
251f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case HAL_PIXEL_FORMAT_NV12:    // NV12
2528960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx        uSurface = ySurface;
2538960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx        vSurface = ySurface;
2548960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx        backBuffer->OBUF_0U = yStride * h;
255f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
256f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
257f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetX = srcX / 2;
2588960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx        uTileOffsetY = srcY / 2 + h;
259f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = uTileOffsetX;
260f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = uTileOffsetY;
261f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
262f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
263f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // NOTE: this is the decoded video format, align the height to 32B
264f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    //as it's defined by video driver
265f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:    // NV12
266f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = ySurface + yStride * align_to(h, 32);
267f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = ySurface + yStride * align_to(h, 32);
268f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
269f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
2706f231af53729af67dfb4b03fddac0b09b9ba1513Li Zeng        uTileOffsetX = srcX;
271f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = srcY / 2;
272f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = uTileOffsetX;
273f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = uTileOffsetY;
274f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
275f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
276f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:  //NV12_tiled
277f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = ySurface + yStride * align_to(h, 32);
278f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = ySurface + yStride * align_to(h, 32);
279f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
280f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
2816f231af53729af67dfb4b03fddac0b09b9ba1513Li Zeng        uTileOffsetX = srcX;
282f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = srcY / 2;
283f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = uTileOffsetX;
284f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = uTileOffsetY;
285f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
286f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED;
287f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
288f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case HAL_PIXEL_FORMAT_YUY2:    // YUY2
289f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = ySurface;
290f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = ySurface;
291f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
292f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
293f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetX = yTileOffsetX;
294f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = yTileOffsetY;
295f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = yTileOffsetX;
296f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = yTileOffsetY;
297f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
298f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2;
299f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
300f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    case HAL_PIXEL_FORMAT_UYVY:    // UYVY
301f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uSurface = ySurface;
302f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vSurface = ySurface;
303f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetX = srcX;
304f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        yTileOffsetY = srcY;
305f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetX = yTileOffsetX;
306f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uTileOffsetY = yTileOffsetY;
307f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetX = yTileOffsetX;
308f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        vTileOffsetY = yTileOffsetY;
309f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
310f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY;
311f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        break;
312f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    default:
3134157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("unsupported format %d", format);
314f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
315f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
316f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
317f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OSTART_0Y = ySurface;
318f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OSTART_0U = uSurface;
319f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OSTART_0V = vSurface;
3208960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0Y += srcY * yStride + srcX;
3218960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX;
3228960a8a06a18833b0accc440f63560ed6eaaf9f6zhuxinglongx    backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX;
323f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OTILEOFF_0Y = yTileOffsetY << 16 | yTileOffsetX;
324f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OTILEOFF_0U = uTileOffsetY << 16 | uTileOffsetX;
325f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->OTILEOFF_0V = vTileOffsetY << 16 | vTileOffsetX;
326f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
3274157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    VLOGTRACE("done. offset (%d, %d, %d)",
328f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          backBuffer->OBUF_0Y,
329f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          backBuffer->OBUF_0U,
330f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          backBuffer->OBUF_0V);
331f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
332f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
333f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
334f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
33503ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiubool AnnOverlayPlane::coordinateSetup(BufferMapper& mapper)
33603ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu{
33703ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    CTRACE();
33803ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu
33903ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    uint32_t format = mapper.getFormat();
34003ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    if (format != HAL_PIXEL_FORMAT_BGRX_8888 &&
34103ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu        format != HAL_PIXEL_FORMAT_BGRA_8888) {
34203ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu        return OverlayPlaneBase::coordinateSetup(mapper);
34303ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    }
34403ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu
34503ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf;
34603ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    if (!backBuffer) {
3474157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid back buffer");
34803ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu        return false;
34903ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    }
35003ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu
35103ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    backBuffer->SWIDTH = mapper.getCrop().w;
35203ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    backBuffer->SHEIGHT = mapper.getCrop().h;
3538b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang    backBuffer->OSTRIDE = mapper.getStride().rgb.stride;
3548b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang    backBuffer->SWIDTHSW = calculateSWidthSW(backBuffer->OBUF_0Y,
3558b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang            backBuffer->OSTRIDE) << 2;
35603ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    return true;
35703ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu};
35803ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu
359f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::scalingSetup(BufferMapper& mapper)
360f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
361f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
362f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int xscaleIntUV, xscaleFractUV;
363f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int yscaleIntUV, yscaleFractUV;
364f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // UV is half the size of Y -- YUV420
365f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int uvratio = 2;
366f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t newval;
367f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES];
368f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES];
369f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    coeffRec ycoeffY[N_VERT_Y_TAPS * N_PHASES];
370f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    coeffRec ycoeffUV[N_VERT_UV_TAPS * N_PHASES];
371f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int i, j, pos;
372f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    bool scaleChanged = false;
373f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    int x, y, w, h;
37447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi    int deinterlace_factor = 1;
375ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    drmModeModeInfoPtr mode = &mModeInfo;
376f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
377f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf;
378f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (!backBuffer) {
3794157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid back buffer");
380f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
381f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
382f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
383ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    if (mPanelOrientation == PANEL_ORIENTATION_180) {
384ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        if (mode->hdisplay)
385ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley            x = mode->hdisplay - mPosition.x - mPosition.w;
386ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        else
387ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley            x = mPosition.x;
388ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        if (mode->vdisplay)
389ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley            y = mode->vdisplay - mPosition.y - mPosition.h;
390ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        else
391ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley            y = mPosition.y;
392ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    } else {
393ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        x = mPosition.x;
394ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley        y = mPosition.y;
395ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    }
396ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley
397f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    w = mPosition.w;
398f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    h = mPosition.h;
399f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
400f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // check position
401f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    checkPosition(x, y, w, h);
4024157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    VLOGTRACE("final position (%d, %d, %d, %d)", x, y, w, h);
403f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
404f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if ((w <= 0) || (h <= 0)) {
4054157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev         ELOGTRACE("invalid dst width/height");
406f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li         return false;
407f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
408f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
409f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // setup dst position
410f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->DWINPOS = (y << 16) | x;
411f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    backBuffer->DWINSZ = (h << 16) | w;
412f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
413f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t srcWidth = mapper.getCrop().w;
414f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t srcHeight = mapper.getCrop().h;
415f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t dstWidth = w;
416f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t dstHeight = h;
41703ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu    uint32_t format = mapper.getFormat();
41803ec9fafe981e98a32150dfb1ded2da6a84c212dAndy Qiu
41947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi    if (mBobDeinterlace && !mTransform)
42047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi        deinterlace_factor = 2;
42147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi
4224157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    VLOGTRACE("src (%dx%d), dst (%dx%d), transform %d",
423f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          srcWidth, srcHeight,
424f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          dstWidth, dstHeight,
425f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          mTransform);
426f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
427fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A    if (mBobDeinterlace) {
428fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A        float scaleY = (float)(srcHeight >> 1) / dstHeight;
429fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A        if (scaleY > 4 || scaleY < 0.25) {
430fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A            VLOGTRACE("Exceed scale limit for interlace, return false");
431fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A            return false;
432fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A        }
433fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A    }
434fa7f14775d01e854f4261e32fb2efdfb8b84e9c4Jia, Lin A
435f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // switch destination width/height for scale factor calculation
436f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // for 90/270 transformation
437c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mUseOverlayRotation && ((mTransform == HWC_TRANSFORM_ROT_90) ||
438c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        (mTransform == HWC_TRANSFORM_ROT_270))) {
439f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        uint32_t tmp = srcHeight;
440f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        srcHeight = srcWidth;
441f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        srcWidth = tmp;
442f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
443f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
4448b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
4458b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang            format == HAL_PIXEL_FORMAT_BGRA_8888)
4468b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang        uvratio = 1;
4478b642f9779d1e30d8b08d9f611f93311cb34b19bLily Ouyang
448f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li     // Y down-scale factor as a multiple of 4096
449f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (srcWidth == dstWidth && srcHeight == dstHeight) {
450f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        xscaleFract = (1 << 12);
45147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi        yscaleFract = (1 << 12) / deinterlace_factor;
452f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    } else {
453f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        xscaleFract = ((srcWidth - 1) << 12) / dstWidth;
45447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi        yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor);
455f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
456f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
457f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Calculate the UV scaling factor
458f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    xscaleFractUV = xscaleFract / uvratio;
459f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    yscaleFractUV = yscaleFract / uvratio;
460f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
461f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
462f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // To keep the relative Y and UV ratios exact, round the Y scales
463f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // to a multiple of the Y/UV ratio.
464f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    xscaleFract = xscaleFractUV * uvratio;
465f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    yscaleFract = yscaleFractUV * uvratio;
466f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
467f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Integer (un-multiplied) values
468f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    xscaleInt = xscaleFract >> 12;
469f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    yscaleInt = yscaleFract >> 12;
470f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
471f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    xscaleIntUV = xscaleFractUV >> 12;
472f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    yscaleIntUV = yscaleFractUV >> 12;
473f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
474f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Check scaling ratio
475f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) {
4764157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
477f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
478f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
479f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
480f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // shouldn't get here
481f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) {
4824157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
483f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
484f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
485f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
486f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    newval = (xscaleInt << 15) |
487f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20);
488f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (newval != backBuffer->YRGBSCALE) {
489f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        scaleChanged = true;
490f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->YRGBSCALE = newval;
491f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
492f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
493f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) |
494f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ((yscaleFractUV & 0xFFF) << 20);
495f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (newval != backBuffer->UVSCALE) {
496f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        scaleChanged = true;
497f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->UVSCALE = newval;
498f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
499f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
500f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    newval = yscaleInt << 16 | yscaleIntUV;
501f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (newval != backBuffer->UVSCALEV) {
502f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        scaleChanged = true;
503f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        backBuffer->UVSCALEV = newval;
504f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
505f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
506f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Recalculate coefficients if the scaling changed
507f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // Only Horizontal coefficients so far.
508f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (scaleChanged) {
509f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        double fHCutoffY;
510f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        double fHCutoffUV;
511f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        double fVCutoffY;
512f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        double fVCutoffUV;
513f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
514f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        fHCutoffY = xscaleFract / 4096.0;
515f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        fHCutoffUV = xscaleFractUV / 4096.0;
516f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        fVCutoffY = yscaleFract / 4096.0;
517f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        fVCutoffUV = yscaleFractUV / 4096.0;
518f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
519f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        // Limit to between 1.0 and 3.0
520f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fHCutoffY < MIN_CUTOFF_FREQ)
521f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fHCutoffY = MIN_CUTOFF_FREQ;
522f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fHCutoffY > MAX_CUTOFF_FREQ)
523f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fHCutoffY = MAX_CUTOFF_FREQ;
524f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fHCutoffUV < MIN_CUTOFF_FREQ)
525f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fHCutoffUV = MIN_CUTOFF_FREQ;
526f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fHCutoffUV > MAX_CUTOFF_FREQ)
527f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fHCutoffUV = MAX_CUTOFF_FREQ;
528f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
529f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fVCutoffY < MIN_CUTOFF_FREQ)
530f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fVCutoffY = MIN_CUTOFF_FREQ;
531f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fVCutoffY > MAX_CUTOFF_FREQ)
532f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fVCutoffY = MAX_CUTOFF_FREQ;
533f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fVCutoffUV < MIN_CUTOFF_FREQ)
534f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fVCutoffUV = MIN_CUTOFF_FREQ;
535f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        if (fVCutoffUV > MAX_CUTOFF_FREQ)
536f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            fVCutoffUV = MAX_CUTOFF_FREQ;
537f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
538f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        updateCoeff(N_HORIZ_Y_TAPS, fHCutoffY, true, true, xcoeffY);
539f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        updateCoeff(N_HORIZ_UV_TAPS, fHCutoffUV, true, false, xcoeffUV);
540f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        updateCoeff(N_VERT_Y_TAPS, fVCutoffY, false, true, ycoeffY);
541f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        updateCoeff(N_VERT_UV_TAPS, fVCutoffUV, false, false, ycoeffUV);
542f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
543f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        for (i = 0; i < N_PHASES; i++) {
544f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            for (j = 0; j < N_HORIZ_Y_TAPS; j++) {
545f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                pos = i * N_HORIZ_Y_TAPS + j;
546f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                backBuffer->Y_HCOEFS[pos] =
547f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                        (xcoeffY[pos].sign << 15 |
548f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         xcoeffY[pos].exponent << 12 |
549f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         xcoeffY[pos].mantissa);
550f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            }
551f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        }
552f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        for (i = 0; i < N_PHASES; i++) {
553f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            for (j = 0; j < N_HORIZ_UV_TAPS; j++) {
554f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                pos = i * N_HORIZ_UV_TAPS + j;
555f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                backBuffer->UV_HCOEFS[pos] =
556f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         (xcoeffUV[pos].sign << 15 |
557f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                          xcoeffUV[pos].exponent << 12 |
558f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                          xcoeffUV[pos].mantissa);
559f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            }
560f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        }
561f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
562f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        for (i = 0; i < N_PHASES; i++) {
563f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            for (j = 0; j < N_VERT_Y_TAPS; j++) {
564f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                pos = i * N_VERT_Y_TAPS + j;
565f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                backBuffer->Y_VCOEFS[pos] =
566f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                        (ycoeffY[pos].sign << 15 |
567f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         ycoeffY[pos].exponent << 12 |
568f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         ycoeffY[pos].mantissa);
569f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            }
570f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        }
571f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        for (i = 0; i < N_PHASES; i++) {
572f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            for (j = 0; j < N_VERT_UV_TAPS; j++) {
573f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                pos = i * N_VERT_UV_TAPS + j;
574f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                backBuffer->UV_VCOEFS[pos] =
575f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                         (ycoeffUV[pos].sign << 15 |
576f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                          ycoeffUV[pos].exponent << 12 |
577f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li                          ycoeffUV[pos].mantissa);
578f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li            }
579f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        }
580f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
581f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
5824157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    XLOGTRACE();
583f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
584f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
585f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
586f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Livoid AnnOverlayPlane::setTransform(int transform)
587f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
588f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    RETURN_VOID_IF_NOT_INIT();
589f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
590f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    if (mPanelOrientation == PANEL_ORIENTATION_180)
591f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx       transform ^=  HWC_TRANSFORM_ROT_180;
592f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx
593f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    DisplayPlane::setTransform(transform);
594f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
595f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // setup transform config
596f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    switch (mTransform) {
597f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    case HWC_TRANSFORM_ROT_90:
598f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        mRotationConfig = (0x1 << 10);
599f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        break;
600f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    case HWC_TRANSFORM_ROT_180:
601f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        mRotationConfig = (0x2 << 10);
602f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        break;
603f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    case HWC_TRANSFORM_ROT_270:
604f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        mRotationConfig = (0x3 << 10);
605f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        break;
606f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    case 0:
607f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        mRotationConfig = 0;
608f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        break;
609f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx    default:
6104157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("Invalid transform %d", mTransform);
611f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        mRotationConfig = 0;
612f81b10f42efcf2f5c5ea6d14f6b649a756bb9070lychenx        break;
613f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
614f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
615f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
616979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang// HSD 4645510:
617979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang// This is a SOC limition, that when source buffer width range is
618979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang// in (960, 1024] - one cache line length, and rotation bit is set
619979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang// in portrait mode, video will show distortion.
620979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhangbool AnnOverlayPlane::isSettingRotBitAllowed()
621979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang{
622979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang    uint32_t width = mSrcCrop.w;
623979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang
624979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang    if ((width > 960 && width <= 1024) &&
625979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang            (mTransform == 0 || mTransform == HAL_TRANSFORM_ROT_180))
626979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang        return false;
627979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang    return true;
628979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang}
629979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang
630f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::flip(void *ctx)
631f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
632f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    uint32_t ovadd = 0;
633f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
634f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    RETURN_FALSE_IF_NOT_INIT();
635f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
6369d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    if (!DisplayPlane::flip(ctx)) {
6374157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to flip display plane.");
638f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
6399d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    }
640f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
641f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // update back buffer address
642f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ovadd = (mBackBuffer[mCurrent]->gttOffsetInPage << 12);
643f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
644f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // enable rotation mode and setup rotation config
645c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mIndex == 0 && mRotationConfig != 0) {
646979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang        if (isSettingRotBitAllowed())
647979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang            ovadd |= (1 << 12);
648f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        ovadd |= mRotationConfig;
649f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
650f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
651f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // setup z-order config
652f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ovadd |= mZOrderConfig;
653f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
654f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // load coefficients
655f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ovadd |= 0x1;
656f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
657f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // enable overlay
658f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    ovadd |= (1 << 15);
659f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
660f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    mContext.type = DC_OVERLAY_PLANE;
661f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    mContext.ctx.ov_ctx.ovadd = ovadd;
662f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    mContext.ctx.ov_ctx.index = mIndex;
66368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang    mContext.ctx.ov_ctx.pipe = mDevice;
66468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang    mContext.ctx.ov_ctx.ovadd |= mPipeConfig;
665f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
666f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // move to next back buffer
667f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    mCurrent = (mCurrent + 1) % OVERLAY_BACK_BUFFER_COUNT;
668f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
6694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    VLOGTRACE("ovadd = %#x, index = %d, device = %d",
670f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          mContext.ctx.ov_ctx.ovadd,
671f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          mIndex,
672f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li          mDevice);
673f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
674f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
675f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
676f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
677f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Livoid* AnnOverlayPlane::getContext() const
678f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
679f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    CTRACE();
680f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return (void *)&mContext;
681f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
682f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
683c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiubool AnnOverlayPlane::setDataBuffer(BufferMapper& mapper)
684c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{
685be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu    if (mIsProtectedBuffer) {
686be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        // workaround overlay scaling limitation
687be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        float scaleX = (float)mSrcCrop.w/mPosition.w;
688be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        float scaleY = (float)mSrcCrop.h/mPosition.h;
689be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        if (scaleX > 4.0) {
690be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            int crop = (mSrcCrop.w - 4 * mPosition.w)/2 + 1;
691be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mSrcCrop.x += crop;
692be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mSrcCrop.w -= 2 * crop;
693be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        }
694be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu
695be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        if (scaleY > 4.0) {
696be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            int crop = (mSrcCrop.h - 4 * mPosition.h)/2 + 1;
697be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mSrcCrop.y += crop;
698be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mSrcCrop.h -= 2 * crop;
699be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        }
700be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu
701be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        if (scaleX > 4.0 || scaleY > 4.0) {
702be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mUpdateMasks |= PLANE_SOURCE_CROP_CHANGED;
703be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu            mapper.setCrop(mSrcCrop.x, mSrcCrop.y, mSrcCrop.w, mSrcCrop.h);
704be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu        }
705be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu    }
706be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu
707be73a38f91504518c0a397aa3bbfb60ad1eff804Faxing Lu
708c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (OverlayPlaneBase::setDataBuffer(mapper) == false) {
709c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return false;
710c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
711c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
71250fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    signalVideoRotation(mapper);
71350fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian
714c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mIsProtectedBuffer) {
715c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        // Bit 0: Decryption request, only allowed to change on a synchronous flip
716c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        // This request will be qualified with the separate decryption enable bit for OV
717c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mBackBuffer[mCurrent]->buf->OSTART_0Y |= 0x1;
718c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mBackBuffer[mCurrent]->buf->OSTART_1Y |= 0x1;
719c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
720c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    return true;
721c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu}
722c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
723c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiubool AnnOverlayPlane::initialize(uint32_t bufferCount)
724c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{
725c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (!OverlayPlaneBase::initialize(bufferCount)) {
7264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to initialize OverlayPlaneBase");
727c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return false;
728c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
729c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
730c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // setup rotation buffer
731c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    mRotationBufProvider = new RotationBufferProvider(mWsbm);
732c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (!mRotationBufProvider || !mRotationBufProvider->initialize()) {
733c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to initialize RotationBufferProvider");
734c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
735c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    return true;
736c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu}
737c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
738c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiuvoid AnnOverlayPlane::deinitialize()
739c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{
740c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    DEINIT_AND_DELETE_OBJ(mRotationBufProvider);
741c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    OverlayPlaneBase::deinitialize();
742c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu}
743c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
744c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiubool AnnOverlayPlane::rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper)
745c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{
746c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    struct VideoPayloadBuffer *payload;
747c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    uint32_t format;
748c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // only NV12_VED has rotated buffer
749c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    format = mapper.getFormat();
750c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar &&
751c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) {
7524157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid video format %#x", format);
753c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return false;
754c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
755c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
756c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1);
757c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // check payload
758c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (!payload) {
7594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no payload found");
760c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return false;
761c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
762c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
763c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (payload->force_output_method == FORCE_OUTPUT_GPU) {
7644157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("Output method is not supported!");
765c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return false;
766c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
767c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
76847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi    if (payload->client_transform != mTransform ||
76947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi        mBobDeinterlace) {
770c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        if (!mRotationBufProvider->setupRotationBuffer(payload, mTransform)) {
7714157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            DLOGTRACE("failed to setup rotation buffer");
772c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu            return false;
773c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        }
774c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
775c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
776c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    rotatedMapper = getTTMMapper(mapper, payload);
777c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    return true;
778c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu}
779c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
78050fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jianvoid AnnOverlayPlane::signalVideoRotation(BufferMapper& mapper)
78150fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian{
78250fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    struct VideoPayloadBuffer *payload;
78350fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    uint32_t format;
78450fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian
78550fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    // check if it's video layer
78650fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    format = mapper.getFormat();
78750fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar &&
78850fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) {
78950fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        return;
79050fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    }
79150fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian
79250fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1);
79350fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    if (!payload) {
7944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("no payload found");
79550fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        return;
79650fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    }
79750fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian
79850fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    /* if use overlay rotation, signal decoder to stop rotation */
79950fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    if (mUseOverlayRotation) {
80050fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        if (payload->client_transform) {
8014157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            WLOGTRACE("signal decoder to stop generate rotation buffer");
80250fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian            payload->hwc_timestamp = systemTime();
80350fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian            payload->layer_transform = 0;
80450fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        }
80550fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    } else {
80650fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        /* if overlay rotation cannot be used, signal decoder to start rotation */
80750fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        if (payload->client_transform != mTransform) {
8084157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            WLOGTRACE("signal decoder to generate rotation buffer with transform %d", mTransform);
80950fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian            payload->hwc_timestamp = systemTime();
81050fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian            payload->layer_transform = mTransform;
81150fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian        }
81250fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian    }
81350fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian}
81450fdcdd34912ff25d41e4d339298043d97e56ea3Sun, Jian
8150594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool AnnOverlayPlane::useOverlayRotation(BufferMapper& /* mapper */)
816c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{
817c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mTransform == 0)
818c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        return true;
819c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
820979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang    if (!isSettingRotBitAllowed()) {
821979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang        mUseOverlayRotation = false;
822979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang        mRotationConfig = 0;
823979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang        return false;
824979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang    }
825979bcaa58b8db871baf3fd8cc03071d35190f194Lei Zhang
826c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // workaround limitation of overlay rotation by falling back to use VA rotated buffer
827c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    bool fallback = false;
828c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    float scaleX = (float)mSrcCrop.w / mPosition.w;
829c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    float scaleY = (float)mSrcCrop.h / mPosition.h;
830c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (mTransform == HAL_TRANSFORM_ROT_270 || mTransform == HAL_TRANSFORM_ROT_90) {
831c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        scaleX = (float)mSrcCrop.w / mPosition.h;
832c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        scaleY = (float)mSrcCrop.h / mPosition.w;
833c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
8340c951f01b324e1c7130a30f8a281516a59dd2aafAndy Qiu    if (scaleX >= 3 || scaleY >= 3 || scaleX < 1.0/3 || scaleY < 1.0/3) {
835c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        if (mUseOverlayRotation) {
8364157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            DLOGTRACE("overlay rotation with scaling >= 3, use VA rotated buffer");
837c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        }
838c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        fallback = true;
839c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    } else if ((int)mSrcCrop.x & 63) {
840c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        if (mUseOverlayRotation) {
8414157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            DLOGTRACE("offset is not 64 bytes aligned, use VA rotated buffer");
842c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        }
843c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        fallback = true;
84460787955231ad6ec7e76a9503ffe4afe20b0c0dcZhu,Tianyang    }
84560787955231ad6ec7e76a9503ffe4afe20b0c0dcZhu,Tianyang#if 0
84660787955231ad6ec7e76a9503ffe4afe20b0c0dcZhu,Tianyang    else if (mTransform != HAL_TRANSFORM_ROT_180 && scaleX != scaleY) {
847c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        if (mUseOverlayRotation) {
8484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev            DLOGTRACE("overlay rotation with uneven scaling, use VA rotated buffer");
849c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        }
850c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        fallback = true;
851c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
85260787955231ad6ec7e76a9503ffe4afe20b0c0dcZhu,Tianyang#endif
853c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
8541e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun    // per DC spec, if video is 1080(H)x1920(V), the buffer
8551e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun    // need 1920 of 64-pixel strip if using hw rotation.
8561e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun    // fallback to video ration buffer in such case.
8571e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun    if (mSrcCrop.w == 1080 && mSrcCrop.h == 1920 && mTransform != 0) {
8584157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        DLOGTRACE("1080(H)x1920(V) cannot use hw rotation, use VA rotated buffer");
8591e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun        fallback = true;
8601e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun    }
8611e6e382708f47ab092dfce38f71b920e129cc99aGeng, Xiujun
86247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi    if (fallback || mBobDeinterlace) {
863c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mUseOverlayRotation = false;
864c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mRotationConfig = 0;
865c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    } else {
866c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu        mUseOverlayRotation = true;
867c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
868c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    return mUseOverlayRotation;
869c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu}
870c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu
871f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Libool AnnOverlayPlane::flush(uint32_t flags)
872f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li{
873f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    RETURN_FALSE_IF_NOT_INIT();
8744157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("flags = %#x, type = %d, index = %d", flags, mType, mIndex);
875f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
8769d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    if (!(flags & PLANE_ENABLE) && !(flags & PLANE_DISABLE)) {
8774157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("invalid flush flags.");
878f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
8799d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    }
880f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
881f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    struct drm_psb_register_rw_arg arg;
882f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
883f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
884f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (flags & PLANE_DISABLE)
885f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        arg.plane_disable_mask = 1;
886f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    else if (flags & PLANE_ENABLE)
887f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        arg.plane_enable_mask = 1;
888f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
889f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    arg.plane.type = DC_OVERLAY_PLANE;
890f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    arg.plane.index = mIndex;
891f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    arg.plane.ctx = mContext.ctx.ov_ctx.ovadd;
892c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    if (flags & PLANE_DISABLE) {
8934157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        DLOGTRACE("disabling overlay %d on device %d", mIndex, mDevice);
894c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    }
895f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
896f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    // issue ioctl
897f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    Drm *drm = Hwcomposer::getInstance().getDrm();
898f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
899f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    if (ret == false) {
9004157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("overlay update failed with error code %d", ret);
901f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li        return false;
902f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    }
903f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
904f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    return true;
905f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li}
906f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
907f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li} // namespace intel
908f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li} // namespace android
909