Merge "hwc: split display: Fix flip on which to do crop swap"
diff --git a/common.mk b/common.mk
index 3fb003b..74d6032 100644
--- a/common.mk
+++ b/common.mk
@@ -27,7 +27,7 @@
common_flags += -D__ARM_HAVE_NEON
endif
-ifeq ($(call is-board-platform-in-list, msm8974 msm8226 msm8610), true)
+ifeq ($(call is-board-platform-in-list, msm8974 msm8226 msm8610 apq8084), true)
common_flags += -DVENUS_COLOR_FORMAT
common_flags += -DMDSS_TARGET
endif
diff --git a/libcopybit/copybit_c2d.cpp b/libcopybit/copybit_c2d.cpp
index 193d067..385acb0 100644
--- a/libcopybit/copybit_c2d.cpp
+++ b/libcopybit/copybit_c2d.cpp
@@ -686,6 +686,9 @@
ctx->blit_yuv_2_plane_count = 0;
ctx->blit_yuv_3_plane_count = 0;
ctx->blit_count = 0;
+ ctx->dst_surface_mapped = false;
+ ctx->dst_surface_base = 0;
+
return status;
}
diff --git a/libexternal/external.cpp b/libexternal/external.cpp
index 6f5cc09..97f031d 100644
--- a/libexternal/external.cpp
+++ b/libexternal/external.cpp
@@ -670,26 +670,28 @@
bool ExternalDisplay::writeHPDOption(int userOption) const
{
bool ret = true;
- char sysFsHPDFilePath[MAX_SYSFS_FILE_PATH];
- snprintf(sysFsHPDFilePath ,sizeof(sysFsHPDFilePath),
- "/sys/devices/virtual/graphics/fb%d/hpd", mHdmiFbNum);
- int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0);
- if (hdmiHPDFile < 0) {
- ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__,
- sysFsHPDFilePath, hdmiHPDFile, strerror(errno));
- ret = false;
- } else {
- int err = -1;
- ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption);
- if(userOption)
- err = write(hdmiHPDFile, "1", 2);
- else
- err = write(hdmiHPDFile, "0" , 2);
- if (err <= 0) {
- ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath);
+ if(mHdmiFbNum != -1) {
+ char sysFsHPDFilePath[MAX_SYSFS_FILE_PATH];
+ snprintf(sysFsHPDFilePath ,sizeof(sysFsHPDFilePath),
+ "/sys/devices/virtual/graphics/fb%d/hpd", mHdmiFbNum);
+ int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0);
+ if (hdmiHPDFile < 0) {
+ ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__,
+ sysFsHPDFilePath, hdmiHPDFile, strerror(errno));
ret = false;
+ } else {
+ int err = -1;
+ ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption);
+ if(userOption)
+ err = write(hdmiHPDFile, "1", 2);
+ else
+ err = write(hdmiHPDFile, "0" , 2);
+ if (err <= 0) {
+ ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath);
+ ret = false;
+ }
+ close(hdmiHPDFile);
}
- close(hdmiHPDFile);
}
return ret;
}
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index d7375f8..244e0d6 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -122,7 +122,7 @@
memset(&commit_info, 0, sizeof(struct mdp_display_commit));
commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
- ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
+ ALOGE("%s: MSMFB_DISPLAY_COMMIT for dpy %d failed", __FUNCTION__,dpy);
return -errno;
}
return 0;
@@ -418,43 +418,45 @@
Locker::Autolock _l(ctx->mExtLock);
if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
- !ctx->dpyAttr[dpy].isPause &&
ctx->dpyAttr[dpy].connected) {
- uint32_t last = list->numHwLayers - 1;
- hwc_layer_1_t *fbLayer = &list->hwLayers[last];
- int fd = -1; //FenceFD from the Copybit(valid in async mode)
- bool copybitDone = false;
- if(ctx->mCopyBit[dpy])
- copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
- if(list->numHwLayers > 1)
- hwc_sync(ctx, list, dpy, fd);
+ if(!ctx->dpyAttr[dpy].isPause) {
+ uint32_t last = list->numHwLayers - 1;
+ hwc_layer_1_t *fbLayer = &list->hwLayers[last];
+ int fd = -1; //FenceFD from the Copybit(valid in async mode)
+ bool copybitDone = false;
+ if(ctx->mCopyBit[dpy])
+ copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
- // Dump the layers for external
- if(ctx->mHwcDebug[dpy])
- ctx->mHwcDebug[dpy]->dumpLayers(list);
+ if(list->numHwLayers > 1)
+ hwc_sync(ctx, list, dpy, fd);
- if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
- ALOGE("%s: MDPComp draw failed", __FUNCTION__);
- ret = -1;
- }
+ // Dump the layers for external
+ if(ctx->mHwcDebug[dpy])
+ ctx->mHwcDebug[dpy]->dumpLayers(list);
- int extOnlyLayerIndex =
- ctx->listStats[dpy].extOnlyLayerIndex;
-
- private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
- if(extOnlyLayerIndex!= -1) {
- hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
- hnd = (private_handle_t *)extLayer->handle;
- } else if(copybitDone) {
- hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
- }
-
- if(hnd && !isYuvBuffer(hnd)) {
- if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
- ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
+ if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
+ ALOGE("%s: MDPComp draw failed", __FUNCTION__);
ret = -1;
}
+
+ int extOnlyLayerIndex =
+ ctx->listStats[dpy].extOnlyLayerIndex;
+
+ private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
+ if(extOnlyLayerIndex!= -1) {
+ hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
+ hnd = (private_handle_t *)extLayer->handle;
+ } else if(copybitDone) {
+ hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
+ }
+
+ if(hnd && !isYuvBuffer(hnd)) {
+ if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
+ ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
+ ret = -1;
+ }
+ }
}
if (display_commit(ctx, dpy) < 0) {
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index 7ed0577..2ec6019 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -34,8 +34,9 @@
namespace ovutils = overlay::utils;
-IFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) {
- if(width > MAX_DISPLAY_DIM) {
+IFBUpdate* IFBUpdate::getObject(const int& width, const int& rightSplit,
+ const int& dpy) {
+ if(width > MAX_DISPLAY_DIM || rightSplit) {
return new FBUpdateHighRes(dpy);
}
return new FBUpdateLowRes(dpy);
@@ -223,7 +224,7 @@
// Configure
bool FBUpdateHighRes::configure(hwc_context_t *ctx,
- hwc_display_contents_1 *list, int fbZorder) {
+ hwc_display_contents_1 *list, int fbZorder) {
bool ret = false;
hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
if (LIKELY(ctx->mOverlay)) {
@@ -287,14 +288,33 @@
getNonWormholeRegion(list, sourceCrop);
displayFrame = sourceCrop;
}
- ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top,
- (sourceCrop.right - sourceCrop.left) / 2,
- sourceCrop.bottom - sourceCrop.top);
+
+ const float xres = ctx->dpyAttr[mDpy].xres;
+ //Default even split for all displays with high res
+ float lSplit = xres / 2;
+ if(mDpy == HWC_DISPLAY_PRIMARY &&
+ qdutils::MDPVersion::getInstance().getLeftSplit()) {
+ //Override if split published by driver for primary
+ lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
+ }
+
+ const float lSplitRatio = lSplit / xres;
+
+ const float lCropWidth =
+ (sourceCrop.right - sourceCrop.left) * lSplitRatio;
+
+ ovutils::Dim dcropL(
+ sourceCrop.left,
+ sourceCrop.top,
+ lCropWidth,
+ sourceCrop.bottom - sourceCrop.top);
+
ovutils::Dim dcropR(
- sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2,
- sourceCrop.top,
- (sourceCrop.right - sourceCrop.left) / 2,
- sourceCrop.bottom - sourceCrop.top);
+ sourceCrop.left + lCropWidth,
+ sourceCrop.top,
+ (sourceCrop.right - sourceCrop.left) - lCropWidth,
+ sourceCrop.bottom - sourceCrop.top);
+
ov.setCrop(dcropL, destL);
ov.setCrop(dcropR, destR);
@@ -304,19 +324,19 @@
ov.setTransform(orient, destL);
ov.setTransform(orient, destR);
- const int halfWidth = (displayFrame.right - displayFrame.left) / 2;
+ const int lWidth = (lSplit - displayFrame.left);
+ const int rWidth = (displayFrame.right - lSplit);
const int height = displayFrame.bottom - displayFrame.top;
- const int halfDpy = ctx->dpyAttr[mDpy].xres / 2;
- ovutils::Dim dposL(halfDpy - halfWidth,
+ ovutils::Dim dposL(displayFrame.left,
displayFrame.top,
- halfWidth,
+ lWidth,
height);
ov.setPosition(dposL, destL);
ovutils::Dim dposR(0,
displayFrame.top,
- halfWidth,
+ rWidth,
height);
ov.setPosition(dposR, destR);
diff --git a/libhwcomposer/hwc_fbupdate.h b/libhwcomposer/hwc_fbupdate.h
index 5cf75f7..55cd655 100644
--- a/libhwcomposer/hwc_fbupdate.h
+++ b/libhwcomposer/hwc_fbupdate.h
@@ -45,7 +45,8 @@
//Reset values
virtual void reset();
//Factory method that returns a low-res or high-res version
- static IFBUpdate *getObject(const int& width, const int& dpy);
+ static IFBUpdate *getObject(const int& width, const int& rightSplit,
+ const int& dpy);
protected:
const int mDpy; // display to update
@@ -59,12 +60,12 @@
explicit FBUpdateLowRes(const int& dpy);
virtual ~FBUpdateLowRes() {};
bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
- int fbZorder);
+ int fbZorder);
bool draw(hwc_context_t *ctx, private_handle_t *hnd);
void reset();
private:
bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
- int fbZorder);
+ int fbZorder);
ovutils::eDest mDest; //pipe to draw on
};
@@ -74,12 +75,12 @@
explicit FBUpdateHighRes(const int& dpy);
virtual ~FBUpdateHighRes() {};
bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
- int fbZorder);
+ int fbZorder);
bool draw(hwc_context_t *ctx, private_handle_t *hnd);
void reset();
private:
bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
- int fbZorder);
+ int fbZorder);
ovutils::eDest mDestLeft; //left pipe to draw on
ovutils::eDest mDestRight; //right pipe to draw on
};
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index ba6cae7..d4ce253 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -40,12 +40,12 @@
bool MDPComp::sEnableMixedMode = true;
int MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
-MDPComp* MDPComp::getObject(const int& width, int dpy) {
- if(width <= MAX_DISPLAY_DIM) {
- return new MDPCompLowRes(dpy);
- } else {
+MDPComp* MDPComp::getObject(const int& width, const int& rightSplit,
+ const int& dpy) {
+ if(width > MAX_DISPLAY_DIM || rightSplit) {
return new MDPCompHighRes(dpy);
}
+ return new MDPCompLowRes(dpy);
}
MDPComp::MDPComp(int dpy):mDpy(dpy){};
@@ -954,17 +954,24 @@
//=============MDPCompHighRes===================================================
int MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) {
+ hwc_display_contents_1_t* list) {
int pipesNeeded = 0;
- int hw_w = ctx->dpyAttr[mDpy].xres;
+ const int xres = ctx->dpyAttr[mDpy].xres;
+ //Default even split for all displays with high res
+ int lSplit = xres / 2;
+ if(mDpy == HWC_DISPLAY_PRIMARY &&
+ qdutils::MDPVersion::getInstance().getLeftSplit()) {
+ //Override if split published by driver for primary
+ lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
+ }
for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
if(!mCurrentFrame.isFBComposed[i]) {
hwc_layer_1_t* layer = &list->hwLayers[i];
hwc_rect_t dst = layer->displayFrame;
- if(dst.left > hw_w/2) {
+ if(dst.left > lSplit) {
pipesNeeded++;
- } else if(dst.right <= hw_w/2) {
+ } else if(dst.right <= lSplit) {
pipesNeeded++;
} else {
pipesNeeded += 2;
@@ -975,17 +982,24 @@
}
bool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
- MdpPipeInfoHighRes& pipe_info,
- ePipeType type) {
- int hw_w = ctx->dpyAttr[mDpy].xres;
+ MdpPipeInfoHighRes& pipe_info,
+ ePipeType type) {
+ const int xres = ctx->dpyAttr[mDpy].xres;
+ //Default even split for all displays with high res
+ int lSplit = xres / 2;
+ if(mDpy == HWC_DISPLAY_PRIMARY &&
+ qdutils::MDPVersion::getInstance().getLeftSplit()) {
+ //Override if split published by driver for primary
+ lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
+ }
hwc_rect_t dst = layer->displayFrame;
- if(dst.left > hw_w/2) {
+ if(dst.left > lSplit) {
pipe_info.lIndex = ovutils::OV_INVALID;
pipe_info.rIndex = getMdpPipe(ctx, type);
if(pipe_info.rIndex == ovutils::OV_INVALID)
return false;
- } else if (dst.right <= hw_w/2) {
+ } else if (dst.right <= lSplit) {
pipe_info.rIndex = ovutils::OV_INVALID;
pipe_info.lIndex = getMdpPipe(ctx, type);
if(pipe_info.lIndex == ovutils::OV_INVALID)
@@ -1035,7 +1049,7 @@
* Configures pipe(s) for MDP composition
*/
int MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
- PipeLayerPair& PipeLayerPair) {
+ PipeLayerPair& PipeLayerPair) {
MdpPipeInfoHighRes& mdp_info =
*(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 6e04918..908a658 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -46,7 +46,8 @@
/* dumpsys */
void dump(android::String8& buf);
- static MDPComp* getObject(const int& width, const int dpy);
+ static MDPComp* getObject(const int& width, const int& rightSplit,
+ const int& dpy);
/* Handler to invoke frame redraw on Idle Timer expiry */
static void timeout_handler(void *udata);
/* Initialize MDP comp*/
diff --git a/libhwcomposer/hwc_uevents.cpp b/libhwcomposer/hwc_uevents.cpp
index 1751cba..28b1849 100644
--- a/libhwcomposer/hwc_uevents.cpp
+++ b/libhwcomposer/hwc_uevents.cpp
@@ -31,6 +31,7 @@
#include "hwc_copybit.h"
#include "comptype.h"
#include "external.h"
+#include "mdp_version.h"
namespace qhwc {
#define HWC_UEVENT_SWITCH_STR "change@/devices/virtual/switch/"
@@ -53,8 +54,11 @@
static void setup(hwc_context_t* ctx, int dpy, bool usecopybit)
{
- ctx->mFBUpdate[dpy] = IFBUpdate::getObject(ctx->dpyAttr[dpy].xres, dpy);
- ctx->mMDPComp[dpy] = MDPComp::getObject(ctx->dpyAttr[dpy].xres, dpy);
+ const int rSplit = 0; //Even split for external if at all
+ ctx->mFBUpdate[dpy] = IFBUpdate::getObject(ctx->dpyAttr[dpy].xres,
+ rSplit, dpy);
+ ctx->mMDPComp[dpy] = MDPComp::getObject(ctx->dpyAttr[dpy].xres,
+ rSplit, dpy);
if(usecopybit)
ctx->mCopyBit[dpy] = new CopyBit();
}
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index dc8e90f..46e25dc 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -126,6 +126,7 @@
ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion();
ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay();
ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType();
+ const int rightSplit = qdutils::MDPVersion::getInstance().getRightSplit();
overlay::Overlay::initOverlay();
ctx->mOverlay = overlay::Overlay::getInstance();
ctx->mRotMgr = new RotMgr();
@@ -135,7 +136,7 @@
//on what external we connect to.
ctx->mFBUpdate[HWC_DISPLAY_PRIMARY] =
IFBUpdate::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres,
- HWC_DISPLAY_PRIMARY);
+ rightSplit, HWC_DISPLAY_PRIMARY);
// Check if the target supports copybit compostion (dyn/mdp/c2d) to
// decide if we need to open the copybit module.
@@ -152,7 +153,7 @@
ctx->mMDPComp[HWC_DISPLAY_PRIMARY] =
MDPComp::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres,
- HWC_DISPLAY_PRIMARY);
+ rightSplit, HWC_DISPLAY_PRIMARY);
for (uint32_t i = 0; i < MAX_DISPLAYS; i++) {
ctx->mHwcDebug[i] = new HwcDebug(i);
@@ -1035,16 +1036,17 @@
hwc_rect_t tmp_cropL, tmp_dstL;
hwc_rect_t tmp_cropR, tmp_dstR;
+ const int lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
if(lDest != OV_INVALID) {
tmp_cropL = crop;
tmp_dstL = dst;
- hwc_rect_t scissor = {0, 0, hw_w/2, hw_h };
+ hwc_rect_t scissor = {0, 0, lSplit, hw_h };
qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0);
}
if(rDest != OV_INVALID) {
tmp_cropR = crop;
tmp_dstR = dst;
- hwc_rect_t scissor = {hw_w/2, 0, hw_w, hw_h };
+ hwc_rect_t scissor = {lSplit, 0, hw_w, hw_h };
qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0);
}
@@ -1088,8 +1090,8 @@
if(rDest != OV_INVALID) {
PipeArgs pargR(mdpFlagsR, whf, z, isFg,
static_cast<eRotFlags>(rotFlags));
- tmp_dstR.right = tmp_dstR.right - hw_w/2;
- tmp_dstR.left = tmp_dstR.left - hw_w/2;
+ tmp_dstR.right = tmp_dstR.right - lSplit;
+ tmp_dstR.left = tmp_dstR.left - lSplit;
if(configMdp(ctx->mOverlay, pargR, orient,
tmp_cropR, tmp_dstR, metadata, rDest) < 0) {
ALOGE("%s: commit failed for right mixer config", __FUNCTION__);
diff --git a/libqdutils/mdp_version.cpp b/libqdutils/mdp_version.cpp
index cac6b1d..04dcf9f 100644
--- a/libqdutils/mdp_version.cpp
+++ b/libqdutils/mdp_version.cpp
@@ -101,8 +101,8 @@
ptype = fb_finfo.id;
}
panel_type = *ptype;
-
}
+ mPanelType = panel_type;
close(fb_fd);
mMDPVersion = mdp_version;
mHasOverlay = false;
@@ -113,9 +113,26 @@
if(mMDPVersion >= MDSS_V5) {
//TODO get this from driver
mMDPDownscale = 4;
- }
- mPanelType = panel_type;
+ char split[64];
+ FILE* fp = fopen("/sys/class/graphics/fb0/msm_fb_split", "r");
+ if(fp){
+ //Format "left right" space as delimiter
+ if(fread(split, sizeof(char), 64, fp)) {
+ mSplit.mLeft = atoi(split);
+ ALOGI_IF(mSplit.mLeft, "Left Split=%d", mSplit.mLeft);
+ char *rght = strpbrk(split, " ");
+ if(rght)
+ mSplit.mRight = atoi(rght + 1);
+ ALOGI_IF(rght, "Right Split=%d", mSplit.mRight);
+ }
+ } else {
+ ALOGE("Failed to open mdss_fb_split node");
+ }
+
+ if(fp)
+ fclose(fp);
+ }
}
bool MDPVersion::supportsDecimation() {
@@ -132,7 +149,17 @@
}
bool MDPVersion::is8x26() {
- return mMdpRev == MDSS_MDP_HW_REV_101;
+ // check for 8x26 variants
+ // chip variants have same major number and minor numbers usually vary
+ // for e.g., MDSS_MDP_HW_REV_101 is 0x10010000
+ // 1001 - major number
+ // 0000 - minor number
+ // 8x26 v1 minor number is 0000
+ // v2 minor number is 0001 etc..
+ if( mMdpRev >= MDSS_MDP_HW_REV_101 && mMdpRev < MDSS_MDP_HW_REV_102) {
+ return true;
+ }
+ return false;
}
}; //namespace qdutils
diff --git a/libqdutils/mdp_version.h b/libqdutils/mdp_version.h
index f7b16fa..e26f4d3 100644
--- a/libqdutils/mdp_version.h
+++ b/libqdutils/mdp_version.h
@@ -74,6 +74,16 @@
#define WRITEBACK_PANEL 'a'
#define LVDS_PANEL 'b'
+class MDPVersion;
+
+struct Split {
+ int mLeft;
+ int mRight;
+ Split() : mLeft(0), mRight(0){}
+ int left() { return mLeft; }
+ int right() { return mRight; }
+ friend class MDPVersion;
+};
class MDPVersion : public Singleton <MDPVersion>
{
@@ -91,6 +101,8 @@
uint32_t getMaxMDPDownscale();
bool supportsBWC();
bool is8x26();
+ int getLeftSplit() { return mSplit.left(); }
+ int getRightSplit() { return mSplit.right(); }
private:
int mMDPVersion;
char mPanelType;
@@ -101,6 +113,7 @@
uint8_t mDMAPipes;
uint32_t mFeatures;
uint32_t mMDPDownscale;
+ Split mSplit;
};
}; //namespace qdutils
#endif //INCLUDE_LIBQCOMUTILS_MDPVER