sde: Add support for UBWC in display engine
SDE checks for PRIV_FLAGS_UBWC_ALIGNED bit in private handle flags
and sets the corresponding UBWC aligned LayerBufferFormat. Driver
expects UBWC specific pixel formats defined by MDP header.
Change-Id: Iaf86c4d7433dc9628b1cf8d7fb8872ab4f1f0a39
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 0644e7d..54b0c83 100644
--- a/displayengine/libs/core/hw_framebuffer.cpp
+++ b/displayengine/libs/core/hw_framebuffer.cpp
@@ -649,6 +649,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 771c07f..ce8f933 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;
}
@@ -512,7 +512,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;
@@ -521,6 +536,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_;