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_;