summaryrefslogtreecommitdiffstats
path: root/liboverlay/overlay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'liboverlay/overlay.cpp')
-rw-r--r--liboverlay/overlay.cpp294
1 files changed, 158 insertions, 136 deletions
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 170b8a940..7b7719c74 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
+* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -10,7 +10,7 @@
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
-* * Neither the name of Code Aurora Forum, Inc. nor the names of its
+* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
@@ -27,180 +27,202 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "overlayUtils.h"
-#include "overlayImpl.h"
#include "overlay.h"
+#include "pipes/overlayGenPipe.h"
+#include "mdp_version.h"
-#include "overlayMdp.h"
-#include "overlayCtrlData.h"
+#define PIPE_DEBUG 0
namespace overlay {
+using namespace utils;
-//Helper
-bool isStateValid(const utils::eOverlayState& st) {
- switch (st) {
- case utils::OV_CLOSED:
- ALOGE("Overlay %s failed, state is OV_CLOSED; set state first",
- __FUNCTION__);
- return false;
- break;
- case utils::OV_2D_VIDEO_ON_PANEL:
- case utils::OV_2D_VIDEO_ON_PANEL_TV:
- case utils::OV_2D_VIDEO_ON_TV:
- case utils::OV_3D_VIDEO_ON_2D_PANEL:
- case utils::OV_3D_VIDEO_ON_3D_PANEL:
- case utils::OV_3D_VIDEO_ON_3D_TV:
- case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV:
- case utils::OV_UI_MIRROR:
- case utils::OV_2D_TRUE_UI_MIRROR:
- case utils::OV_UI_VIDEO_TV:
- case utils::OV_BYPASS_1_LAYER:
- case utils::OV_BYPASS_2_LAYER:
- case utils::OV_BYPASS_3_LAYER:
- case utils::OV_DUAL_DISP:
- break;
- default:
- OVASSERT(false, "%s Unknown state %d", __FUNCTION__, st);
- return false;
+Overlay::Overlay() {
+ int numPipes = 0;
+ int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion();
+ if (mdpVersion > qdutils::MDP_V3_1) numPipes = 4;
+ if (mdpVersion >= qdutils::MDSS_V5) numPipes = 6;
+
+ PipeBook::NUM_PIPES = numPipes;
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ mPipeBook[i].init();
}
- return true;
-}
-Overlay::Overlay(): mOv(0) {
+ mDumpStr[0] = '\0';
}
Overlay::~Overlay() {
- mOv = mState.handleEvent(utils::OV_CLOSED, mOv);
- delete mOv;
- mOv = 0;
-}
-
-bool Overlay::commit(utils::eDest dest)
-{
- OVASSERT(mOv,
- "%s Overlay and Rotator should be init at this point",
- __FUNCTION__);
- utils::eOverlayState st = mState.state();
- if(isStateValid(st)) {
- if(!mOv->commit(dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
- }
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ mPipeBook[i].destroy();
}
- return true;
}
-bool Overlay::queueBuffer(int fd, uint32_t offset,
- utils::eDest dest)
-{
- OVASSERT(mOv,
- "%s Overlay and Rotator should be init at this point",
- __FUNCTION__);
- utils::eOverlayState st = mState.state();
- if(isStateValid(st)) {
- if(!mOv->queueBuffer(fd, offset, dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
+void Overlay::configBegin() {
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ //Mark as available for this round.
+ PipeBook::resetUse(i);
+ PipeBook::resetAllocation(i);
+ }
+ mDumpStr[0] = '\0';
+}
+
+void Overlay::configDone() {
+ if(PipeBook::pipeUsageUnchanged()) return;
+
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ if(PipeBook::isNotUsed(i)) {
+ //Forces UNSET on pipes, flushes rotator memory and session, closes
+ //fds
+ if(mPipeBook[i].valid()) {
+ char str[32];
+ sprintf(str, "Unset pipe=%s dpy=%d; ", getDestStr((eDest)i),
+ mPipeBook[i].mDisplay);
+ strncat(mDumpStr, str, strlen(str));
+ }
+ mPipeBook[i].destroy();
}
}
- return true;
-}
-
-bool Overlay::setCrop(const utils::Dim& d,
- utils::eDest dest)
-{
- OVASSERT(mOv,
- "%s Overlay and Rotator should be init at this point",
- __FUNCTION__);
- utils::eOverlayState st = mState.state();
- if(isStateValid(st)) {
- if(!mOv->setCrop(d, dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
+ dump();
+ PipeBook::save();
+}
+
+eDest Overlay::nextPipe(eMdpPipeType type, int dpy) {
+ eDest dest = OV_INVALID;
+
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ //Match requested pipe type
+ if(type == OV_MDP_PIPE_ANY || type == getPipeType((eDest)i)) {
+ //If the pipe is not allocated to any display or used by the
+ //requesting display already in previous round.
+ if((mPipeBook[i].mDisplay == PipeBook::DPY_UNUSED ||
+ mPipeBook[i].mDisplay == dpy) &&
+ PipeBook::isNotAllocated(i)) {
+ dest = (eDest)i;
+ PipeBook::setAllocation(i);
+ break;
+ }
}
}
- return true;
-}
-bool Overlay::setPosition(const utils::Dim& d,
- utils::eDest dest)
-{
- OVASSERT(mOv,
- "%s Overlay and Rotator should be init at this point",
- __FUNCTION__);
- utils::eOverlayState st = mState.state();
- if(isStateValid(st)) {
- if(!mOv->setPosition(d, dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
+
+ if(dest != OV_INVALID) {
+ int index = (int)dest;
+ //If the pipe is not registered with any display OR if the pipe is
+ //requested again by the same display using it, then go ahead.
+ mPipeBook[index].mDisplay = dpy;
+ if(not mPipeBook[index].valid()) {
+ mPipeBook[index].mPipe = new GenericPipe(dpy);
+ char str[32];
+ snprintf(str, 32, "Set pipe=%s dpy=%d; ", getDestStr(dest), dpy);
+ strncat(mDumpStr, str, strlen(str));
}
+ } else {
+ ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d",
+ (int)type, dpy);
}
- return true;
+
+ return dest;
}
-bool Overlay::setTransform(const int orient,
- utils::eDest dest)
-{
- utils::eTransform transform =
- static_cast<utils::eTransform>(orient);
+bool Overlay::commit(utils::eDest dest) {
+ bool ret = false;
+ int index = (int)dest;
+ validate(index);
- utils::eOverlayState st = mState.state();
- if(isStateValid(st)) {
- if(!mOv->setTransform(transform, dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
- }
+ if(mPipeBook[index].mPipe->commit()) {
+ ret = true;
+ PipeBook::setUse((int)dest);
+ } else {
+ PipeBook::resetUse((int)dest);
}
- return true;
+ return ret;
}
-bool Overlay::setSource(const utils::PipeArgs args[utils::MAX_PIPES],
- utils::eDest dest)
-{
- utils::PipeArgs margs[utils::MAX_PIPES] = {
- args[0], args[1], args[2] };
- utils::eOverlayState st = mState.state();
-
- if(isStateValid(st)) {
- if (!mOv->setSource(margs, dest)) {
- ALOGE("Overlay %s failed", __FUNCTION__);
- return false;
- }
+bool Overlay::queueBuffer(int fd, uint32_t offset,
+ utils::eDest dest) {
+ int index = (int)dest;
+ bool ret = false;
+ validate(index);
+ //Queue only if commit() has succeeded (and the bit set)
+ if(PipeBook::isUsed((int)dest)) {
+ ret = mPipeBook[index].mPipe->queueBuffer(fd, offset);
}
- return true;
+ return ret;
}
-void Overlay::dump() const
-{
- OVASSERT(mOv,
- "%s Overlay and Rotator should be init at this point",
- __FUNCTION__);
- ALOGE("== Dump Overlay start ==");
- mState.dump();
- mOv->dump();
- ALOGE("== Dump Overlay end ==");
+void Overlay::setCrop(const utils::Dim& d,
+ utils::eDest dest) {
+ int index = (int)dest;
+ validate(index);
+ mPipeBook[index].mPipe->setCrop(d);
}
-void Overlay::setState(utils::eOverlayState s) {
- mOv = mState.handleEvent(s, mOv);
+void Overlay::setPosition(const utils::Dim& d,
+ utils::eDest dest) {
+ int index = (int)dest;
+ validate(index);
+ mPipeBook[index].mPipe->setPosition(d);
}
-utils::eOverlayState Overlay::getState() const {
- return mState.state();
+void Overlay::setTransform(const int orient,
+ utils::eDest dest) {
+ int index = (int)dest;
+ validate(index);
+
+ utils::eTransform transform =
+ static_cast<utils::eTransform>(orient);
+ mPipeBook[index].mPipe->setTransform(transform);
+
}
-Overlay *Overlay::sInstance[] = {0};
+void Overlay::setSource(const utils::PipeArgs args,
+ utils::eDest dest) {
+ int index = (int)dest;
+ validate(index);
-Overlay* Overlay::getInstance(int disp) {
- if(sInstance[disp] == NULL) {
- sInstance[disp] = new Overlay();
+ PipeArgs newArgs(args);
+ if(dest == OV_VG0 || dest == OV_VG1) {
+ setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE);
+ } else {
+ clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE);
}
- return sInstance[disp];
+ mPipeBook[index].mPipe->setSource(newArgs);
+}
+
+Overlay* Overlay::getInstance() {
+ if(sInstance == NULL) {
+ sInstance = new Overlay();
+ }
+ return sInstance;
}
void Overlay::initOverlay() {
if(utils::initOverlay() == -1) {
- ALOGE("utils::initOverlay() ERROR!!");
+ ALOGE("%s failed", __FUNCTION__);
+ }
+}
+
+void Overlay::dump() const {
+ if(strlen(mDumpStr)) { //dump only on state change
+ ALOGD("%s\n", mDumpStr);
+ }
+}
+
+void Overlay::PipeBook::init() {
+ mPipe = NULL;
+ mDisplay = DPY_UNUSED;
+}
+
+void Overlay::PipeBook::destroy() {
+ if(mPipe) {
+ delete mPipe;
+ mPipe = NULL;
}
+ mDisplay = DPY_UNUSED;
}
-} // overlay
+Overlay* Overlay::sInstance = 0;
+int Overlay::PipeBook::NUM_PIPES = 0;
+int Overlay::PipeBook::sPipeUsageBitmap = 0;
+int Overlay::PipeBook::sLastUsageBitmap = 0;
+int Overlay::PipeBook::sAllocatedBitmap = 0;
+
+}; // namespace overlay