OverlayPlaneBase.cpp revision 927f4c04efeec7f2f63bbf10dd6552bc4b65317f
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> 33d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/OverlayPlaneBase.h> 34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/TTMBufferMapper.h> 35d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/GrallocSubBuffer.h> 36d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 37d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu// FIXME: remove it 38d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <OMX_IVCommon.h> 39d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android { 41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel { 42d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 43d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp) 44d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu : DisplayPlane(index, PLANE_OVERLAY, disp), 45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers(), 46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer(0), 47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm(0), 48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mPipeConfig(0) 49d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 52d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 53d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase() 54d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 55d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu deinitialize(); 57d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 58d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 59d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount) 60d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 61d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 63d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 64d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!drm) { 65d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get drm"); 66d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 67d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 68d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // NOTE: use overlay's data buffer count for a overlay plane 70d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers.setCapacity(overlayDataBufferCount); 71d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 72d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init wsbm 73d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm = new Wsbm(drm->getDrmFd()); 74d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mWsbm || !mWsbm->initialize()) { 75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create wsbm"); 76d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 77d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 78d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create overlay back buffer 79d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer = createBackBuffer(); 80d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer) { 81d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer"); 82d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 83d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // reset back buffer 85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu resetBackBuffer(); 86d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 87d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!DisplayPlane::initialize(overlayDataBufferCount)) { 88d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to initialize display plane"); 89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 92d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 93d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize() 94d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 95d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DisplayPlane::deinitialize(); 96d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 97d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // delete back buffer 98d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu deleteBackBuffer(); 99d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // delete wsbm 101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mWsbm) { 102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu delete mWsbm; 103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm = 0; 104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache() 108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper* mapper; 110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 111d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear plane buffer cache 112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DisplayPlane::invalidateBufferCache(); 113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear TTM buffer cache 115d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (size_t i = 0; i < mTTMBuffers.size(); i++) { 116d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = mTTMBuffers.valueAt(i); 117d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // put it 118d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mapper) 119d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu putTTMMapper(mapper); 120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 122d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 123d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp) 124d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t pipeConfig = 0; 126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 128d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ATRACE("disp = %d", disp); 129d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 130d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (disp) { 131d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_EXTERNAL: 132d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = (0x2 << 6); 133d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 134d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_PRIMARY: 135d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 136d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = 0; 137d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 138d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 139d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // if pipe switching happened, then disable overlay first 141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mPipeConfig != pipeConfig) 142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu disable(); 143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mPipeConfig = pipeConfig; 145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mDevice = disp; 146d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& config) 151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset() 156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // reset back buffer 160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu resetBackBuffer(); 161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu flush(FLUSH_NEEDED); 164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 167d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable() 168d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) 173d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (backBuffer->OCMD & 0x1) 176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 180d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 181d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu flush(FLUSH_NEEDED); 182d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 183d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 184d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 185d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable() 186d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 187d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 188d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 189d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 190d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) 191d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 192d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 193d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!(backBuffer->OCMD & 0x1)) 194d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 195d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 196d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~0x1; 197d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 198d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 199d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu flush(FLUSH_NEEDED | WAIT_VBLANK); 200d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 201d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 202d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 203d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 204d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::flush(uint32_t flags) 205d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 206d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 207d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 208d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ATRACE("flags = %#x", flags); 209d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 210d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!drm) { 211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get drm"); 212d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 214d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!flags && !(flags & FLUSH_NEEDED)) 216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 218d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct drm_psb_register_rw_arg arg; 219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 220d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay_write_mask = 1; 222d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay_read_mask = 0; 223d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay.b_wms = 0; 224d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay.b_wait_vblank = (flags & WAIT_VBLANK) ? 1 : 0; 225d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay.OVADD = (mBackBuffer->gttOffsetInPage << 12); 226d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 227d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // pipe select 228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay.OVADD |= mPipeConfig; 229d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (flags & UPDATE_COEF) 230d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu arg.overlay.OVADD |= 1; 231d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 232d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // issue ioctl 233d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 234d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 235d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("overlay update failed with error code %d", ret); 236d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 237d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 238d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 239d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 240d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 241d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 242d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer() 243d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int size; 245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int alignment; 246d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu void *wsbmBufferObject; 247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu void *virtAddr; 248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInPage; 249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t handle; 250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBuffer *backBuffer; 251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 253d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 254d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 255d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu size = sizeof(OverlayBackBufferBlk); 256d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu alignment = 64 * 1024; 257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu wsbmBufferObject = 0; 258d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject); 259d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to allocate buffer"); 261d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 262d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 263d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu virtAddr = mWsbm->getCPUAddress(wsbmBufferObject); 265d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject); 266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create back buffer 268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer)); 269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to allocate back buffer"); 271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu goto alloc_err; 272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 273d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 274d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->buf = (OverlayBackBufferBlk *)virtAddr; 275d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->gttOffsetInPage = gttOffsetInPage; 276d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->bufObject = (uint32_t)wsbmBufferObject; 277d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 278d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage); 279d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 280d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return backBuffer; 281d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiualloc_err: 282d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm->destroyTTMBuffer(wsbmBufferObject); 283d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 284d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 285d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 286d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer() 287d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 288d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu void *wsbmBufferObject; 289d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 290d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 291d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer) 292d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu wsbmBufferObject = (void *)mBackBuffer->bufObject; 295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = mWsbm->destroyTTMBuffer(wsbmBufferObject); 296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 297d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("failed to delete back buffer"); 298d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 299d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // free back buffer 300d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu free(mBackBuffer); 301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mBackBuffer = 0; 302d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 304d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::resetBackBuffer() 305d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 306d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer; 307d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 308d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 309d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 310d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer) 311d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 313d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mBackBuffer->buf) 314d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 315d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 316d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer = mBackBuffer->buf; 317d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu memset(backBuffer, 0, sizeof(OverlayBackBufferBlk)); 319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /*reset overlay*/ 321d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (OVERLAY_INIT_BRIGHTNESS & 0xff); 323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 324d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY; 325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK; 326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG = 0; 327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 3); 328d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 27); 329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN &= ~(0x7 << 24); 330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN |= 0xff; 331d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 332d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper) 334d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t khandle; 337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w, h; 338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride, uvStride; 339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride_t stride; 340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int srcX, srcY, srcW, srcH; 341d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int tmp; 342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DataBuffer *buf; 344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ssize_t index; 345d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu TTMBufferMapper *mapper; 346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 348d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1); 349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid payload buffer"); 351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 352d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 354d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init ttm buffer 355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu khandle = payload->rotated_buffer_handle; 356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu index = mTTMBuffers.indexOfKey(khandle); 357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (index < 0) { 358d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("unmapped TTM buffer, will map it"); 359d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf = new DataBuffer(khandle); 360d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!buf) { 361d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to create buffer"); 362d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 363d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 364d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = payload->rotated_width; 366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = payload->rotated_height; 367d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX = grallocMapper.getCrop().x; 368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY = grallocMapper.getCrop().y; 369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcW = grallocMapper.getCrop().w; 370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcH = grallocMapper.getCrop().h; 371d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mTransform == PLANE_TRANSFORM_90 || mTransform == PLANE_TRANSFORM_270) { 373d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tmp = srcH; 374d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcH = srcW; 375d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcW = tmp; 376d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 377d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tmp = srcX; 378d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX = srcY; 379d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY = tmp; 380d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 381d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // skip pading bytes in rotate buffer 383d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(mTransform) { 384d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_90: 385d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX += ((srcW + 0xf) & ~0xf) - srcW; 386d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 387d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_180: 388d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcX += ((srcW + 0xf) & ~0xf) - srcW; 389d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY += ((srcH + 0xf) & ~0xf) - srcH; 390d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 391d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case PLANE_TRANSFORM_270: 392d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcY += ((srcH + 0xf) & ~0xf) - srcH; 393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 397d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 398d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // calculate stride 399d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (grallocMapper.getFormat()) { 400d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YV12: 401d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: 402d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 403d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = align_to(yStride >> 1, 64); 404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: 408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = yStride; 410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: 414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: 415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to((align_to(w, 32) << 1), 64); 416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = 0; 417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 420d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 421d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 422d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // update buffer 423d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf->setStride(stride); 424d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf->setWidth(w); 425d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf->setHeight(h); 426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf->setCrop(srcX, srcY, srcW, srcH); 427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu buf->setFormat(grallocMapper.getFormat()); 428d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 429d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create buffer mapper 430d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = new TTMBufferMapper(*mWsbm, *buf); 431d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) { 432d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to allocate mapper"); 433d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu goto mapper_err; 434d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 435d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // map ttm buffer 436d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = mapper->map(); 437d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!ret) { 438d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to map"); 439d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu goto map_err; 440d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 441d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 442d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // add mapper 443d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu index = mTTMBuffers.add(khandle, mapper); 444d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (index < 0) { 445d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to add TTMMapper"); 446d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu goto add_err; 447d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 448d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 449d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("got mapper in saved ttm buffers"); 450d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index)); 451d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 452d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 453d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // sync rotated data buffer. 454d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Well, I have to, video driver DOESN'T support sync this buffer 455d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = mapper->waitIdle(); 456d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 457d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("failed to wait for idle"); 458d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 459d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 460d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 461d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 462d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return mapper; 463d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuadd_err: 464d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper->unmap(); 465d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiumap_err: 466d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu delete mapper; 467d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 468d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiumapper_err: 469d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu delete buf; 470d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 471d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper) 474d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 475d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) 476d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 477d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 478d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // unmap it 479d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper->unmap(); 480d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 481d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // remove it from recorded TTM buffers 482d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers.removeItem(mapper->getKey()); 483d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 484d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // destroy this mapper 485d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu delete mapper; 486d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 487d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 488d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper) 489d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 490d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 491d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format; 492d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 493d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // only NV12_VED has rotated buffer 494d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu format = mapper.getFormat(); 495d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar) 496d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 497d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 498d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 499d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check payload 500d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 501d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("no payload found"); 502d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 503d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 504d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 505d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->force_output_method == FORCE_OUTPUT_GPU) 506d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 507d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 508d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->client_transform != mTransform) { 509d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("client is not ready"); 510d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 511d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 512d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 513d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 514d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 515d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 516d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h) 517d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 518d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int outputIndex = -1; 519d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct Output *output; 520d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu drmModeModeInfoPtr mode; 521d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu drmModeCrtcPtr drmCrtc; 522d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 523d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 524d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (mDevice) { 525d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_PRIMARY: 526d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu outputIndex = Drm::OUTPUT_PRIMARY; 527d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 528d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_EXTERNAL: 529d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu outputIndex = Drm::OUTPUT_EXTERNAL; 530d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 531d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 532d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 533d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (outputIndex < 0) 534d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 535d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 536d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!drm) { 537d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get drm"); 538d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 539d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 540d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 541d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get output 542d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu output = drm->getOutput(outputIndex); 543d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!output) { 544d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get output"); 545d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 546d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 547d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 548d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu drmCrtc = output->crtc; 549d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!drmCrtc) 550d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 551d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 552d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mode = &drmCrtc->mode; 553d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!drmCrtc->mode_valid || !mode->hdisplay || !mode->vdisplay) 554d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 555d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 556d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (x < 0) 557d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = 0; 558d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (y < 0) 559d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = 0; 560d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((x + w) > mode->hdisplay) 561d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mode->hdisplay - x; 562d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((y + h) > mode->vdisplay) 563d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mode->vdisplay - y; 564d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 565d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 566d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 567d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 568d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 569d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 570d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 571d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 572d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 573d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 574d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 575d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 576d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 577d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12); 578d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 579d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 580d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w = mapper.getWidth(); 581d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t h = mapper.getHeight(); 582d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcX= mapper.getCrop().x; 583d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcY= mapper.getCrop().y; 584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear original format setting 586d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~(0xf << 10); 587d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 588d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Y/U/V plane must be 4k bytes aligned. 589d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0Y = gttOffsetInBytes; 590927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu if (mIsProtectedBuffer) { 591927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // temporary workaround until vsync event logic is corrected. 592927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // it seems that overlay buffer update and renderring can be overlapped, 593927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // as such encryption bit may be cleared during HW rendering 594927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu backBuffer->OSTART_0Y |= 0x01; 595927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu } 596927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu 597d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0U = gttOffsetInBytes; 598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0V = gttOffsetInBytes; 599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 600d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1Y = backBuffer->OSTART_0Y; 601d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1U = backBuffer->OSTART_0U; 602d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1V = backBuffer->OSTART_0V; 603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 604d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(format) { 605d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YV12: /*YV12*/ 606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = yStride * h; 608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2)); 609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: /*I420*/ 612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * h; 614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2)); 615d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 616d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 617d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /** 618d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * NOTE: this is the decoded video format, align the height to 32B 619d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * as it's defined by video driver 620d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */ 621d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: /*NV12*/ 622d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 623d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 624d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 625d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 626d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 627d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: /*YUY2*/ 628d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 629d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 630d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 631d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 632d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2; 633d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 634d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: /*UYVY*/ 635d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 636d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 637d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 638d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 639d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY; 640d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 641d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 642d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 643d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 644d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 645d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 646d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y += srcY * yStride + srcX; 647d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX; 648d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX; 649d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1Y = backBuffer->OBUF_0Y; 650d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1U = backBuffer->OBUF_0U; 651d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1V = backBuffer->OBUF_0V; 652d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 653d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("done. offset (%d, %d, %d)", 654d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y, 655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U, 656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V); 657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 660d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width) 661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ATRACE("offset = %d, width = %d", offset, width); 663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6); 665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth <<= 1; 667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth -= 1; 668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return swidth; 670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 671d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 675d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 676d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 677d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 678d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 679d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 680d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 681d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 682d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthy = 0; 683d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthuv = 0; 684d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 685d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t width = mapper.getCrop().w; 686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t height = mapper.getCrop().h; 687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsety = backBuffer->OBUF_0Y; 690d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsetu = backBuffer->OBUF_0U; 691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (format) { 693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YV12: /*YV12*/ 694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: /*I420*/ 695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: /*NV12*/ 696d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: /*YUY2*/ 698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: /*UYVY*/ 699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu width <<= 1; 700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 702d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("unsupported format %d", format); 703d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 704d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 705d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 706d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (width <= 0 || height <= 0) { 707d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid src dim"); 708d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 709d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 710d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 711d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (yStride <=0 && uvStride <= 0) { 712d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid source stride"); 713d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 714d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 715d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 716d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTH = width | ((width / 2) << 16); 717d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthy = calculateSWidthSW(offsety, width); 718d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthuv = calculateSWidthSW(offsetu, width / 2); 719d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18); 720d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SHEIGHT = height | ((height / 2) << 16); 721d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16); 722d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 723d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 724d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 725d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 726d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 727d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 728d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize, 729d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffPtr pCoeff, int pos) 730d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 731d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int maxVal, icoeff, res; 732d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int sign; 733d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double c; 734d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 735d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sign = 0; 736d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu maxVal = 1 << mantSize; 737d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu c = *coeff; 738d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (c < 0.0) { 739d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sign = 1; 740d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu c = -c; 741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 743d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu res = 12 - mantSize; 744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 3; 746d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(4 * maxVal); 748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 2; 750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(2 * maxVal); 752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 1; 754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(maxVal); 756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].exponent = 0; 758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].mantissa = icoeff << res; 759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = (double)icoeff / (double)(maxVal / 2); 760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Coeff out of range */ 762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pCoeff[pos].sign = sign; 766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sign) 767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *coeff = -(*coeff); 768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff, 772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool isHoriz, bool isY, 773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffPtr pCoeff) 774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, j1, num, pos, mantSize; 776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double pi = 3.1415926535, val, sinc, window, sum; 777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double diff; 779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int tapAdjust[MAX_TAPS], tap2Fix; 780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool isVertAndUV; 781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (isHoriz) 783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mantSize = 7; 784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mantSize = 6; 786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu isVertAndUV = !isHoriz && !isY; 788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu num = taps * 16; 789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < num * 2; i++) { 790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (val == 0.0) 792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sinc = 1.0; 793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sinc = sin(val) / val; 795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Hamming window */ 797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1))); 798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu rawCoeff[i] = sinc * window; 799d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 800d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 801d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 802d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Normalise the coefficients. */ 803d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 805d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i + j * 32; 806d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += rawCoeff[pos]; 807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 808d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 809d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i + j * 32; 810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffs[i][j] = rawCoeff[pos] / sum; 811d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 812d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 813d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Set the register values. */ 814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) { 815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = j + i * taps; 816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((j == (taps - 1) / 2) && !isVertAndUV) 817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[0] = (taps - 1) / 2; 823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[j1] = tapAdjust[0] - j; 825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tapAdjust[++j1] = tapAdjust[0] + j; 826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Adjust the coefficients. */ 829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) 831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += coeffs[i][j]; 832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sum != 1.0) { 833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j1 = 0; j1 < taps; j1++) { 834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu tap2Fix = tapAdjust[j1]; 835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu diff = 1.0 - sum; 836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffs[i][tap2Fix] += diff; 837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = tap2Fix + i * taps; 838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu else 841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 842d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 843d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum = 0.0; 844d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < taps; j++) 845d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu sum += coeffs[i][j]; 846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (sum == 1.0) 847d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 848d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 850d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 851d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 852d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 853d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper) 854d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 855d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 856d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleIntUV, xscaleFractUV; 857d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int yscaleIntUV, yscaleFractUV; 858d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int deinterlace_factor = 1; 859d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* UV is half the size of Y -- YUV420 */ 860d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int uvratio = 2; 861d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t newval; 862d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 863d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 864d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, pos; 865d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool scaleChanged = false; 866d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int x, y, w, h; 867d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 868d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 869d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 870d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 871d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 872d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 873d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 874d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = mPosition.x; 875d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = mPosition.y; 876d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mPosition.w; 877d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mPosition.h; 878d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check position 880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu checkPosition(x, y, w, h); 881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("final position (%d, %d, %d, %d)", x, y, w, h); 882d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 883d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((w <= 0) || (h <= 0)) { 884d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid dst width/height"); 885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 886d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // setup dst position 889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINPOS = (y << 16) | x; 890d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINSZ = (h << 16) | w; 891d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 892d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcWidth = mapper.getCrop().w; 893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcHeight = mapper.getCrop().h; 894d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstWidth = w; 895d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstHeight = h; 896d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 897d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu VTRACE("src (%dx%d), dst (%dx%d)", 898d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcWidth, srcHeight, 899d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu dstWidth, dstHeight); 900d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* 901d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Y down-scale factor as a multiple of 4096. 902d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */ 903d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (srcWidth == dstWidth && srcHeight == dstHeight) { 904d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = (1 << 12); 905d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = (1 << 12)/deinterlace_factor; 906d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 907d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = ((srcWidth - 1) << 12) / dstWidth; 908d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor); 909d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 910d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 911d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Calculate the UV scaling factor. */ 912d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFractUV = xscaleFract / uvratio; 913d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFractUV = yscaleFract / uvratio; 914d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 915d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* 916d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * To keep the relative Y and UV ratios exact, round the Y scales 917d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * to a multiple of the Y/UV ratio. 918d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */ 919d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = xscaleFractUV * uvratio; 920d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = yscaleFractUV * uvratio; 921d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 922d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Integer (un-multiplied) values. */ 923d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleInt = xscaleFract >> 12; 924d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleInt = yscaleFract >> 12; 925d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 926d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleIntUV = xscaleFractUV >> 12; 927d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleIntUV = yscaleFractUV >> 12; 928d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 929d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Check scaling ratio */ 930d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) { 931d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 932d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 933d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 934d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 935d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* shouldn't get here */ 936d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) { 937d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 938d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 939d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 940d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 941d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleInt << 15) | 942d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 943d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->YRGBSCALE) { 944d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 945d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->YRGBSCALE = newval; 946d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 947d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 948d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 949d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((yscaleFractUV & 0xFFF) << 20); 950d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALE) { 951d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 952d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALE = newval; 953d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 954d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 955d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = yscaleInt << 16 | yscaleIntUV; 956d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALEV) { 957d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 958d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALEV = newval; 959d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 960d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 961d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Recalculate coefficients if the scaling changed. */ 962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* 963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Only Horizontal coefficients so far. 964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */ 965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (scaleChanged) { 966d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffY; 967d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffUV; 968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = xscaleFract / 4096.0; 970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = xscaleFractUV / 4096.0; 971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu /* Limit to between 1.0 and 3.0. */ 973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY < MIN_CUTOFF_FREQ) 974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MIN_CUTOFF_FREQ; 975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY > MAX_CUTOFF_FREQ) 976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MAX_CUTOFF_FREQ; 977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV < MIN_CUTOFF_FREQ) 978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MIN_CUTOFF_FREQ; 979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV > MAX_CUTOFF_FREQ) 980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MAX_CUTOFF_FREQ; 981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY); 983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV); 984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_Y_TAPS + j; 988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->Y_HCOEFS[pos] = 989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffY[pos].sign << 15 | 990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].exponent << 12 | 991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].mantissa); 992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_UV_TAPS + j; 997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UV_HCOEFS[pos] = 998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffUV[pos].sign << 15 | 999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].exponent << 12 | 1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].mantissa); 1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu XTRACE(); 1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1008d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1009d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper) 1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper *mapper; 1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get gralloc mapper 1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = &grallocMapper; 1018d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check transform when overlay is attached to primary device 1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (mTransform && !mPipeConfig) { 1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!rotatedBufferReady(grallocMapper)) { 1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu WTRACE("rotated buffer is not ready"); 1022d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1023d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1024d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1025d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get rotated data buffer mapper 1026d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = getTTMMapper(grallocMapper); 1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) { 1028d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to get rotated buffer"); 1029d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1030d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1033d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer->buf; 1034d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 1035d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("invalid back buffer"); 1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1037d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1038d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = bufferOffsetSetup(*mapper); 1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1041d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up buffer offsets"); 1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1045d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = coordinateSetup(*mapper); 1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up overlay coordinates"); 1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = scalingSetup(*mapper); 1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ETRACE("failed to set up scaling parameters"); 1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel 1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android 1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1064