Merge "sde: Add support for UBWC in display engine"
diff --git a/displayengine/include/core/layer_buffer.h b/displayengine/include/core/layer_buffer.h
index c069c60..51fa5c5 100755
--- a/displayengine/include/core/layer_buffer.h
+++ b/displayengine/include/core/layer_buffer.h
@@ -87,6 +87,15 @@
//!< factor of 2
//!< u(0), y(0), v(0), y(1), u(2), y(2), v(2), y(3)
//!< u(n-1), y(n-1), v(n-1), y(n)
+
+ /* All UBWC aligned formats. Any new format will be added towards end of this group to maintain
+ backward compatibility.
+ */
+ kFormatRGBA8888Ubwc = 0x400, //!< UBWC aligned RGBA8888 format
+
+ kFormatRGB565Ubwc, //!< UBWC aligned RGB565 format
+
+ kFormatYCbCr420SPVenusUbwc, //!< UBWC aligned Venus NV12 format
};
/*! @brief This structure defines a color sample plane belonging to a buffer format. RGB buffer
diff --git a/displayengine/libs/core/hw_framebuffer.cpp b/displayengine/libs/core/hw_framebuffer.cpp
index 38320a4..e062e48 100644
--- a/displayengine/libs/core/hw_framebuffer.cpp
+++ b/displayengine/libs/core/hw_framebuffer.cpp
@@ -653,6 +653,9 @@
case kFormatYCrCb420SemiPlanar: *target = MDP_Y_CRCB_H2V2; break;
case kFormatYCbCr422Packed: *target = MDP_YCBYCR_H2V1; break;
case kFormatYCbCr420SemiPlanarVenus: *target = MDP_Y_CBCR_H2V2_VENUS; break;
+ case kFormatRGBA8888Ubwc: *target = MDP_RGBA_8888_UBWC; break;
+ case kFormatRGB565Ubwc: *target = MDP_RGB_565_UBWC; break;
+ case kFormatYCbCr420SPVenusUbwc: *target = MDP_Y_CBCR_H2V2_UBWC; break;
default:
DLOGE("Unsupported format type %d", source);
return kErrorParameters;
diff --git a/displayengine/libs/hwc/hwc_display.cpp b/displayengine/libs/hwc/hwc_display.cpp
index bf54a8a..d765e04 100644
--- a/displayengine/libs/hwc/hwc_display.cpp
+++ b/displayengine/libs/hwc/hwc_display.cpp
@@ -294,7 +294,7 @@
LayerBuffer *layer_buffer = layer.input_buffer;
if (pvt_handle) {
- if (SetFormat(pvt_handle->format, &layer_buffer->format)) {
+ if (SetFormat(pvt_handle->format, pvt_handle->flags, &layer_buffer->format)) {
return -EINVAL;
}
@@ -518,7 +518,22 @@
}
}
-int HWCDisplay::SetFormat(const int32_t &source, LayerBufferFormat *target) {
+int HWCDisplay::SetFormat(const int32_t &source, const int flags, LayerBufferFormat *target) {
+
+ if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
+ switch (source) {
+ case HAL_PIXEL_FORMAT_RGBA_8888: *target = kFormatRGBA8888Ubwc; break;
+ case HAL_PIXEL_FORMAT_RGB_565: *target = kFormatRGB565Ubwc; break;
+ case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
+ case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
+ case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: *target = kFormatYCbCr420SPVenusUbwc; break;
+ default:
+ DLOGE("Unsupported format type for UBWC %d", source);
+ return -EINVAL;
+ }
+ return 0;
+ }
+
switch (source) {
case HAL_PIXEL_FORMAT_RGBA_8888: *target = kFormatRGBA8888; break;
case HAL_PIXEL_FORMAT_BGRA_8888: *target = kFormatBGRA8888; break;
@@ -527,6 +542,7 @@
case HAL_PIXEL_FORMAT_RGB_888: *target = kFormatRGB888; break;
case HAL_PIXEL_FORMAT_RGB_565: *target = kFormatRGB565; break;
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: *target = kFormatYCbCr420SemiPlanarVenus; break;
+ case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: *target = kFormatYCbCr420SPVenusUbwc; break;
default:
DLOGW("Unsupported format type = %d", source);
return -EINVAL;
diff --git a/displayengine/libs/hwc/hwc_display.h b/displayengine/libs/hwc/hwc_display.h
index 0ba9ca7..8ac4b46 100644
--- a/displayengine/libs/hwc/hwc_display.h
+++ b/displayengine/libs/hwc/hwc_display.h
@@ -87,7 +87,7 @@
inline void SetComposition(const int32_t &source, LayerComposition *target);
inline void SetComposition(const int32_t &source, int32_t *target);
inline void SetBlending(const int32_t &source, LayerBlending *target);
- inline int SetFormat(const int32_t &source, LayerBufferFormat *target);
+ inline int SetFormat(const int32_t &source, const int flags, LayerBufferFormat *target);
CoreInterface *core_intf_;
hwc_procs_t const **hwc_procs_;