1/* 2* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 3* 4* Redistribution and use in source and binary forms, with or without 5* modification, are permitted provided that the following conditions are 6* met: 7* * Redistributions of source code must retain the above copyright 8* notice, this list of conditions and the following disclaimer. 9* * Redistributions in binary form must reproduce the above 10* copyright notice, this list of conditions and the following 11* disclaimer in the documentation and/or other materials provided 12* with the distribution. 13* * Neither the name of The Linux Foundation nor the names of its 14* contributors may be used to endorse or promote products derived 15* from this software without specific prior written permission. 16* 17* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*/ 29 30#include "overlayGenPipe.h" 31#include "mdp_version.h" 32 33namespace overlay { 34 35GenericPipe::GenericPipe(const int& dpy) : mDpy(dpy), mRotDownscaleOpt(false), 36 pipeState(CLOSED), mCtrl(new Ctrl(dpy)), mData(new Data(dpy)) { 37} 38 39GenericPipe::~GenericPipe() { 40 delete mCtrl; 41 delete mData; 42 setClosed(); 43} 44 45void GenericPipe::setSource(const utils::PipeArgs& args) { 46 mRotDownscaleOpt = args.rotFlags & utils::ROT_DOWNSCALE_ENABLED; 47 mCtrl->setSource(args); 48} 49 50void GenericPipe::setCrop(const overlay::utils::Dim& d) { 51 mCtrl->setCrop(d); 52} 53 54void GenericPipe::setColor(const uint32_t color) { 55 mCtrl->setColor(color); 56} 57 58void GenericPipe::setTransform(const utils::eTransform& orient) { 59 mCtrl->setTransform(orient); 60} 61 62void GenericPipe::setPosition(const utils::Dim& d) { 63 mCtrl->setPosition(d); 64} 65 66bool GenericPipe::setVisualParams(const MetaData_t &metadata) 67{ 68 return mCtrl->setVisualParams(metadata); 69} 70 71bool GenericPipe::commit() { 72 bool ret = false; 73 int downscale_factor = utils::ROT_DS_NONE; 74 75 if(mRotDownscaleOpt) { 76 ovutils::Dim src(mCtrl->getCrop()); 77 ovutils::Dim dst(mCtrl->getPosition()); 78 downscale_factor = ovutils::getDownscaleFactor( 79 src.w, src.h, dst.w, dst.h); 80 } 81 82 mCtrl->setDownscale(downscale_factor); 83 ret = mCtrl->commit(); 84 85 pipeState = ret ? OPEN : CLOSED; 86 return ret; 87} 88 89bool GenericPipe::queueBuffer(int fd, uint32_t offset) { 90 //TODO Move pipe-id transfer to CtrlData class. Make ctrl and data private. 91 OVASSERT(isOpen(), "State is closed, cannot queueBuffer"); 92 int pipeId = mCtrl->getPipeId(); 93 OVASSERT(-1 != pipeId, "Ctrl ID should not be -1"); 94 // set pipe id from ctrl to data 95 mData->setPipeId(pipeId); 96 97 return mData->queueBuffer(fd, offset); 98} 99 100int GenericPipe::getCtrlFd() const { 101 return mCtrl->getFd(); 102} 103 104utils::Dim GenericPipe::getCrop() const 105{ 106 return mCtrl->getCrop(); 107} 108 109uint8_t GenericPipe::getPriority() const { 110 return mCtrl->getPriority(); 111} 112 113void GenericPipe::dump() const 114{ 115 ALOGE("== Dump Generic pipe start =="); 116 ALOGE("pipe state = %d", (int)pipeState); 117 mCtrl->dump(); 118 mData->dump(); 119 ALOGE("== Dump Generic pipe end =="); 120} 121 122void GenericPipe::getDump(char *buf, size_t len) { 123 mCtrl->getDump(buf, len); 124 mData->getDump(buf, len); 125} 126 127bool GenericPipe::isClosed() const { 128 return (pipeState == CLOSED); 129} 130 131bool GenericPipe::isOpen() const { 132 return (pipeState == OPEN); 133} 134 135bool GenericPipe::setClosed() { 136 pipeState = CLOSED; 137 return true; 138} 139 140int GenericPipe::getPipeId() { 141 return mCtrl->getPipeId(); 142} 143 144bool GenericPipe::validateAndSet(GenericPipe* pipeArray[], const int& count, 145 const int& fbFd) { 146 Ctrl* ctrlArray[count]; 147 memset(&ctrlArray, 0, sizeof(ctrlArray)); 148 149 for(int i = 0; i < count; i++) { 150 ctrlArray[i] = pipeArray[i]->mCtrl; 151 } 152 153 return Ctrl::validateAndSet(ctrlArray, count, fbFd); 154} 155 156} //namespace overlay 157