Merge "Invoke a padding round in certain use-cases."
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 5360554..42f3c77 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -508,6 +508,7 @@
case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
size = alignedw * alignedh * ASTC_BLOCK_SIZE;
break;
default:
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 80e7803..db456bc 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -484,6 +484,9 @@
case HWC_COLOR_FILL:
value[0] = 1;
break;
+ case HWC_MAX_WRITEBACK_WIDTH:
+ value[0] = qdutils::MAX_DISPLAY_DIM;
+ break;
default:
return -EINVAL;
}
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 53d614f..6ff1aa3 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -233,7 +233,7 @@
fbCount = numLayers;
mdpCount = 0;
needsRedraw = true;
- fbZ = 0;
+ fbZ = -1;
}
void MDPComp::FrameInfo::map() {
@@ -630,7 +630,6 @@
}
mCurrentFrame.fbCount = 0;
- mCurrentFrame.fbZ = -1;
memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop,
sizeof(mCurrentFrame.isFBComposed));
mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount -
@@ -1120,14 +1119,14 @@
int maxBatchCount = 0;
int fbZ = -1;
- /* All or Nothing is cached. No batching needed */
- if(!mCurrentFrame.fbCount) {
- mCurrentFrame.fbZ = -1;
+ /* Nothing is cached. No batching needed */
+ if(mCurrentFrame.fbCount == 0) {
return true;
}
- if(!mCurrentFrame.mdpCount) {
- mCurrentFrame.fbZ = 0;
- return true;
+
+ /* No MDP comp layers, try to use other comp modes */
+ if(mCurrentFrame.mdpCount == 0) {
+ return false;
}
fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount);
@@ -1297,10 +1296,6 @@
return false;
}
- if(!arePipesAvailable(ctx, list)) {
- return false;
- }
-
double size = calcMDPBytesRead(ctx, list);
if(!bandwidthCheck(ctx, size)) {
ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
@@ -1550,58 +1545,6 @@
&PipeLayerPair.rot);
}
-bool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) {
- overlay::Overlay& ov = *ctx->mOverlay;
- int numPipesNeeded = mCurrentFrame.mdpCount;
- int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT);
-
- //Reserve pipe for FB
- if(mCurrentFrame.fbCount)
- availPipes -= 1;
-
- if(numPipesNeeded > availPipes) {
- ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d",
- __FUNCTION__, mDpy, numPipesNeeded, availPipes);
- return false;
- }
-
- if(not areVGPipesAvailable(ctx, list)) {
- return false;
- }
-
- return true;
-}
-
-bool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) {
- overlay::Overlay& ov = *ctx->mOverlay;
- int pipesNeeded = 0;
- 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;
- private_handle_t *hnd = (private_handle_t *)layer->handle;
- if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
- pipesNeeded = pipesNeeded + 2;
- }
- else if(isYuvBuffer(hnd)) {
- pipesNeeded++;
- }
- }
- }
-
- int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
- if(pipesNeeded > availableVGPipes) {
- ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
- "dpy %d needed %d, avail %d",
- __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
- return false;
- }
-
- return true;
-}
-
bool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx,
hwc_display_contents_1_t* list) {
for(int index = 0; index < mCurrentFrame.layerCount; index++) {
@@ -1799,105 +1742,6 @@
}
}
-int MDPCompSplit::pipesNeeded(hwc_context_t *ctx,
- hwc_display_contents_1_t* list,
- int mixer) {
- int pipesNeeded = 0;
-
- const int lSplit = getLeftSplit(ctx, mDpy);
-
- 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(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) {
- pipesNeeded++;
- } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) {
- pipesNeeded++;
- }
- }
- }
- return pipesNeeded;
-}
-
-bool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) {
- overlay::Overlay& ov = *ctx->mOverlay;
- int totalPipesNeeded = 0;
-
- for(int i = 0; i < Overlay::MIXER_MAX; i++) {
- int numPipesNeeded = pipesNeeded(ctx, list, i);
- int availPipes = ov.availablePipes(mDpy, i);
-
- //Reserve pipe(s)for FB
- if(mCurrentFrame.fbCount)
- numPipesNeeded += 1;
-
- totalPipesNeeded += numPipesNeeded;
-
- //Per mixer check.
- if(numPipesNeeded > availPipes) {
- ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
- "dpy %d mixer %d needed %d, avail %d",
- __FUNCTION__, mDpy, i, numPipesNeeded, availPipes);
- return false;
- }
- }
-
- //Per display check, since unused pipes can get counted twice.
- int totalPipesAvailable = ov.availablePipes(mDpy);
- if(totalPipesNeeded > totalPipesAvailable) {
- ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
- "dpy %d needed %d, avail %d",
- __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable);
- return false;
- }
-
- if(not areVGPipesAvailable(ctx, list)) {
- return false;
- }
-
- return true;
-}
-
-bool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) {
- overlay::Overlay& ov = *ctx->mOverlay;
- int pipesNeeded = 0;
- const int lSplit = getLeftSplit(ctx, mDpy);
- 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;
- private_handle_t *hnd = (private_handle_t *)layer->handle;
- if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
- if((dst.left > lSplit)||(dst.right < lSplit)){
- pipesNeeded = pipesNeeded + 2;
- continue;
- }
- }
- if(isYuvBuffer(hnd)) {
- if(dst.left < lSplit) {
- pipesNeeded++;
- }
- if(dst.right > lSplit) {
- pipesNeeded++;
- }
- }
- }
- }
-
- int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
- if(pipesNeeded > availableVGPipes) {
- ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
- "dpy %d needed %d, avail %d",
- __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
- return false;
- }
-
- return true;
-}
-
bool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
MdpPipeInfoSplit& pipe_info,
ePipeType type) {
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 40a0cb5..f2a8eda 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -136,9 +136,6 @@
/* configures MPD pipes */
virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
PipeLayerPair& pipeLayerPair) = 0;
- /* Checks for pipes needed versus pipes available */
- virtual bool arePipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list) = 0;
/* Increments mdpCount if 4k2k yuv layer split is enabled.
* updates framebuffer z order if fb lies above source-split layer */
virtual void adjustForSourceSplit(hwc_context_t *ctx,
@@ -268,14 +265,6 @@
virtual bool allocLayerPipes(hwc_context_t *ctx,
hwc_display_contents_1_t* list);
- /* Checks for pipes needed versus pipes available */
- virtual bool arePipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list);
-
- /* Checks for video pipes needed versus pipes available */
- virtual bool areVGPipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list);
-
/* Increments mdpCount if 4k2k yuv layer split is enabled.
* updates framebuffer z order if fb lies above source-split layer */
virtual void adjustForSourceSplit(hwc_context_t *ctx,
@@ -309,14 +298,6 @@
virtual bool allocLayerPipes(hwc_context_t *ctx,
hwc_display_contents_1_t* list);
- /* Checks for pipes needed versus pipes available */
- virtual bool arePipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list);
-
- /* Checks for video pipes needed versus pipes available */
- virtual bool areVGPipesAvailable(hwc_context_t *ctx,
- hwc_display_contents_1_t* list);
-
/* Increments mdpCount if 4k2k yuv layer split is enabled.
* updates framebuffer z order if fb lies above source-split layer */
virtual void adjustForSourceSplit(hwc_context_t *ctx,
@@ -325,9 +306,6 @@
/* configures 4kx2k yuv layer*/
virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
PipeLayerPair& PipeLayerPair);
-
- int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list,
- int mixer);
};
}; //namespace
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 4ebf685..ce2da87 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -1255,15 +1255,14 @@
}
}
- //Accumulate acquireFenceFds for MDP
+ //Accumulate acquireFenceFds for MDP Overlays
if(list->outbufAcquireFenceFd >= 0) {
//Writeback output buffer
acquireFd[count++] = list->outbufAcquireFenceFd;
}
for(uint32_t i = 0; i < list->numHwLayers; i++) {
- if((list->hwLayers[i].compositionType == HWC_OVERLAY ||
- list->hwLayers[i].compositionType == HWC_BLIT) &&
+ if(list->hwLayers[i].compositionType == HWC_OVERLAY &&
list->hwLayers[i].acquireFenceFd >= 0) {
if(UNLIKELY(swapzero))
acquireFd[count++] = -1;
@@ -1319,7 +1318,13 @@
!(layerProp[i].mFlags & HWC_VPUCOMP)) {
//If rotator has not already populated this field
// & if it's a not VPU layer
- list->hwLayers[i].releaseFenceFd = dup(releaseFd);
+ if(list->hwLayers[i].compositionType == HWC_BLIT) {
+ //For Blit, the app layers should be released when the Blit is
+ //complete. This fd was passed from copybit->draw
+ list->hwLayers[i].releaseFenceFd = dup(fd);
+ } else {
+ list->hwLayers[i].releaseFenceFd = dup(releaseFd);
+ }
}
}
}
diff --git a/libqservice/QServiceUtils.h b/libqservice/QServiceUtils.h
index a5f4f7f..699164d 100644
--- a/libqservice/QServiceUtils.h
+++ b/libqservice/QServiceUtils.h
@@ -49,7 +49,7 @@
}
inline android::status_t sendSingleParam(uint32_t command, uint32_t value) {
- android::status_t err = (status_t) android::FAILED_TRANSACTION;
+ android::status_t err = (android::status_t) android::FAILED_TRANSACTION;
android::sp<qService::IQService> binder = getBinder();
android::Parcel inParcel, outParcel;
inParcel.writeInt32(value);