From 050ef1b611df11850cef9ba33ef28a61fa66f0df Mon Sep 17 00:00:00 2001 From: Saurabh Shah Date: Fri, 24 Feb 2012 15:10:54 -0800 Subject: [PATCH] liboverlay: Call overlay set ioctl, only if input params change. Change-Id: I753c30be4062be10655d7072c795052ef65f87ae Conflicts: liboverlay/overlayLibUI.cpp --- liboverlay/overlayLib.cpp | 6 ++--- liboverlay/overlayLibUI.cpp | 54 ++++++++++++++++++++++++++++--------- liboverlay/overlayLibUI.h | 2 ++ 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/liboverlay/overlayLib.cpp b/liboverlay/overlayLib.cpp index 20c5bd6..f953d1c 100755 --- a/liboverlay/overlayLib.cpp +++ b/liboverlay/overlayLib.cpp @@ -2103,15 +2103,15 @@ bool OverlayDataChannel::setCrop(uint32_t x, uint32_t y, uint32_t w, uint32_t h) } + normalize_crop(x, w); + normalize_crop(y, h); + if ((ov.src_rect.x == x) && (ov.src_rect.y == y) && (ov.src_rect.w == w) && (ov.src_rect.h == h)) return true; - normalize_crop(x, w); - normalize_crop(y, h); - ov.src_rect.x = x; ov.src_rect.y = y; ov.src_rect.w = w; diff --git a/liboverlay/overlayLibUI.cpp b/liboverlay/overlayLibUI.cpp index 574240f..54f7fcb 100755 --- a/liboverlay/overlayLibUI.cpp +++ b/liboverlay/overlayLibUI.cpp @@ -216,7 +216,7 @@ status_t Rotator::rotateBuffer(msm_rotator_data_info& rotData) { OverlayUI::OverlayUI() : mChannelState(CLOSED), mOrientation(NO_INIT), mFBNum(NO_INIT), mZorder(NO_INIT), mWaitForVsync(false), mIsFg(false), - mSessionID(NO_INIT) { + mSessionID(NO_INIT), mParamsChanged(false) { memset(&mOvInfo, 0, sizeof(mOvInfo)); memset(&mRotInfo, 0, sizeof(mRotInfo)); } @@ -235,6 +235,13 @@ void OverlayUI::setSource(const overlay_buffer_info& info, int orientation) { LOGE("%s: Unsupported format", __func__); return; } + + mParamsChanged |= (mSource.width ^ info.width) || + (mSource.height ^ info.height) || + (mSource.format ^ format) || + (mSource.size ^ info.size) || + (mOrientation ^ orientation); + mSource.width = info.width; mSource.height = info.height; mSource.format = format; @@ -246,8 +253,6 @@ void OverlayUI::setSource(const overlay_buffer_info& info, int orientation) { void OverlayUI::setDisplayParams(int fbNum, bool waitForVsync, bool isFg, int zorder, bool isVGPipe) { int flags = 0; - mFBNum = fbNum; - mOvInfo.is_fg = isFg; if(false == waitForVsync) flags |= MDP_OV_PLAY_NOWAIT; @@ -259,6 +264,13 @@ void OverlayUI::setDisplayParams(int fbNum, bool waitForVsync, bool isFg, int else flags &= ~MDP_OV_PIPE_SHARE; + mParamsChanged |= (mFBNum ^ fbNum) || + (mOvInfo.is_fg ^ isFg) || + (mOvInfo.flags ^ flags) || + (mOvInfo.z_order ^ zorder); + + mFBNum = fbNum; + mOvInfo.is_fg = isFg; mOvInfo.flags = flags; mOvInfo.z_order = zorder; @@ -266,6 +278,11 @@ void OverlayUI::setDisplayParams(int fbNum, bool waitForVsync, bool isFg, int } void OverlayUI::setPosition(int x, int y, int w, int h) { + mParamsChanged |= (mOvInfo.dst_rect.x ^ x) || + (mOvInfo.dst_rect.y ^ y) || + (mOvInfo.dst_rect.w ^ w) || + (mOvInfo.dst_rect.h ^ h); + mOvInfo.dst_rect.x = x; mOvInfo.dst_rect.y = y; mOvInfo.dst_rect.w = w; @@ -273,6 +290,11 @@ void OverlayUI::setPosition(int x, int y, int w, int h) { } void OverlayUI::setCrop(int x, int y, int w, int h) { + mParamsChanged |= (mOvInfo.src_rect.x ^ x) || + (mOvInfo.src_rect.y ^ y) || + (mOvInfo.src_rect.w ^ w) || + (mOvInfo.src_rect.h ^ h); + mOvInfo.src_rect.x = x; mOvInfo.src_rect.y = y; mOvInfo.src_rect.w = w; @@ -339,8 +361,6 @@ void OverlayUI::setupOvRotInfo() { mRotInfo.rotations = mOvInfo.user_data[0]; if (mdp_rotation) mRotInfo.enable = 1; - mOvInfo.dst_rect.w = mOvInfo.src_rect.w; - mOvInfo.dst_rect.h = mOvInfo.src_rect.h; } status_t OverlayUI::commit() { @@ -372,6 +392,7 @@ status_t OverlayUI::closeChannel() { return BAD_VALUE; } mChannelState = CLOSED; + mParamsChanged = false; memset(&mOvInfo, 0, sizeof(mOvInfo)); memset(&mRotInfo, 0, sizeof(mRotInfo)); return NO_ERROR; @@ -379,15 +400,22 @@ status_t OverlayUI::closeChannel() { status_t OverlayUI::startOVSession() { status_t ret = NO_INIT; - mdp_overlay ovInfo = mOvInfo; + ret = mobjDisplay.openDisplay(mFBNum); - if (ioctl(mobjDisplay.getFD(), MSMFB_OVERLAY_SET, &ovInfo)) { - LOGE("%s: Overlay set failed", __FUNCTION__); - ret = BAD_VALUE; - } else { - mSessionID = ovInfo.id; - mOvInfo = ovInfo; - ret = NO_ERROR; + if (ret != NO_ERROR) + return ret; + + if(mParamsChanged) { + mParamsChanged = false; + mdp_overlay ovInfo = mOvInfo; + if (ioctl(mobjDisplay.getFD(), MSMFB_OVERLAY_SET, &ovInfo)) { + LOGE("Overlay set failed.."); + ret = BAD_VALUE; + } else { + mSessionID = ovInfo.id; + mOvInfo = ovInfo; + ret = NO_ERROR; + } } return ret; } diff --git a/liboverlay/overlayLibUI.h b/liboverlay/overlayLibUI.h index ed55477..d16a968 100644 --- a/liboverlay/overlayLibUI.h +++ b/liboverlay/overlayLibUI.h @@ -108,6 +108,8 @@ class OverlayUI { mdp_overlay mOvInfo; msm_rotator_img_info mRotInfo; + bool mParamsChanged; + OverlayUI(const OverlayUI& objOverlay); OverlayUI& operator=(const OverlayUI& objOverlay);