OverlayPlaneBase.cpp revision c90f6a1247780413b7396e72d8b095227438f51e
1d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu/* 2d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Copyright © 2012 Intel Corporation 3d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * All rights reserved. 4d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * 5d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Permission is hereby granted, free of charge, to any person obtaining a 6d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * copy of this software and associated documentation files (the "Software"), 7d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * to deal in the Software without restriction, including without limitation 8d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * and/or sell copies of the Software, and to permit persons to whom the 10d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Software is furnished to do so, subject to the following conditions: 11d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * 12d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * The above copyright notice and this permission notice (including the next 13d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * paragraph) shall be included in all copies or substantial portions of the 14d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Software. 15d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * 16d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * IN THE SOFTWARE. 23d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * 24d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Authors: 25d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Jackie Li <yaodong.li@intel.com> 26d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * 27d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */ 28d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 29d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <math.h> 30d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <HwcTrace.h> 31d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Drm.h> 32d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Hwcomposer.h> 3365efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <PhysicalDevice.h> 34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/OverlayPlaneBase.h> 35d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/TTMBufferMapper.h> 36d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/GrallocSubBuffer.h> 3723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx#include <DisplayQuery.h> 3823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx 39d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu// FIXME: remove it 41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <OMX_IVCommon.h> 42d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 43d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android { 44d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel { 45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp) 47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu : DisplayPlane(index, PLANE_OVERLAY, disp), 48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers(), 49c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers(), 50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer(0), 51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm(0), 526a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mPipeConfig(0), 536a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePending(false), 546a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingDevice(0), 556a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount(0) 56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 57d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 58d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 59d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 60d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase() 61d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 63d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 64d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 65d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount) 66d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 67d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 68d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 70e2ad4c047651d4442f6a0e002290016d45e9201afu jin // NOTE: use overlay's data buffer count for the overlay plane 71e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (bufferCount < OVERLAY_DATA_BUFFER_COUNT) { 72e2ad4c047651d4442f6a0e002290016d45e9201afu jin ITRACE("override overlay buffer count from %d to %d", 73e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount, OVERLAY_DATA_BUFFER_COUNT); 74e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount = OVERLAY_DATA_BUFFER_COUNT; 75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 76e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (!DisplayPlane::initialize(bufferCount)) { 77e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DEINIT_AND_RETURN_FALSE("failed to initialize display plane"); 78e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 79e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 80e2ad4c047651d4442f6a0e002290016d45e9201afu jin mTTMBuffers.setCapacity(bufferCount); 81c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.setCapacity(MIN_DATA_BUFFER_COUNT); 82d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 83d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init wsbm 84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm = new Wsbm(drm->getDrmFd()); 85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mWsbm || !mWsbm->initialize()) { 86d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create wsbm"); 87d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 88d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create overlay back buffer 90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer = createBackBuffer(); 91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer) { 92d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer"); 93d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 94d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 95d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // reset back buffer 96d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu resetBackBuffer(); 97d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 98e2ad4c047651d4442f6a0e002290016d45e9201afu jin 99e2ad4c047651d4442f6a0e002290016d45e9201afu jin // disable overlay when created 100e2ad4c047651d4442f6a0e002290016d45e9201afu jin flush(PLANE_DISABLE); 1016a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 1026a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu // overlay by default is in "disabled" status 1036a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePending = false; 1046a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingDevice = 0; 1056a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount = 0; 106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize() 110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 111e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (mTTMBuffers.size()) { 112e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu invalidateBufferCache(); 113e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 115c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 116c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 117c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 118c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 119e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (mBackBuffer) { 120e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu deleteBackBuffer(); 121e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 122e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 123eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mWsbm); 124e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 125e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DisplayPlane::deinitialize(); 126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1286a56bd739af22a3c34067426edbb3082504d8e03Andy Qiubool OverlayPlaneBase::setDataBuffer(uint32_t handle) 1296a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu{ 1306a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mDisablePending) { 1316a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (isFlushed() || mDisablePendingCount >= OVERLAY_DISABLING_COUNT_MAX) { 1326a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePending = false; 1336a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingDevice = 0; 1346a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount = 0; 1356a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu enable(); 1366a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } else { 1376a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount++; 1386a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu WTRACE("overlay %d disabling on device %d is still pending, count: %d", 1396a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mIndex, mDisablePendingDevice, mDisablePendingCount); 1406a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu return false; 1416a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 1426a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 1436a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 1446a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu return DisplayPlane::setDataBuffer(handle); 1456a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu} 1466a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache() 148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear plane buffer cache 150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DisplayPlane::invalidateBufferCache(); 151c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp) 155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t pipeConfig = 0; 157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1596a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu DTRACE("overlay %d assigned to disp %d", mIndex, disp); 160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (disp) { 162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_EXTERNAL: 163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = (0x2 << 6); 164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_PRIMARY: 166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 167d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = 0; 168d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // if pipe switching happened, then disable overlay first 1726a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mPipeConfig != pipeConfig) { 1736a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu DTRACE("overlay %d switched from %d to %d", mIndex, mDevice, disp); 174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu disable(); 1756a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mPipeConfig = pipeConfig; 178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mDevice = disp; 179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1806a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (!mDisablePending) { 1816a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu enable(); 1826a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 1836a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 184d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 185d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 186d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 187d191dc7a785f312ede10d711720d8ca32a71b44cJackie Livoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& zorderConfig, 188d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li void *nativeConfig) 189d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 190d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 191d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 192d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 193d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (!backBuffer) 194d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li return; 195d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 196d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li // setup overlay z order 197d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovaZOrder = -1; 198d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovcZOrder = -1; 199d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li for (size_t i = 0; i < zorderConfig.size(); i++) { 200d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li DisplayPlane *plane = zorderConfig.itemAt(i); 201d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getType() == DisplayPlane::PLANE_OVERLAY) { 202d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getIndex() == 0) { 203d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovaZOrder = i; 204d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } else if (plane->getIndex() == 1) { 205d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovcZOrder = i; 206d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 207d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 208d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 209d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 210d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li // force overlay c above overlay a 211d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li if ((ovaZOrder >= 0) && (ovaZOrder < ovcZOrder)) { 212d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li backBuffer->OCONFIG |= (1 << 15); 213d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } else { 214d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li backBuffer->OCONFIG &= ~(1 << 15); 215d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 218d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset() 219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 220d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 2226a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mDisablePending) { 2236a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (isFlushed() || mDisablePendingCount >= OVERLAY_DISABLING_COUNT_MAX) { 2246a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePending = false; 2256a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingDevice = 0; 2266a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount = 0; 2276a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } else { 2286a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount++; 2296a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu WTRACE("overlay %d disabling is still pending on device %d, count %d", 2306a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mIndex, mDisablePendingDevice, mDisablePendingCount); 2316a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu return false; 2326a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 2336a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 2346a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 235c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane::reset(); 236c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 237c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // invalidate active TTM buffers 238c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 239c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 240c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 241c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 242d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // reset back buffer 243d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu resetBackBuffer(); 244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 246d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable() 249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) 253d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 254d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 255d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (backBuffer->OCMD & 0x1) 256d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 258d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 259d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2614a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_ENABLE); 262d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 263d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 265d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable() 266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) 270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!(backBuffer->OCMD & 0x1)) 273d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 274d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 2756a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mDisablePending) { 2766a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu WTRACE("overlay %d disabling is still pending on device %d, skip disabling", 2776a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mIndex, mDisablePendingDevice); 2786a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu return true; 2796a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 2806a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 281d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~0x1; 282d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 283d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2844a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_DISABLE); 2856a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 2866a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu // "disable" is asynchronous and needs at least one vsync to complete 2876a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePending = true; 2886a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingDevice = mDevice; 2896a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu mDisablePendingCount = 0; 290d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 291d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 292d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer() 294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 297eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // create back buffer 298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu OverlayBackBuffer *backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer)); 299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!backBuffer) { 300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to allocate back buffer"); 301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 302d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 304d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int size = sizeof(OverlayBackBufferBlk); 306eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int alignment = 64 * 1024; 307eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *wsbmBufferObject = 0; 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject); 309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (ret == false) { 3103f1974031c88750a14adc8f2f49538837238abf9Lin Xie ETRACE("failed to allocate TTM buffer"); 311eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 313d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 314eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *virtAddr = mWsbm->getCPUAddress(wsbmBufferObject); 315eb726af21649d79ed720bdf329e0849270995c45Andy Qiu uint32_t gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject); 316eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 317d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->buf = (OverlayBackBufferBlk *)virtAddr; 318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->gttOffsetInPage = gttOffsetInPage; 319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->bufObject = (uint32_t)wsbmBufferObject; 320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 321d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage); 322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return backBuffer; 324d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer() 327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 328d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer) 329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 331eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *wsbmBufferObject = (void *)mBackBuffer->bufObject; 332eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->destroyTTMBuffer(wsbmBufferObject); 333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 3343f1974031c88750a14adc8f2f49538837238abf9Lin Xie WTRACE("failed to destroy TTM buffer"); 335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // free back buffer 337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu free(mBackBuffer); 338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer = 0; 339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 341d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::resetBackBuffer() 342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mBackBuffer || !mBackBuffer->buf) 346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu memset(backBuffer, 0, sizeof(OverlayBackBufferBlk)); 351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 35265efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset overlay 353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 354d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (OVERLAY_INIT_BRIGHTNESS & 0xff); 355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY; 357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK; 358d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG = 0; 359d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 3); 360d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 27); 361d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN &= ~(0x7 << 24); 362d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN |= 0xff; 363d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 364d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper) 366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 367d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t khandle; 369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w, h; 370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride, uvStride; 371d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride_t stride; 372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int srcX, srcY, srcW, srcH; 373d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int tmp; 374d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 375d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DataBuffer *buf; 376d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ssize_t index; 377d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu TTMBufferMapper *mapper; 378d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 379d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 380d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1); 381d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid payload buffer"); 383d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 384d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 385d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 386d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init ttm buffer 387d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu khandle = payload->rotated_buffer_handle; 388d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu index = mTTMBuffers.indexOfKey(khandle); 389d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (index < 0) { 390d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("unmapped TTM buffer, will map it"); 391d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 392d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = payload->rotated_width; 393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = payload->rotated_height; 394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX = grallocMapper.getCrop().x; 395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY = grallocMapper.getCrop().y; 396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcW = grallocMapper.getCrop().w; 397d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcH = grallocMapper.getCrop().h; 398d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 399d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mTransform == PLANE_TRANSFORM_90 || mTransform == PLANE_TRANSFORM_270) { 400d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tmp = srcH; 401d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcH = srcW; 402d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcW = tmp; 403d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tmp = srcX; 405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX = srcY; 406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY = tmp; 407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // skip pading bytes in rotate buffer 410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(mTransform) { 411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_90: 412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX += ((srcW + 0xf) & ~0xf) - srcW; 413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_180: 415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX += ((srcW + 0xf) & ~0xf) - srcW; 416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY += ((srcH + 0xf) & ~0xf) - srcH; 417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_270: 419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY += ((srcH + 0xf) & ~0xf) - srcH; 420d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 421d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 422d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 423d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 424d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 425d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // calculate stride 426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (grallocMapper.getFormat()) { 427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YV12: 428d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: 42923921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx uint32_t yStride_align; 4304a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat()); 4314a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (yStride_align > 0) 43223921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 43323921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), yStride_align); 43423921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 43523921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx else 43623921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 43723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), 64); 43823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 439d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = align_to(yStride >> 1, 64); 440d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 441d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 442d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 443eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: 444eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu yStride = align_to(align_to(w, 32), 64); 445eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu uvStride = yStride; 446eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.yStride = yStride; 447eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.uvStride = uvStride; 448eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 449d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: 4503b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: 451d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 452d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = yStride; 453d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 454d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 455d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 456d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: 457d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: 458d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to((align_to(w, 32) << 1), 64); 459d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = 0; 460d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 461d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 462d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 463d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 464d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer buf(khandle); 466d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // update buffer 467eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setStride(stride); 468eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setWidth(w); 469eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setHeight(h); 470eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setCrop(srcX, srcY, srcW, srcH); 471eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setFormat(grallocMapper.getFormat()); 472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create buffer mapper 474eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool res = false; 475eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 476eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = new TTMBufferMapper(*mWsbm, buf); 477eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 478eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to allocate mapper"); 479eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 480eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 481eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // map ttm buffer 482eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ret = mapper->map(); 483eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!ret) { 484eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to map"); 485c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 48624d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ret = mapper->map(); 48724d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (!ret) { 48824d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ETRACE("failed to remap"); 48924d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu break; 49024d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 49124d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 49224d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu 49324d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (mTTMBuffers.size() >= OVERLAY_DATA_BUFFER_COUNT) { 494c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 495eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 496d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 497eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // add mapper 498eb726af21649d79ed720bdf329e0849270995c45Andy Qiu index = mTTMBuffers.add(khandle, mapper); 499eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (index < 0) { 500eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ETRACE("failed to add TTMMapper"); 501eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 502eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 503c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 504eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper refCount since it is added to mTTMBuffers 505eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 506eb726af21649d79ed720bdf329e0849270995c45Andy Qiu res = true; 507eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 508eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 509eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!res) { 510eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 511eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 512eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 513eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 514eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = NULL; 515eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 516eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 517d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 518d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 519d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("got mapper in saved ttm buffers"); 520d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index)); 521d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 522d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 523d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 524d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return mapper; 525d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 526d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 527d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper) 528d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 529d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) 530d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 531d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 532c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!mapper->decRef()) { 533c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 534c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->unmap(); 535c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 536c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // destroy this mapper 537c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li delete mapper; 538c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 539c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 540d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 541c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool OverlayPlaneBase::isActiveTTMBuffer(BufferMapper *mapper) 542c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 543c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 544c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *activeMapper = mActiveTTMBuffers.itemAt(i); 545c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!activeMapper) 546c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li continue; 547c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (activeMapper->getKey() == mapper->getKey()) 548c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return true; 549c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 550d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 551c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return false; 552c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 553c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 554c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::updateActiveTTMBuffers(BufferMapper *mapper) 555c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 556c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap the first entry (oldest buffer) 557c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() >= MIN_DATA_BUFFER_COUNT) { 558c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *oldest = mActiveTTMBuffers.itemAt(0); 559c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(oldest); 560c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.removeAt(0); 561c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 562c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 563c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // queue it to cached buffers 564c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!isActiveTTMBuffer(mapper)) { 565c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->incRef(); 566c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.push_back(mapper); 567c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 568c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 569c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 570c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::invalidateActiveTTMBuffers() 571c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 572c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper* mapper; 573c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 574c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 575c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 576c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 577c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper = mActiveTTMBuffers.itemAt(i); 578c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 579c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(mapper); 580c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 581c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 582c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // clear recorded data buffers 583c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.clear(); 584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 586c90f6a1247780413b7396e72d8b095227438f51eAndy Qiuvoid OverlayPlaneBase::invalidateTTMBuffers() 587c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu{ 588c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu BufferMapper* mapper; 589c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu for (size_t i = 0; i < mTTMBuffers.size(); i++) { 590c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mapper = mTTMBuffers.valueAt(i); 591c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu // putTTMMapper removes mapper from cache 592c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu putTTMMapper(mapper); 593c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu } 594c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mTTMBuffers.clear(); 595c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu} 596c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu 597d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper) 598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 600d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format; 601d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 602d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // only NV12_VED has rotated buffer 603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu format = mapper.getFormat(); 6043b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 6053b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) 606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check payload 610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("no payload found"); 612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 615d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->force_output_method == FORCE_OUTPUT_GPU) 616d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 617d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 618d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->client_transform != mTransform) { 61951e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang if (payload->surface_protected) { 62051e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->hwc_timestamp = systemTime(); 62151e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->layer_transform = mTransform; 62251e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang } 623d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("client is not ready"); 624d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 625d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 626d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 627d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 628d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 629d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 630d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h) 631d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 632d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 63330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu drmModeModeInfo modeInfo; 63430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!drm->getModeInfo(mDevice, modeInfo)) { 63530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu ETRACE("failed to get mode info"); 636d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 637d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 63830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu drmModeModeInfoPtr mode = &modeInfo; 639d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 640d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (x < 0) 641d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = 0; 642d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (y < 0) 643d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = 0; 644d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((x + w) > mode->hdisplay) 645d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mode->hdisplay - x; 646d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((y + h) > mode->vdisplay) 647d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mode->vdisplay - y; 648d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 649d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 650d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 651d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 652d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 653d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 654d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 660d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12); 662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w = mapper.getWidth(); 665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t h = mapper.getHeight(); 666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcX= mapper.getCrop().x; 667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcY= mapper.getCrop().y; 668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear original format setting 670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~(0xf << 10); 6713b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED; 672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Y/U/V plane must be 4k bytes aligned. 674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0Y = gttOffsetInBytes; 675927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu if (mIsProtectedBuffer) { 676927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // temporary workaround until vsync event logic is corrected. 677927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // it seems that overlay buffer update and renderring can be overlapped, 678927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // as such encryption bit may be cleared during HW rendering 679927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu backBuffer->OSTART_0Y |= 0x01; 680927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu } 681927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu 682d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0U = gttOffsetInBytes; 683d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0V = gttOffsetInBytes; 684d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 685d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1Y = backBuffer->OSTART_0Y; 686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1U = backBuffer->OSTART_0U; 687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1V = backBuffer->OSTART_0V; 688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(format) { 69065efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YV12: // YV12 691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = yStride * h; 693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2)); 694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 69665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * h; 699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2)); 700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 702eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 703eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0Y = 0; 704eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 705eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0V = 0; 706eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 707eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 70865efc253a628175c7afa95c431b746ea20052794Andy Qiu // NOTE: this is the decoded video format, align the height to 32B 70965efc253a628175c7afa95c431b746ea20052794Andy Qiu //as it's defined by video driver 71065efc253a628175c7afa95c431b746ea20052794Andy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // NV12 711d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 712d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 713d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 714d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 715d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 7163b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: //NV12_tiled 7173b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0Y = 0; 7183b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0U = yStride * align_to(h, 32); 7193b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0V = 0; 7203b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0U += yStride * align_to(h, 32); 7213b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0V += yStride * align_to(h, 32); 7223b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1U = backBuffer->OSTART_0U; 7233b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1V = backBuffer->OSTART_0V; 7243b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0Y = srcX + (srcY << 16); 7253b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1Y = backBuffer->OTILEOFF_0Y; 7263b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0U = srcX + ((srcY / 2) << 16); 7273b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1U = backBuffer->OTILEOFF_0U; 7283b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0V = backBuffer->OTILEOFF_0U; 7293b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1V = backBuffer->OTILEOFF_0U; 7303b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 7313b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED; 7323b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi break; 73365efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 734d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 735d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 736d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 737d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 738d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2; 739d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 74065efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 743d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY; 746d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y += srcY * yStride + srcX; 753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX; 754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX; 755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1Y = backBuffer->OBUF_0Y; 756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1U = backBuffer->OBUF_0U; 757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1V = backBuffer->OBUF_0V; 758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("done. offset (%d, %d, %d)", 760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y, 761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U, 762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V); 763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width) 767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ATRACE("offset = %d, width = %d", offset, width); 769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6); 771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth <<= 1; 773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth -= 1; 774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return swidth; 776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthy = 0; 789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthuv = 0; 790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t width = mapper.getCrop().w; 792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t height = mapper.getCrop().h; 793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsety = backBuffer->OBUF_0Y; 796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsetu = backBuffer->OBUF_0U; 797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (format) { 79965efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YV12: // YV12 80065efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 801eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 80265efc253a628175c7afa95c431b746ea20052794Andy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // NV12 8033b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: // NV12_tiled 804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 80565efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 80665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu width <<= 1; 808d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 809d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 811d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 812d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 813d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (width <= 0 || height <= 0) { 815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid src dim"); 816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (yStride <=0 && uvStride <= 0) { 820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid source stride"); 821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTH = width | ((width / 2) << 16); 825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthy = calculateSWidthSW(offsety, width); 826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthuv = calculateSWidthSW(offsetu, width / 2); 827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18); 828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SHEIGHT = height | ((height / 2) << 16); 829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16); 830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize, 837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffPtr pCoeff, int pos) 838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int maxVal, icoeff, res; 840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int sign; 841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double c; 842d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 843d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sign = 0; 844d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu maxVal = 1 << mantSize; 845d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu c = *coeff; 846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (c < 0.0) { 847d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sign = 1; 848d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu c = -c; 849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 850d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 851d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu res = 12 - mantSize; 852d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 853d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 3; 854d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 855d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(4 * maxVal); 856d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 857d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 2; 858d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 859d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(2 * maxVal); 860d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 861d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 1; 862d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 863d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(maxVal); 864d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 865d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 0; 866d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 867d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(maxVal / 2); 868d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 86965efc253a628175c7afa95c431b746ea20052794Andy Qiu // Coeff out of range 870d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 871d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 872d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 873d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].sign = sign; 874d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sign) 875d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = -(*coeff); 876d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 877d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 878d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff, 880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool isHoriz, bool isY, 881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffPtr pCoeff) 882d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 883d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, j1, num, pos, mantSize; 884d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double pi = 3.1415926535, val, sinc, window, sum; 885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 886d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double diff; 887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int tapAdjust[MAX_TAPS], tap2Fix; 888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool isVertAndUV; 889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 890d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (isHoriz) 891d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mantSize = 7; 892d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mantSize = 6; 894d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 895d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu isVertAndUV = !isHoriz && !isY; 896d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu num = taps * 16; 897d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < num * 2; i++) { 898d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 899d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (val == 0.0) 900d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sinc = 1.0; 901d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 902d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sinc = sin(val) / val; 903d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 90465efc253a628175c7afa95c431b746ea20052794Andy Qiu // Hamming window 905d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1))); 906d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu rawCoeff[i] = sinc * window; 907d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 908d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 909d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 91065efc253a628175c7afa95c431b746ea20052794Andy Qiu // Normalise the coefficients 911d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 912d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 913d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i + j * 32; 914d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += rawCoeff[pos]; 915d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 916d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 917d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i + j * 32; 918d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffs[i][j] = rawCoeff[pos] / sum; 919d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 920d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 92165efc253a628175c7afa95c431b746ea20052794Andy Qiu // Set the register values 922d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 923d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = j + i * taps; 924d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((j == (taps - 1) / 2) && !isVertAndUV) 925d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 926d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 927d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 928d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 929d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 930d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[0] = (taps - 1) / 2; 931d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 932d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[j1] = tapAdjust[0] - j; 933d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[++j1] = tapAdjust[0] + j; 934d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 935d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 93665efc253a628175c7afa95c431b746ea20052794Andy Qiu // Adjust the coefficients 937d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 938d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) 939d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += coeffs[i][j]; 940d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sum != 1.0) { 941d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j1 = 0; j1 < taps; j1++) { 942d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tap2Fix = tapAdjust[j1]; 943d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu diff = 1.0 - sum; 944d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffs[i][tap2Fix] += diff; 945d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = tap2Fix + i * taps; 946d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 947d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 948d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 949d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 950d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 951d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 952d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) 953d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += coeffs[i][j]; 954d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sum == 1.0) 955d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 956d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 957d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 958d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 959d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 960d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 961d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper) 962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleIntUV, xscaleFractUV; 965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int yscaleIntUV, yscaleFractUV; 966d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int deinterlace_factor = 1; 96765efc253a628175c7afa95c431b746ea20052794Andy Qiu // UV is half the size of Y -- YUV420 968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int uvratio = 2; 969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t newval; 970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, pos; 973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool scaleChanged = false; 974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int x, y, w, h; 975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = mPosition.x; 983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = mPosition.y; 984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mPosition.w; 985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mPosition.h; 986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check position 988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu checkPosition(x, y, w, h); 989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("final position (%d, %d, %d, %d)", x, y, w, h); 990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((w <= 0) || (h <= 0)) { 992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid dst width/height"); 993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // setup dst position 997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINPOS = (y << 16) | x; 998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINSZ = (h << 16) | w; 999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcWidth = mapper.getCrop().w; 1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcHeight = mapper.getCrop().h; 1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstWidth = w; 1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstHeight = h; 1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("src (%dx%d), dst (%dx%d)", 1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcWidth, srcHeight, 1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu dstWidth, dstHeight); 100865efc253a628175c7afa95c431b746ea20052794Andy Qiu 100965efc253a628175c7afa95c431b746ea20052794Andy Qiu // Y down-scale factor as a multiple of 4096 1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (srcWidth == dstWidth && srcHeight == dstHeight) { 1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = (1 << 12); 1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = (1 << 12)/deinterlace_factor; 1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = ((srcWidth - 1) << 12) / dstWidth; 1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor); 1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 101865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Calculate the UV scaling factor 1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFractUV = xscaleFract / uvratio; 1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFractUV = yscaleFract / uvratio; 1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 102265efc253a628175c7afa95c431b746ea20052794Andy Qiu 102365efc253a628175c7afa95c431b746ea20052794Andy Qiu // To keep the relative Y and UV ratios exact, round the Y scales 102465efc253a628175c7afa95c431b746ea20052794Andy Qiu // to a multiple of the Y/UV ratio. 1025d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = xscaleFractUV * uvratio; 1026d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = yscaleFractUV * uvratio; 1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 102865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Integer (un-multiplied) values 1029d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleInt = xscaleFract >> 12; 1030d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleInt = yscaleFract >> 12; 1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleIntUV = xscaleFractUV >> 12; 1033d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleIntUV = yscaleFractUV >> 12; 1034d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 103565efc253a628175c7afa95c431b746ea20052794Andy Qiu // Check scaling ratio 1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) { 1037d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1038d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 104165efc253a628175c7afa95c431b746ea20052794Andy Qiu // shouldn't get here 1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) { 1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1045d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleInt << 15) | 1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->YRGBSCALE) { 1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->YRGBSCALE = newval; 1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((yscaleFractUV & 0xFFF) << 20); 1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALE) { 1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALE = newval; 1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = yscaleInt << 16 | yscaleIntUV; 1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALEV) { 1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1064d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALEV = newval; 1065d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1066d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 106765efc253a628175c7afa95c431b746ea20052794Andy Qiu // Recalculate coefficients if the scaling changed 106865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Only Horizontal coefficients so far. 1069d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (scaleChanged) { 1070d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffY; 1071d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffUV; 1072d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1073d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = xscaleFract / 4096.0; 1074d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = xscaleFractUV / 4096.0; 1075d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 107665efc253a628175c7afa95c431b746ea20052794Andy Qiu // Limit to between 1.0 and 3.0 1077d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY < MIN_CUTOFF_FREQ) 1078d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MIN_CUTOFF_FREQ; 1079d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY > MAX_CUTOFF_FREQ) 1080d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MAX_CUTOFF_FREQ; 1081d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV < MIN_CUTOFF_FREQ) 1082d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MIN_CUTOFF_FREQ; 1083d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV > MAX_CUTOFF_FREQ) 1084d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MAX_CUTOFF_FREQ; 1085d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1086d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY); 1087d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV); 1088d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1089d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1090d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 1091d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_Y_TAPS + j; 1092d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->Y_HCOEFS[pos] = 1093d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffY[pos].sign << 15 | 1094d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].exponent << 12 | 1095d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].mantissa); 1096d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1097d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1098d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1099d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 1100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_UV_TAPS + j; 1101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UV_HCOEFS[pos] = 1102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffUV[pos].sign << 15 | 1103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].exponent << 12 | 1104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].mantissa); 1105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 1110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1111d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper) 1114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 1115d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper *mapper; 1116c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *rotatedMapper = 0; 1117d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 1118d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1119d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get gralloc mapper 1122d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = &grallocMapper; 112304d73e173c3d70cef309f8a9e3517ebd5dcf7b49Lin Xie if (mTransform) { 1124d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!rotatedBufferReady(grallocMapper)) { 1125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("rotated buffer is not ready"); 1126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1128d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1129d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get rotated data buffer mapper 1130d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = getTTMMapper(grallocMapper); 1131d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) { 1132d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get rotated buffer"); 1133d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1134d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1135c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1136c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li rotatedMapper = mapper; 1137d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1138d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1139d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 1140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 1141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 1142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = bufferOffsetSetup(*mapper); 1146d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up buffer offsets"); 1148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = coordinateSetup(*mapper); 1152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up overlay coordinates"); 1154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = scalingSetup(*mapper); 1158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up scaling parameters"); 1160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 11644a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 1165c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // add to active ttm buffers if it's a rotated buffer 1166c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (rotatedMapper) { 1167c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li updateActiveTTMBuffers(mapper); 1168c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1169c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1173d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel 1174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android 1175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1176