Merge "gralloc: UBWC aligned buffers are Macro Tiled"
diff --git a/displayengine/libs/core/fb/hw_hdmi.cpp b/displayengine/libs/core/fb/hw_hdmi.cpp
index 67fa2c6..d258df3 100644
--- a/displayengine/libs/core/fb/hw_hdmi.cpp
+++ b/displayengine/libs/core/fb/hw_hdmi.cpp
@@ -222,8 +222,9 @@
   display_attributes->y_pixels = timing_mode->active_v;
   display_attributes->v_total = timing_mode->active_v + timing_mode->front_porch_v +
       timing_mode->back_porch_v + timing_mode->pulse_width_v;
-  display_attributes->h_total = timing_mode->active_h + timing_mode->front_porch_h +
-      timing_mode->back_porch_h + timing_mode->pulse_width_h;
+  uint32_t h_blanking = timing_mode->front_porch_h + timing_mode->back_porch_h +
+      timing_mode->pulse_width_h;
+  display_attributes->h_total = timing_mode->active_h + h_blanking;
   display_attributes->x_dpi = 0;
   display_attributes->y_dpi = 0;
   display_attributes->fps = FLOAT(timing_mode->refresh_rate) / 1000.0f;
@@ -232,6 +233,7 @@
   if (display_attributes->x_pixels > hw_resource_.max_mixer_width) {
     display_attributes->is_device_split = true;
     display_attributes->split_left = display_attributes->x_pixels / 2;
+    display_attributes->h_total += h_blanking;
   }
   return kErrorNone;
 }
diff --git a/displayengine/libs/core/fb/hw_primary.cpp b/displayengine/libs/core/fb/hw_primary.cpp
index 7b9cbe0..87de5d4 100644
--- a/displayengine/libs/core/fb/hw_primary.cpp
+++ b/displayengine/libs/core/fb/hw_primary.cpp
@@ -191,8 +191,9 @@
   display_attributes->y_pixels = var_screeninfo.yres;
   display_attributes->v_total = var_screeninfo.yres + var_screeninfo.lower_margin +
       var_screeninfo.upper_margin + var_screeninfo.vsync_len;
-  display_attributes->h_total = var_screeninfo.xres + var_screeninfo.right_margin +
-      var_screeninfo.left_margin + var_screeninfo.hsync_len;
+  uint32_t h_blanking = var_screeninfo.right_margin + var_screeninfo.left_margin +
+      var_screeninfo.hsync_len;
+  display_attributes->h_total = var_screeninfo.xres + h_blanking;
   display_attributes->x_dpi =
       (FLOAT(var_screeninfo.xres) * 25.4f) / FLOAT(var_screeninfo.width);
   display_attributes->y_dpi =
@@ -204,6 +205,7 @@
   display_attributes->split_left = hw_panel_info_.split_info.left_split ?
       hw_panel_info_.split_info.left_split : display_attributes->x_pixels / 2;
   display_attributes->always_src_split = hw_panel_info_.split_info.always_src_split;
+  display_attributes->h_total += display_attributes->is_device_split ? h_blanking : 0;
 
   return kErrorNone;
 }
diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp
index 2bd1edf..7344c21 100644
--- a/displayengine/libs/core/res_manager.cpp
+++ b/displayengine/libs/core/res_manager.cpp
@@ -504,7 +504,15 @@
   // Command mode panel, data gets transferred from MDP to panel during blanking time as well,
   // which means MDP needs to fetch the data faster. So pipe bandwidth needs to be adjusted.
   if (display_ctx->hw_panel_info_.mode == kModeCommand) {
-    bw *= FLOAT(display_attributes.h_total) / FLOAT(display_attributes.x_pixels);
+    uint32_t h_total = display_attributes.h_total;
+    uint32_t h_active = display_attributes.x_pixels;
+    // On split-panel device, h_active is left split
+    if (display_attributes.is_device_split) {
+      uint32_t h_blanking = (h_total - h_active) / 2;
+      h_active = display_attributes.split_left;
+      h_total = h_active + h_blanking;
+    }
+    bw *= FLOAT(h_total) / FLOAT(h_active);
   }
 
   // Bandwidth in GBps
diff --git a/libcopybit/copybit.cpp b/libcopybit/copybit.cpp
index 02f0c7e..10f5943 100644
--- a/libcopybit/copybit.cpp
+++ b/libcopybit/copybit.cpp
@@ -146,6 +146,7 @@
         case HAL_PIXEL_FORMAT_YCbCr_420_SP:  return MDP_Y_CBCR_H2V2;
         case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: return MDP_Y_CBCR_H2V2_ADRENO;
         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: return MDP_Y_CBCR_H2V2_VENUS;
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: return MDP_Y_CRCB_H2V2_VENUS;
         case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: return MDP_Y_CBCR_H2V2;
     }
     return -1;
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index f43f645..aaaf16b 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -196,6 +196,10 @@
             aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
             aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height);
             break;
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
+            aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV21, width);
+            aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV21, height);
+            break;
         case HAL_PIXEL_FORMAT_BLOB:
             break;
         case HAL_PIXEL_FORMAT_NV21_ZSL:
