hwc: Handle layers marked as PROTECTED flag as secure
- All secure layers are marked with GRALLOC_USAGE_PROTECTED,
irrespective of L1/L3, which should not fallback to GPU.
- In HWC, treat this layer as secure so that any fallbacks
will be avoided.
Change-Id: I399740bfb5910f3fda4c4f395e2f7b49ea8619a9
Crs-fixed: 842071
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 43a7a1a..d21533c 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -470,8 +470,10 @@
}
//XXX: Investigate doing this with pixel phase on MDSS
- if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf))
+ if((!isSecureBuffer(hnd) || !isProtectedBuffer(hnd)) &&
+ isNonIntegralSourceCrop(layer->sourceCropf)) {
return false;
+ }
hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
hwc_rect_t dst = layer->displayFrame;
@@ -1833,7 +1835,8 @@
} else {
if(frame.isFBComposed[nYuvIndex]) {
private_handle_t *hnd = (private_handle_t *)layer->handle;
- if(!secureOnly || isSecureBuffer(hnd)) {
+ if(!secureOnly || isSecureBuffer(hnd) ||
+ isProtectedBuffer(hnd)) {
frame.isFBComposed[nYuvIndex] = false;
frame.fbCount--;
}
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 03c6341..4fec80c 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -1196,7 +1196,8 @@
ctx->listStats[dpy].yuvIndices[i] = -1;
ctx->listStats[dpy].yuv4k2kIndices[i] = -1;
- if (isSecureBuffer(hnd)) {
+ if (isSecureBuffer(hnd) || isProtectedBuffer(hnd)) {
+ // Protected Buffer must be treated as Secure Layer
ctx->listStats[dpy].isSecurePresent = true;
if(not isYuvBuffer(hnd)) {
// cache secureRGB layer parameters like we cache for YUV layers
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 4849baf..35bdbee 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -537,12 +537,12 @@
(hnd->width > maxPipeWidth));
}
-// Returns true if the buffer is secure
+// Returns true if the buffer is secure(using secure heap)
static inline bool isSecureBuffer(const private_handle_t* hnd) {
return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
}
-// Returns true if the buffer is protected
+// Returns true if the buffer is protected(L3 using IOMMU heap)
static inline bool isProtectedBuffer(const private_handle_t* hnd) {
return (hnd && (private_handle_t::PRIV_FLAGS_PROTECTED_BUFFER & hnd->flags));
}