OverlayPlaneBase.cpp revision cd727f537d5085eec7f1b8f9c1d33922d4de75d4
1d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 16d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 17d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <math.h> 180594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h> 20d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Hwcomposer.h> 2165efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <PhysicalDevice.h> 220594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/OverlayPlaneBase.h> 230594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/TTMBufferMapper.h> 240594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/GrallocSubBuffer.h> 2523921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx#include <DisplayQuery.h> 26fceeb45070ca7323f692f5ee25d62e079ce8c5c3Thierry Strudel#include <khronos/openmax/OMX_IntelVideoExt.h> 27fa7a36cfa74219be29ffcbbedfdb757bf8e7df41Thierry Strudel#include <hal_public.h> 28d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 29d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android { 30d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel { 31d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 32d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp) 33d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu : DisplayPlane(index, PLANE_OVERLAY, disp), 34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers(), 35c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers(), 36c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mCurrent(0), 37d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm(0), 3847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mPipeConfig(0), 3947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mBobDeinterlace(0) 40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 42c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 43c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = 0; 44c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase() 48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 49d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 52d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount) 53d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 54d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 55d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 57e2ad4c047651d4442f6a0e002290016d45e9201afu jin // NOTE: use overlay's data buffer count for the overlay plane 58e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (bufferCount < OVERLAY_DATA_BUFFER_COUNT) { 59e2ad4c047651d4442f6a0e002290016d45e9201afu jin ITRACE("override overlay buffer count from %d to %d", 60e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount, OVERLAY_DATA_BUFFER_COUNT); 61e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount = OVERLAY_DATA_BUFFER_COUNT; 62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 63e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (!DisplayPlane::initialize(bufferCount)) { 64e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DEINIT_AND_RETURN_FALSE("failed to initialize display plane"); 65e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 66e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 67e2ad4c047651d4442f6a0e002290016d45e9201afu jin mTTMBuffers.setCapacity(bufferCount); 68c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.setCapacity(MIN_DATA_BUFFER_COUNT); 69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 70d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init wsbm 71d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm = new Wsbm(drm->getDrmFd()); 72d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mWsbm || !mWsbm->initialize()) { 73d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create wsbm"); 74d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 76d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create overlay back buffer 77c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 78c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = createBackBuffer(); 79c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[i]) { 80c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer"); 81c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 82c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // reset back buffer 83c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu resetBackBuffer(i); 84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 86e2ad4c047651d4442f6a0e002290016d45e9201afu jin // disable overlay when created 87e2ad4c047651d4442f6a0e002290016d45e9201afu jin flush(PLANE_DISABLE); 886a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 9268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhangbool OverlayPlaneBase::isDisabled() 9368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang{ 9468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang RETURN_FALSE_IF_NOT_INIT(); 9568dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 9668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang struct drm_psb_register_rw_arg arg; 9768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 9868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 9968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.get_plane_state_mask = 1; 10068dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.plane.type = DC_OVERLAY_PLANE; 10168dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.plane.index = mIndex; 10268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // pass the pipe index to check its enabled status 10368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // now we can pass the device id directly since 10468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // their values are just equal 105c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu arg.plane.ctx = mDevice; // not used in kernel 10668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 10768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang Drm *drm = Hwcomposer::getInstance().getDrm(); 10868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 10968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang if (ret == false) { 11068dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang WTRACE("overlay plane query failed with error code %d", ret); 11168dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang return false; 11268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang } 11368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 11468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang DTRACE("overlay %d status %s on device %d, current device %d", 115c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mIndex, arg.plane.ctx ? "DISABLED" : "ENABLED", mDevice, mDevice); 11668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 11768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang return arg.plane.ctx == PSB_DC_PLANE_DISABLED; 11868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang} 11968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize() 121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 122e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (mTTMBuffers.size()) { 123e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu invalidateBufferCache(); 124e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 126c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 127c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 128c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 129c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 130c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // delete back buffer 131c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 132c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mBackBuffer[i]) { 133c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu deleteBackBuffer(i); 134c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = NULL; 135c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 136e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 137eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mWsbm); 138e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 139e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DisplayPlane::deinitialize(); 140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache() 143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear plane buffer cache 145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DisplayPlane::invalidateBufferCache(); 146c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp) 150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t pipeConfig = 0; 152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1549332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("overlay %d assigned to disp %d", mIndex, disp); 155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (disp) { 157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_EXTERNAL: 158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = (0x2 << 6); 159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_PRIMARY: 161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = 0; 163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // if pipe switching happened, then disable overlay first 1676a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mPipeConfig != pipeConfig) { 1686a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu DTRACE("overlay %d switched from %d to %d", mIndex, mDevice, disp); 169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu disable(); 1706a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mPipeConfig = pipeConfig; 173ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley DisplayPlane::assignToDevice(disp); 174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 175c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu enable(); 1766a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 180d191dc7a785f312ede10d711720d8ca32a71b44cJackie Livoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& zorderConfig, 1810594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel void * /*nativeConfig*/) 182d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 183d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 184d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 185d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li // setup overlay z order 186d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovaZOrder = -1; 187d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovcZOrder = -1; 188d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li for (size_t i = 0; i < zorderConfig.size(); i++) { 1899d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu DisplayPlane *plane = zorderConfig[i]->plane; 190d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getType() == DisplayPlane::PLANE_OVERLAY) { 191d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getIndex() == 0) { 192d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovaZOrder = i; 193d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } else if (plane->getIndex() == 1) { 194d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovcZOrder = i; 195d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 196d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 197d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 198d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 199c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 200c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 201c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 202c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return; 203c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 204c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // force overlay c above overlay a 205c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if ((ovaZOrder >= 0) && (ovaZOrder < ovcZOrder)) { 206c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCONFIG |= (1 << 15); 207c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } else { 208c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCONFIG &= ~(1 << 15); 209c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 210d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 212d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset() 214d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 217c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane::reset(); 218c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 219c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // invalidate active TTM buffers 220c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 221c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 222c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 223c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 224c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // reset back buffers 225c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 226c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu resetBackBuffer(i); 227c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 229d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 230d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 231d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable() 232d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 233d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 234c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 235c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 236c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 237c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 238d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 239c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (backBuffer->OCMD & 0x1) 240c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return true; 241d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 242c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCMD |= 0x1; 243c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2464a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_ENABLE); 247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable() 251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 253c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 254c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 255c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 256c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 258c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!(backBuffer->OCMD & 0x1)) 259c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return true; 260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 261c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCMD &= ~0x1; 2626a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 2636a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2654a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_DISABLE); 266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer() 270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 273eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // create back buffer 274eb726af21649d79ed720bdf329e0849270995c45Andy Qiu OverlayBackBuffer *backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer)); 275eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!backBuffer) { 276eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to allocate back buffer"); 277d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 278d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 279d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 280d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int size = sizeof(OverlayBackBufferBlk); 282eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int alignment = 64 * 1024; 283eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *wsbmBufferObject = 0; 284eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject); 285eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (ret == false) { 2863f1974031c88750a14adc8f2f49538837238abf9Lin Xie ETRACE("failed to allocate TTM buffer"); 287eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 288d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 289d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *virtAddr = mWsbm->getCPUAddress(wsbmBufferObject); 291eb726af21649d79ed720bdf329e0849270995c45Andy Qiu uint32_t gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject); 292eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->buf = (OverlayBackBufferBlk *)virtAddr; 294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->gttOffsetInPage = gttOffsetInPage; 295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->bufObject = (uint32_t)wsbmBufferObject; 296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 297d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage); 298d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 299d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return backBuffer; 300d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 302c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer(int buf) 303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 304c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[buf]) 305d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 306d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 307c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu void *wsbmBufferObject = (void *)mBackBuffer[buf]->bufObject; 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->destroyTTMBuffer(wsbmBufferObject); 309d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 3103f1974031c88750a14adc8f2f49538837238abf9Lin Xie WTRACE("failed to destroy TTM buffer"); 311d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // free back buffer 313c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu free(mBackBuffer[buf]); 314c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[buf] = 0; 315d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 316d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 317c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiuvoid OverlayPlaneBase::resetBackBuffer(int buf) 318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 321c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[buf] || !mBackBuffer[buf]->buf) 322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 324c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[buf]->buf; 325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu memset(backBuffer, 0, sizeof(OverlayBackBufferBlk)); 327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 32865efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset overlay 329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (OVERLAY_INIT_BRIGHTNESS & 0xff); 331d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 332d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY; 333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK; 334d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG = 0; 335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 3); 336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 27); 337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN &= ~(0x7 << 24); 338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN |= 0xff; 339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 341ffaa9065cde35b7e8394788565db987f4d2705f2Li ZengBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper, struct VideoPayloadBuffer *payload) 342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t khandle; 344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w, h; 345d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride, uvStride; 346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride_t stride; 347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int srcX, srcY, srcW, srcH; 348d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int tmp; 349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DataBuffer *buf; 351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ssize_t index; 352d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu TTMBufferMapper *mapper; 353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 354d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid payload buffer"); 357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 358d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 359d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 36011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcX = grallocMapper.getCrop().x; 36111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcY = grallocMapper.getCrop().y; 36211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcW = grallocMapper.getCrop().w; 36311e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcH = grallocMapper.getCrop().h; 36411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init ttm buffer 366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu khandle = payload->rotated_buffer_handle; 367d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu index = mTTMBuffers.indexOfKey(khandle); 368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (index < 0) { 369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("unmapped TTM buffer, will map it"); 370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 371d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = payload->rotated_width; 372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = payload->rotated_height; 3736b19a2416bbb375b9620025533d85b60582ed013mahongpe checkCrop(srcX, srcY, srcW, srcH, payload->coded_width, payload->coded_height); 374d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 375148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi uint32_t format = grallocMapper.getFormat(); 376148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi // this is for sw decode with tiled buffer in landscape mode 377148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi if (payload->tiling) 378148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi format = OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled; 379148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi 380d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // calculate stride 381148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi switch (format) { 382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YV12: 383d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: 38423921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx uint32_t yStride_align; 3854a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat()); 3864a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (yStride_align > 0) 38723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 38823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), yStride_align); 38923921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 39023921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx else 39123921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 39223921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), 64); 39323921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = align_to(yStride >> 1, 64); 395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 397d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 398eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: 399eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu yStride = align_to(align_to(w, 32), 64); 400eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu uvStride = yStride; 401eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.yStride = yStride; 402eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.uvStride = uvStride; 403eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: 4053b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: 406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = yStride; 408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: 412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: 413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to((align_to(w, 32) << 1), 64); 414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = 0; 415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 420eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer buf(khandle); 421d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // update buffer 422eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setStride(stride); 423eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setWidth(w); 424eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setHeight(h); 425eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setCrop(srcX, srcY, srcW, srcH); 426148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi buf.setFormat(format); 427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 428d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create buffer mapper 429eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool res = false; 430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 431eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = new TTMBufferMapper(*mWsbm, buf); 432eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 433eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to allocate mapper"); 434eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 435eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // map ttm buffer 437eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ret = mapper->map(); 438eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!ret) { 439eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to map"); 440c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 44124d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ret = mapper->map(); 44224d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (!ret) { 44324d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ETRACE("failed to remap"); 44424d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu break; 44524d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44624d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44724d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu 44824d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (mTTMBuffers.size() >= OVERLAY_DATA_BUFFER_COUNT) { 449c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 450eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 451d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 452eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // add mapper 453eb726af21649d79ed720bdf329e0849270995c45Andy Qiu index = mTTMBuffers.add(khandle, mapper); 454eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (index < 0) { 455eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to add TTMMapper"); 456eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 457eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 458c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 459eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper refCount since it is added to mTTMBuffers 460eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 461eb726af21649d79ed720bdf329e0849270995c45Andy Qiu res = true; 462eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 463eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 464eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!res) { 465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 466eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 467eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 468eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 469eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = NULL; 470eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 471eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 474d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("got mapper in saved ttm buffers"); 475d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index)); 47611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe if (mapper->getCrop().x != srcX || mapper->getCrop().y != srcY || 47711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->getCrop().w != srcW || mapper->getCrop().h != srcH) { 4786b19a2416bbb375b9620025533d85b60582ed013mahongpe checkCrop(srcX, srcY, srcW, srcH, payload->coded_width, payload->coded_height); 47911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->setCrop(srcX, srcY, srcW, srcH); 48011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 481d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 482d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 483d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 484d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return mapper; 485d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 486d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 487d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper) 488d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 489d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) 490d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 491d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 492c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!mapper->decRef()) { 493c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 494c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->unmap(); 495c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 496c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // destroy this mapper 497c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li delete mapper; 498c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 499c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 500d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 501c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool OverlayPlaneBase::isActiveTTMBuffer(BufferMapper *mapper) 502c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 503c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 504c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *activeMapper = mActiveTTMBuffers.itemAt(i); 505c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!activeMapper) 506c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li continue; 507c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (activeMapper->getKey() == mapper->getKey()) 508c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return true; 509c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 510d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 511c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return false; 512c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 513c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 514c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::updateActiveTTMBuffers(BufferMapper *mapper) 515c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 516c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap the first entry (oldest buffer) 517c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mActiveTTMBuffers.size() >= MAX_ACTIVE_TTM_BUFFERS) { 518c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *oldest = mActiveTTMBuffers.itemAt(0); 519c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(oldest); 520c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.removeAt(0); 521c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 522c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 523c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // queue it to cached buffers 524c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!isActiveTTMBuffer(mapper)) { 525c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->incRef(); 526c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.push_back(mapper); 527c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 528c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 529c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 530c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::invalidateActiveTTMBuffers() 531c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 532c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper* mapper; 533c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 534c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 535c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 536c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 537c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper = mActiveTTMBuffers.itemAt(i); 538c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 539c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(mapper); 540c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 541c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 542c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // clear recorded data buffers 543c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.clear(); 544d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 545d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 546c90f6a1247780413b7396e72d8b095227438f51eAndy Qiuvoid OverlayPlaneBase::invalidateTTMBuffers() 547c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu{ 548c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu BufferMapper* mapper; 549c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu for (size_t i = 0; i < mTTMBuffers.size(); i++) { 550c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mapper = mTTMBuffers.valueAt(i); 551c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu // putTTMMapper removes mapper from cache 552c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu putTTMMapper(mapper); 553c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu } 554c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mTTMBuffers.clear(); 555c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu} 556c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu 557ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng 558ffaa9065cde35b7e8394788565db987f4d2705f2Li Zengbool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper) 559d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 560d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 561d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format; 562d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 563d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // only NV12_VED has rotated buffer 564d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu format = mapper.getFormat(); 5653b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 5663b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) 567d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 568d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 569d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 570d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check payload 571d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 572d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("no payload found"); 573d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 574d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 575d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 576d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->force_output_method == FORCE_OUTPUT_GPU) 577d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 578d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 579d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->client_transform != mTransform) { 58051e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang if (payload->surface_protected) { 58151e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->hwc_timestamp = systemTime(); 58251e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->layer_transform = mTransform; 58351e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang } 584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("client is not ready"); 585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 586d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 587d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 588ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng rotatedMapper = getTTMMapper(mapper, payload); 589d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 590d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 591d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 592c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 5930594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool OverlayPlaneBase::useOverlayRotation(BufferMapper& /* mapper */) 594c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{ 595c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // by default overlay plane does not support rotation. 596c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 597c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu} 598c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h) 600d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 601ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley drmModeModeInfoPtr mode = &mModeInfo; 602ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 603ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley if (mode->hdisplay == 0 || mode->vdisplay == 0) 604d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 605d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (x < 0) 607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = 0; 608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (y < 0) 609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = 0; 610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((x + w) > mode->hdisplay) 611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mode->hdisplay - x; 612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((y + h) > mode->vdisplay) 613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mode->vdisplay - y; 614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 615d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 6166b19a2416bbb375b9620025533d85b60582ed013mahongpevoid OverlayPlaneBase::checkCrop(int& srcX, int& srcY, int& srcW, int& srcH, 6176b19a2416bbb375b9620025533d85b60582ed013mahongpe int coded_width, int coded_height) 61811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe{ 61911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe int tmp; 62047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 62147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mTransform) 62247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcH >>= mBobDeinterlace; 62347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 624c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform == HWC_TRANSFORM_ROT_90 || mTransform == HWC_TRANSFORM_ROT_270) { 62511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcH; 62611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcH = srcW; 62711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcW = tmp; 62811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 62911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcX; 63011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcX = srcY; 63111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcY = tmp; 6326b19a2416bbb375b9620025533d85b60582ed013mahongpe 6336b19a2416bbb375b9620025533d85b60582ed013mahongpe tmp = coded_width; 6346b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_width = coded_height; 6356b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_height = tmp; 63611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 63711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 63811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe // skip pading bytes in rotate buffer 63911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe switch(mTransform) { 640c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_90: 64147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcX = (coded_width >> mBobDeinterlace) - srcW - srcX; 64211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 643c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_180: 6446b19a2416bbb375b9620025533d85b60582ed013mahongpe srcX = coded_width - srcW - srcX; 64547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcY = (coded_height >> mBobDeinterlace) - srcH - srcY; 64611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 647c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_270: 6486b19a2416bbb375b9620025533d85b60582ed013mahongpe srcY = coded_height - srcH - srcY; 64911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 65011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe default: 65111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 65211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 65311e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe} 65411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 65511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 660c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12); 668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w = mapper.getWidth(); 671d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t h = mapper.getHeight(); 672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcX= mapper.getCrop().x; 673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcY= mapper.getCrop().y; 674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 675d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear original format setting 676d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~(0xf << 10); 6773b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED; 678d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 679d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Y/U/V plane must be 4k bytes aligned. 680d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0Y = gttOffsetInBytes; 681927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu if (mIsProtectedBuffer) { 682927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // temporary workaround until vsync event logic is corrected. 683927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // it seems that overlay buffer update and renderring can be overlapped, 684927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // as such encryption bit may be cleared during HW rendering 685927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu backBuffer->OSTART_0Y |= 0x01; 686927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu } 687927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu 688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0U = gttOffsetInBytes; 689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0V = gttOffsetInBytes; 690d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1Y = backBuffer->OSTART_0Y; 692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1U = backBuffer->OSTART_0U; 693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1V = backBuffer->OSTART_0V; 694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(format) { 69665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YV12: // YV12 697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = yStride * h; 699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2)); 700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 70265efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 703d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 704d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * h; 705d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2)); 706d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 707d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 708eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 709eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0Y = 0; 7105985dd13bd4e64380aafd33ac11becbeed19e686fu jin backBuffer->OBUF_0U = yStride * h; 711eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0V = 0; 712eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 713eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 71465efc253a628175c7afa95c431b746ea20052794Andy Qiu // NOTE: this is the decoded video format, align the height to 32B 71565efc253a628175c7afa95c431b746ea20052794Andy Qiu //as it's defined by video driver 7165985dd13bd4e64380aafd33ac11becbeed19e686fu jin case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // Intel codec NV12 717d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 718d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 719d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 720d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 721d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 7223b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: //NV12_tiled 7233b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0Y = 0; 7243b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0U = yStride * align_to(h, 32); 7253b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0V = 0; 7263b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0U += yStride * align_to(h, 32); 7273b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0V += yStride * align_to(h, 32); 7283b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1U = backBuffer->OSTART_0U; 7293b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1V = backBuffer->OSTART_0V; 7303b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0Y = srcX + (srcY << 16); 7313b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1Y = backBuffer->OTILEOFF_0Y; 7323b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0U = srcX + ((srcY / 2) << 16); 7333b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1U = backBuffer->OTILEOFF_0U; 7343b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0V = backBuffer->OTILEOFF_0U; 7353b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1V = backBuffer->OTILEOFF_0U; 7363b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 7373b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED; 7383b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi break; 73965efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 740d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 743d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2; 745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 74665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY; 752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y += srcY * yStride + srcX; 759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX; 760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX; 761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1Y = backBuffer->OBUF_0Y; 762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1U = backBuffer->OBUF_0U; 763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1V = backBuffer->OBUF_0V; 764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("done. offset (%d, %d, %d)", 766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y, 767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U, 768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V); 769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width) 773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ATRACE("offset = %d, width = %d", offset, width); 775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6); 777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth <<= 1; 779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth -= 1; 780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return swidth; 782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 788c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthy = 0; 795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthuv = 0; 796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t width = mapper.getCrop().w; 798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t height = mapper.getCrop().h; 799d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 800d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 801d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsety = backBuffer->OBUF_0Y; 802d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsetu = backBuffer->OBUF_0U; 803d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (format) { 80565efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YV12: // YV12 80665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 807eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 80865efc253a628175c7afa95c431b746ea20052794Andy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // NV12 8093b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: // NV12_tiled 810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 81165efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 81265efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 813d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu width <<= 1; 814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (width <= 0 || height <= 0) { 821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid src dim"); 822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (yStride <=0 && uvStride <= 0) { 826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid source stride"); 827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTH = width | ((width / 2) << 16); 831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthy = calculateSWidthSW(offsety, width); 832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthuv = calculateSWidthSW(offsetu, width / 2); 833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18); 834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SHEIGHT = height | ((height / 2) << 16); 835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16); 836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 842cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarikabool OverlayPlaneBase::setCoeffRegs(__attribute__((unused))double *coeff, 843cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))int mantSize, 844cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))coeffPtr pCoeff, 845cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))int pos) 846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 847cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika /* FIXME: PLEASE IMPLEMENT */ 848d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 850d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 851cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarikavoid OverlayPlaneBase::updateCoeff(__attribute__((unused))int taps, 852cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))double fCutoff, 853cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))bool isHoriz, 854cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))bool isY, 855cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika __attribute__((unused))coeffPtr pCoeff) 856d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 857cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika /* FIXME: PLEASE IMPLEMENT */ 858cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika return; 859d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 860d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 861d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper) 862d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 863d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 864d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleIntUV, xscaleFractUV; 865d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int yscaleIntUV, yscaleFractUV; 866d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int deinterlace_factor = 1; 86765efc253a628175c7afa95c431b746ea20052794Andy Qiu // UV is half the size of Y -- YUV420 868d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int uvratio = 2; 869d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t newval; 870d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 871d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 872d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, pos; 873d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool scaleChanged = false; 874d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int x, y, w, h; 875d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 876c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 877d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 878d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 882d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = mPosition.x; 883d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = mPosition.y; 884d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mPosition.w; 885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mPosition.h; 886d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check position 888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu checkPosition(x, y, w, h); 889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("final position (%d, %d, %d, %d)", x, y, w, h); 890d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 891d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((w <= 0) || (h <= 0)) { 892d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid dst width/height"); 893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 894d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 895d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 896d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // setup dst position 897d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINPOS = (y << 16) | x; 898d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINSZ = (h << 16) | w; 899d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 900d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcWidth = mapper.getCrop().w; 901d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcHeight = mapper.getCrop().h; 902d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstWidth = w; 903d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstHeight = h; 904d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 905d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("src (%dx%d), dst (%dx%d)", 906d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcWidth, srcHeight, 907d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu dstWidth, dstHeight); 90865efc253a628175c7afa95c431b746ea20052794Andy Qiu 90965efc253a628175c7afa95c431b746ea20052794Andy Qiu // Y down-scale factor as a multiple of 4096 910d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (srcWidth == dstWidth && srcHeight == dstHeight) { 911d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = (1 << 12); 912d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = (1 << 12)/deinterlace_factor; 913d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 914d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = ((srcWidth - 1) << 12) / dstWidth; 915d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor); 916d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 917d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 91865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Calculate the UV scaling factor 919d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFractUV = xscaleFract / uvratio; 920d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFractUV = yscaleFract / uvratio; 921d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 92265efc253a628175c7afa95c431b746ea20052794Andy Qiu // To keep the relative Y and UV ratios exact, round the Y scales 92365efc253a628175c7afa95c431b746ea20052794Andy Qiu // to a multiple of the Y/UV ratio. 924d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = xscaleFractUV * uvratio; 925d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = yscaleFractUV * uvratio; 926d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 92765efc253a628175c7afa95c431b746ea20052794Andy Qiu // Integer (un-multiplied) values 928d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleInt = xscaleFract >> 12; 929d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleInt = yscaleFract >> 12; 930d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 931d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleIntUV = xscaleFractUV >> 12; 932d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleIntUV = yscaleFractUV >> 12; 933d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 93465efc253a628175c7afa95c431b746ea20052794Andy Qiu // Check scaling ratio 935d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) { 936d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 937d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 938d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 939d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 94065efc253a628175c7afa95c431b746ea20052794Andy Qiu // shouldn't get here 941d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) { 942d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 943d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 944d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 945d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 946d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleInt << 15) | 947d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 948d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->YRGBSCALE) { 949d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 950d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->YRGBSCALE = newval; 951d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 952d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 953d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 954d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((yscaleFractUV & 0xFFF) << 20); 955d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALE) { 956d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 957d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALE = newval; 958d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 959d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 960d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = yscaleInt << 16 | yscaleIntUV; 961d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALEV) { 962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALEV = newval; 964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 96665efc253a628175c7afa95c431b746ea20052794Andy Qiu // Recalculate coefficients if the scaling changed 96765efc253a628175c7afa95c431b746ea20052794Andy Qiu // Only Horizontal coefficients so far. 968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (scaleChanged) { 969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffY; 970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffUV; 971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = xscaleFract / 4096.0; 973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = xscaleFractUV / 4096.0; 974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 97565efc253a628175c7afa95c431b746ea20052794Andy Qiu // Limit to between 1.0 and 3.0 976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY < MIN_CUTOFF_FREQ) 977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MIN_CUTOFF_FREQ; 978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY > MAX_CUTOFF_FREQ) 979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MAX_CUTOFF_FREQ; 980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV < MIN_CUTOFF_FREQ) 981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MIN_CUTOFF_FREQ; 982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV > MAX_CUTOFF_FREQ) 983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MAX_CUTOFF_FREQ; 984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY); 986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV); 987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_Y_TAPS + j; 991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->Y_HCOEFS[pos] = 992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffY[pos].sign << 15 | 993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].exponent << 12 | 994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].mantissa); 995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_UV_TAPS + j; 1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UV_HCOEFS[pos] = 1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffUV[pos].sign << 15 | 1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].exponent << 12 | 1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].mantissa); 1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1008d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 1009d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper) 1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper *mapper; 1015c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *rotatedMapper = 0; 1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 101747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi uint32_t format; 1018d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get gralloc mapper 1022d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = &grallocMapper; 102347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format = grallocMapper.getFormat(); 102447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar || 102547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) { 102647a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi struct VideoPayloadBuffer *payload; 102747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1); 102847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (!payload) { 102947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi ETRACE("invalid payload buffer"); 103047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi return 0; 103147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 103247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 103347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mBobDeinterlace = payload->bob_deinterlace; 103447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 103547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1036c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform && !useOverlayRotation(grallocMapper)) { 1037ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedBufferReady(grallocMapper, rotatedMapper)) { 1038c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu DTRACE("rotated buffer is not ready"); 1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1041d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1042ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedMapper) { 1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get rotated buffer"); 1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1045d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1046ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng mapper = rotatedMapper; 1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1049c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = bufferOffsetSetup(*mapper); 1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up buffer offsets"); 1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = coordinateSetup(*mapper); 1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up overlay coordinates"); 1064d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1065d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1066d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1067d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = scalingSetup(*mapper); 1068d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1069d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up scaling parameters"); 1070d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1071d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1072d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1073d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 10744a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 107547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mBobDeinterlace && !mTransform) { 107647a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUF_TYPE_FIELD; 107747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~FIELD_SELECT; 107847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= FIELD0; 107947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~(BUFFER_SELECT); 108047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUFFER0; 108147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 108247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1083c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // add to active ttm buffers if it's a rotated buffer 1084c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (rotatedMapper) { 1085c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li updateActiveTTMBuffers(mapper); 1086c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1087c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1088d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1089d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1090d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1091d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel 1092d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android 1093d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1094