@@ -537,6 +541,9 @@
         case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
             size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
             break;
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
+            size = VENUS_BUFFER_SIZE(COLOR_FMT_NV21, width, height);
+            break;
         case HAL_PIXEL_FORMAT_BLOB:
             if(height != 1) {
                 ALOGE("%s: Buffers with format HAL_PIXEL_FORMAT_BLOB \
@@ -700,6 +707,7 @@
         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
         case HAL_PIXEL_FORMAT_YCrCb_422_SP:
         case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
         case HAL_PIXEL_FORMAT_NV21_ZSL:
         case HAL_PIXEL_FORMAT_RAW_SENSOR:
         case HAL_PIXEL_FORMAT_RAW10:
@@ -900,7 +908,7 @@
     meta_width = ALIGN(((width + block_width - 1) / block_width), 64);
 
     // Align meta buffer size to 4K
-    size = ((meta_width * meta_height), 4096);
+    size = ALIGN((meta_width * meta_height), 4096);
     return size;
 }
 
@@ -931,7 +939,7 @@
     return size;
 }
 
-int getRgbDataAddress(private_handle_t* hnd, void* rgb_data)
+int getRgbDataAddress(private_handle_t* hnd, void** rgb_data)
 {
     int err = 0;
 
@@ -942,7 +950,7 @@
 
     // linear buffer
     if (!(hnd->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED)) {
-        rgb_data = (void*)hnd->base;
+        *rgb_data = (void*)hnd->base;
         return err;
     }
 
@@ -962,6 +970,6 @@
             break;
     }
 
-    rgb_data = (void*)(hnd->base + meta_size);
+    *rgb_data = (void*)(hnd->base + meta_size);
     return err;
 }
diff --git a/libgralloc/gr.h b/libgralloc/gr.h
index 98b4eec..e27203a 100644
--- a/libgralloc/gr.h
+++ b/libgralloc/gr.h
@@ -71,7 +71,7 @@
 int alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
 void free_buffer(private_handle_t *hnd);
 int getYUVPlaneInfo(private_handle_t* pHnd, struct android_ycbcr* ycbcr);
-int getRgbDataAddress(private_handle_t* pHnd, void* rgb_data);
+int getRgbDataAddress(private_handle_t* pHnd, void** rgb_data);
 
 // To query if UBWC is enabled, based on format and usage flags
 bool isUBwcEnabled(int format, int usage);
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 6998296..2601953 100755
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -104,6 +104,7 @@
 #define HAL_PIXEL_FORMAT_YCrCb_422_I             0x111
 #define HAL_PIXEL_FORMAT_BGRX_8888               0x112
 #define HAL_PIXEL_FORMAT_NV21_ZSL                0x113
+#define HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS      0x114
 #define HAL_PIXEL_FORMAT_INTERLACE               0x180
 
 //v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component
diff --git a/libgralloc/mapper.cpp b/libgralloc/mapper.cpp
index 4c3f976..cf365ce 100644
--- a/libgralloc/mapper.cpp
+++ b/libgralloc/mapper.cpp
@@ -446,7 +446,7 @@
         case GRALLOC_MODULE_PERFORM_GET_RGB_DATA_ADDRESS:
             {
                 private_handle_t* hnd = va_arg(args, private_handle_t*);
-                void* rgb_data = va_arg(args, void*);
+                void** rgb_data = va_arg(args, void**);
                 if (!private_handle_t::validate(hnd)) {
                     res = getRgbDataAddress(hnd, rgb_data);
                 }
diff --git a/libhwcomposer/hwc_dump_layers.cpp b/libhwcomposer/hwc_dump_layers.cpp
index aad984d..fca8a5c 100644
--- a/libhwcomposer/hwc_dump_layers.cpp
+++ b/libhwcomposer/hwc_dump_layers.cpp
@@ -448,6 +448,9 @@
         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
             strlcpy(pixFormatStr, "YCbCr_420_SP_VENUS", sizeof(pixFormatStr));
             break;
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
+            strlcpy(pixFormatStr, "YCrCb_420_SP_VENUS", sizeof(pixFormatStr));
+            break;
         default:
             size_t len = sizeof(pixFormatStr);
             snprintf(pixFormatStr, len, "Unknown0x%X", format);
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index b37eba9..d87bee6 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -128,6 +128,8 @@
             //NV12 encodeable format maps to the venus format on
             //B-Family targets
             return MDP_Y_CBCR_H2V2_VENUS;
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
+            return MDP_Y_CRCB_H2V2_VENUS;
         default:
             //Unsupported by MDP
             //---gralloc_priv.h-----
@@ -227,6 +229,8 @@
             return HAL_PIXEL_FORMAT_YCrCb_444_SP;
         case MDP_Y_CBCR_H2V2_VENUS:
             return HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
+        case MDP_Y_CRCB_H2V2_VENUS:
+            return HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS;
         default:
             ALOGE("%s: Unsupported MDP format = 0x%x", __func__, mdpFormat);
             return -1;
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index 5e3bd1f..17ec268 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -420,6 +420,7 @@
         case MDP_Y_CR_CB_H2V2:
         case MDP_Y_CR_CB_GH2V2:
         case MDP_Y_CBCR_H2V2_VENUS:
+        case MDP_Y_CRCB_H2V2_VENUS:
         case MDP_YCBYCR_H2V1:
         case MDP_YCRYCB_H2V1:
             return true;
@@ -478,6 +479,7 @@
     formats[MDP_BGR_565] = STR(MDP_BGR_565);
     formats[MDP_BGR_888] = STR(MDP_BGR_888);
     formats[MDP_Y_CBCR_H2V2_VENUS] = STR(MDP_Y_CBCR_H2V2_VENUS);
+    formats[MDP_Y_CRCB_H2V2_VENUS] = STR(MDP_Y_CRCB_H2V2_VENUS);
     formats[MDP_BGRX_8888] = STR(MDP_BGRX_8888);
     formats[MDP_RGBA_8888_TILE] = STR(MDP_RGBA_8888_TILE);
     formats[MDP_ARGB_8888_TILE] = STR(MDP_ARGB_8888_TILE);