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