Merge "hwc: Add BWC policy manager"
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index bcae381..46acd56 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -225,6 +225,9 @@
ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID);
}
+ if(usage & GRALLOC_USAGE_PRIVATE_CAMERA_HEAP)
+ ionFlags |= ION_HEAP(ION_CAMERA_HEAP_ID);
+
if(usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP)
ionFlags |= ION_HEAP(ION_ADSP_HEAP_ID);
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 3d4e462..3187648 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -68,12 +68,8 @@
/* Close Caption displayed on an external display only */
GRALLOC_USAGE_PRIVATE_EXTERNAL_CC = 0x00200000,
- /* Use this flag to request content protected buffers. Please note
- * that this flag is different from the GRALLOC_USAGE_PROTECTED flag
- * which can be used for buffers that are not secured for DRM
- * but still need to be protected from screen captures
- */
- GRALLOC_USAGE_PRIVATE_CP_BUFFER = 0x00400000,
+ /* CAMERA heap is a carveout heap for camera, is not secured*/
+ GRALLOC_USAGE_PRIVATE_CAMERA_HEAP = 0x00400000,
};
enum {
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index a2ccb12..e812c01 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -252,6 +252,7 @@
ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
(enable)?"ENABLED":"DISABLED");
break;
+#ifdef QCOM_BSP
case HWC_EVENT_ORIENTATION:
if(dpy == HWC_DISPLAY_PRIMARY) {
// store the primary display orientation
@@ -260,6 +261,7 @@
ctx->deviceOrientation = enable;
}
break;
+#endif
default:
ret = -EINVAL;
}
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 4dbc3fc..0911248 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -829,7 +829,7 @@
if(isYuvBuffer(hnd)) {
type = MDPCOMP_OV_VG;
- } else if(!qhwc::needsScaling(layer)
+ } else if(!qhwc::needsScaling(ctx, layer, mDpy)
&& Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
&& ctx->mMDP.version >= qdutils::MDSS_V5) {
type = MDPCOMP_OV_DMA;
@@ -979,7 +979,7 @@
if(isYuvBuffer(hnd)) {
type = MDPCOMP_OV_VG;
- } else if(!qhwc::needsScaling(layer)
+ } else if(!qhwc::needsScaling(ctx, layer, mDpy)
&& Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
&& ctx->mMDP.version >= qdutils::MDSS_V5) {
type = MDPCOMP_OV_DMA;
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 14b733a..b0ea0fc 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -313,15 +313,16 @@
}
-bool needsScaling(hwc_layer_1_t const* layer) {
+bool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer,
+ const int& dpy) {
int dst_w, dst_h, src_w, src_h;
hwc_rect_t displayFrame = layer->displayFrame;
hwc_rect_t sourceCrop = layer->sourceCrop;
+ trimLayer(ctx, dpy, layer->transform, sourceCrop, displayFrame);
dst_w = displayFrame.right - displayFrame.left;
dst_h = displayFrame.bottom - displayFrame.top;
-
src_w = sourceCrop.right - sourceCrop.left;
src_h = sourceCrop.bottom - sourceCrop.top;
@@ -331,8 +332,9 @@
return false;
}
-bool isAlphaScaled(hwc_layer_1_t const* layer) {
- if(needsScaling(layer) && isAlphaPresent(layer)) {
+bool isAlphaScaled(hwc_context_t* ctx, hwc_layer_1_t const* layer,
+ const int& dpy) {
+ if(needsScaling(ctx, layer, dpy) && isAlphaPresent(layer)) {
return true;
}
return false;
@@ -397,14 +399,17 @@
ctx->listStats[dpy].preMultipliedAlpha = true;
if(!ctx->listStats[dpy].needsAlphaScale)
- ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer);
+ ctx->listStats[dpy].needsAlphaScale =
+ isAlphaScaled(ctx, layer, dpy);
if(UNLIKELY(isExtOnly(hnd))){
ctx->listStats[dpy].extOnlyLayerIndex = i;
}
+#ifdef QCOM_BSP
if (layer->flags & HWC_SCREENSHOT_ANIMATOR_LAYER) {
ctx->listStats[dpy].isDisplayAnimating = true;
}
+#endif
}
if(ctx->listStats[dpy].yuvCount > 0) {
if (property_get("hw.cabl.yuv", property, NULL) > 0) {
@@ -764,6 +769,9 @@
if (ovutils::isYuv(whf.format)) {
ovutils::normalizeCrop((uint32_t&)crop.left, crop_w);
ovutils::normalizeCrop((uint32_t&)crop.top, crop_h);
+ // For interlaced, crop.h should be 4-aligned
+ if ((mdpFlags & ovutils::OV_MDP_DEINTERLACE) && (crop_h % 4))
+ crop_h = ovutils::aligndown(crop_h, 4);
crop.right = crop.left + crop_w;
crop.bottom = crop.top + crop_h;
}
@@ -861,6 +869,7 @@
crop = ctx->mPrevCropVideo;
dst = ctx->mPrevDestVideo;
transform = ctx->mPrevTransformVideo;
+ orient = static_cast<eTransform>(transform);
//In you tube use case when a device rotated from landscape to
// portrait, set the isFg flag and zOrder to avoid displaying UI on
// hdmi during animation
@@ -963,6 +972,7 @@
crop = ctx->mPrevCropVideo;
dst = ctx->mPrevDestVideo;
transform = ctx->mPrevTransformVideo;
+ orient = static_cast<eTransform>(transform);
//In you tube use case when a device rotated from landscape to
// portrait, set the isFg flag and zOrder to avoid displaying UI on
// hdmi during animation
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 4e3eecb..729a649 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -136,7 +136,7 @@
bool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer);
bool isSecureModePolicy(int mdpVersion);
bool isExternalActive(hwc_context_t* ctx);
-bool needsScaling(hwc_layer_1_t const* layer);
+bool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer, const int& dpy);
bool isAlphaPresent(hwc_layer_1_t const* layer);
int hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable);
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index 2abdc19..71e7e5b 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -173,6 +173,11 @@
if(mdpVersion < MDSS_V5) {
utils::even_floor(mOVInfo.dst_rect.w);
utils::even_floor(mOVInfo.dst_rect.h);
+ } else if (mOVInfo.flags & MDP_DEINTERLACE) {
+ // For interlaced, crop.h should be 4-aligned
+ if (!(mOVInfo.flags & MDP_SOURCE_ROTATED_90) &&
+ (mOVInfo.src_rect.h % 4))
+ mOVInfo.src_rect.h = utils::aligndown(mOVInfo.src_rect.h, 4);
}
}