Merge "copybit: Initialize release & acquire fence fds of Copybit context."
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 7d4fa3e..62cb122 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -43,7 +43,7 @@
bool MDPComp::sEnableMixedMode = true;
bool MDPComp::sEnablePartialFrameUpdate = false;
int MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
-float MDPComp::sMaxBw = 2.3f;
+double MDPComp::sMaxBw = 0.0;
double MDPComp::sBwClaimed = 0.0;
MDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) {
@@ -128,13 +128,6 @@
sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
}
- if(property_get("debug.mdpcomp.bw", property, "0") > 0) {
- float val = atof(property);
- if(val > 0.0f) {
- sMaxBw = val;
- }
- }
-
if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
// Idle invalidation is not necessary on command mode panels
long idle_timeout = DEFAULT_IDLE_TIME;
@@ -1148,7 +1141,7 @@
return false;
}
- uint32_t size = calcMDPBytesRead(ctx, list);
+ double size = calcMDPBytesRead(ctx, list);
if(!bandwidthCheck(ctx, size)) {
ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
return false;
@@ -1157,12 +1150,15 @@
return true;
}
-uint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
+double MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
hwc_display_contents_1_t* list) {
- uint32_t size = 0;
+ double size = 0;
+ const double GIG = 1000000000.0;
- if(!qdutils::MDPVersion::getInstance().is8x74v2())
- return 0;
+ //Skip for targets where no device tree value for bw is supplied
+ if(sMaxBw <= 0.0) {
+ return 0.0;
+ }
for (uint32_t i = 0; i < list->numHwLayers - 1; i++) {
if(!mCurrentFrame.isFBComposed[i]) {
@@ -1172,33 +1168,37 @@
hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
hwc_rect_t dst = layer->displayFrame;
float bpp = ((float)hnd->size) / (hnd->width * hnd->height);
- size += bpp * (crop.right - crop.left) *
- (crop.bottom - crop.top) *
- ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top);
+ size += (bpp * (crop.right - crop.left) *
+ (crop.bottom - crop.top) *
+ ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top)) /
+ GIG;
}
}
}
if(mCurrentFrame.fbCount) {
hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1];
- private_handle_t *hnd = (private_handle_t *)layer->handle;
- if (hnd)
- size += hnd->size;
+ int tempw, temph;
+ size += (getBufferSizeAndDimensions(
+ layer->displayFrame.right - layer->displayFrame.left,
+ layer->displayFrame.bottom - layer->displayFrame.top,
+ HAL_PIXEL_FORMAT_RGBA_8888,
+ tempw, temph)) / GIG;
}
return size;
}
-bool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) {
- //Will be added for other targets if we run into bandwidth issues and when
- //we have profiling data to set an upper limit.
- if(qdutils::MDPVersion::getInstance().is8x74v2()) {
- const uint32_t ONE_GIG = 1000 * 1000 * 1000;
- double panelRefRate =
- 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
- if((size * panelRefRate) > ((sMaxBw - sBwClaimed) * ONE_GIG)) {
- return false;
- }
+bool MDPComp::bandwidthCheck(hwc_context_t *ctx, const double& size) {
+ //Skip for targets where no device tree value for bw is supplied
+ if(sMaxBw <= 0.0) {
+ return true;
+ }
+
+ double panelRefRate =
+ 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
+ if((size * panelRefRate) > (sMaxBw - sBwClaimed)) {
+ return false;
}
return true;
}
@@ -1206,6 +1206,7 @@
int MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
int ret = 0;
const int numLayers = ctx->listStats[mDpy].numAppLayers;
+ MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance();
//reset old data
mCurrentFrame.reset(numLayers);
@@ -1233,6 +1234,12 @@
generateROI(ctx, list);
+ //Convert from kbps to gbps
+ sMaxBw = mdpVersion.getHighBw() / 1000000.0;
+ if (ctx->mExtDisplay->isConnected() || ctx->mMDP.panel != MIPI_CMD_PANEL) {
+ sMaxBw = mdpVersion.getLowBw() / 1000000.0;
+ }
+
//Check whether layers marked for MDP Composition is actually doable.
if(isFullFrameDoable(ctx, list)) {
mCurrentFrame.map();
@@ -1311,9 +1318,9 @@
}
exit:
- //gbps (bytes / nanosec = gigabytes / sec)
- sBwClaimed += calcMDPBytesRead(ctx, list) /
- (double)ctx->dpyAttr[mDpy].vsync_period;
+ double panelRefRate =
+ 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
+ sBwClaimed += calcMDPBytesRead(ctx, list) * panelRefRate;
return ret;
}
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index adf74bb..96c1361 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -165,11 +165,11 @@
bool secureOnly);
/* checks for conditions where YUV layers cannot be bypassed */
bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
- /* calcs bytes read by MDP for a given frame */
- uint32_t calcMDPBytesRead(hwc_context_t *ctx,
+ /* calcs bytes read by MDP in gigs for a given frame */
+ double calcMDPBytesRead(hwc_context_t *ctx,
hwc_display_contents_1_t* list);
/* checks if the required bandwidth exceeds a certain max */
- bool bandwidthCheck(hwc_context_t *ctx, const uint32_t& size);
+ bool bandwidthCheck(hwc_context_t *ctx, const double& size);
/* generates ROI based on the modified area of the frame */
void generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list);
bool validateAndApplyROI(hwc_context_t *ctx, hwc_display_contents_1_t* list,
@@ -212,7 +212,7 @@
static bool sIdleFallBack;
static int sMaxPipesPerMixer;
//Max bandwidth. Value is in GBPS. For ex: 2.3 means 2.3GBPS
- static float sMaxBw;
+ static double sMaxBw;
//Tracks composition bandwidth claimed. Represented as the total
//w*h*bpp*fps (gigabytes-per-second) going to MDP mixers.
static double sBwClaimed;
diff --git a/libqdutils/mdp_version.cpp b/libqdutils/mdp_version.cpp
index 0809fd0..e12b319 100644
--- a/libqdutils/mdp_version.cpp
+++ b/libqdutils/mdp_version.cpp
@@ -48,6 +48,8 @@
mMDPUpscale = 0;
mMDPDownscale = 0;
mPanelType = NO_PANEL;
+ mLowBw = 0;
+ mHighBw = 0;
if(!updatePanelInfo()) {
ALOGE("Unable to read Primary Panel Information");
@@ -168,8 +170,13 @@
else if(!strncmp(tokens[0], "max_upscale_ratio",
strlen("max_upscale_ratio"))) {
mMDPUpscale = atoi(tokens[1]);
- }
- else if(!strncmp(tokens[0], "features", strlen("features"))) {
+ } else if(!strncmp(tokens[0], "max_bandwidth_low",
+ strlen("max_bandwidth_low"))) {
+ mLowBw = atol(tokens[1]);
+ } else if(!strncmp(tokens[0], "max_bandwidth_high",
+ strlen("max_bandwidth_high"))) {
+ mHighBw = atol(tokens[1]);
+ } else if(!strncmp(tokens[0], "features", strlen("features"))) {
for(int i=1; i<index;i++) {
if(!strncmp(tokens[i], "bwc", strlen("bwc"))) {
mFeatures |= MDP_BWC_EN;
@@ -191,6 +198,9 @@
mRGBPipes, mVGPipes);
ALOGD_IF(DEBUG, "%s:mDMAPipes:%d \t mMDPDownscale:%d, mFeatures:%d",
__FUNCTION__, mDMAPipes, mMDPDownscale, mFeatures);
+ ALOGD_IF(DEBUG, "%s:mLowBw: %lu mHighBw: %lu", __FUNCTION__, mLowBw,
+ mHighBw);
+
return true;
}
diff --git a/libqdutils/mdp_version.h b/libqdutils/mdp_version.h
index 1e1e35e..fb7920e 100644
--- a/libqdutils/mdp_version.h
+++ b/libqdutils/mdp_version.h
@@ -113,6 +113,8 @@
bool is8x92();
int getLeftSplit() { return mSplit.left(); }
int getRightSplit() { return mSplit.right(); }
+ unsigned long getLowBw() { return mLowBw; }
+ unsigned long getHighBw() { return mHighBw; }
private:
bool updateSysFsInfo();
bool updatePanelInfo();
@@ -131,6 +133,8 @@
uint32_t mMDPDownscale;
uint32_t mMDPUpscale;
Split mSplit;
+ unsigned long mLowBw; //kbps
+ unsigned long mHighBw; //kbps
};
}; //namespace qdutils
#endif //INCLUDE_LIBQCOMUTILS_MDPVER