Merge "sdm/gralloc: Use correct DRM format enums for RGB formats"
diff --git a/libgralloc/adreno_utils.h b/libgralloc/adreno_utils.h
index 8ea7f70..baecef9 100644
--- a/libgralloc/adreno_utils.h
+++ b/libgralloc/adreno_utils.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2015 - 2017, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
@@ -35,6 +35,7 @@
     ADRENO_PIXELFORMAT_B8G8R8A8_SRGB = 91,
     ADRENO_PIXELFORMAT_B8G8R8X8_SRGB = 93,
     ADRENO_PIXELFORMAT_NV12          = 103,
+    ADRENO_PIXELFORMAT_P010          = 104,
     ADRENO_PIXELFORMAT_YUY2          = 107,
     ADRENO_PIXELFORMAT_B4G4R4A4      = 115,
     ADRENO_PIXELFORMAT_NV12_EXT      = 506,  // NV12 with non-std alignment and offsets
@@ -54,5 +55,5 @@
     ADRENO_PIXELFORMAT_NV21          = 619,
     ADRENO_PIXELFORMAT_Y8U8V8A8      = 620,  // YUV 4:4:4 packed (1 plane)
     ADRENO_PIXELFORMAT_Y8            = 625,  // Single 8-bit luma only channel YUV format
-    ADRENO_PIXELFORMAT_TP10          = 648,
+    ADRENO_PIXELFORMAT_TP10          = 654,  // YUV 4:2:0 planar 10 bits/comp (2 planes)
 } ADRENOPIXELFORMAT;
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 7c01eb7..38e2050 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -88,6 +88,10 @@
 #endif
 #endif
 
+#ifndef COLOR_FMT_P010_UBWC
+#define COLOR_FMT_P010_UBWC 9
+#endif
+
 using namespace gralloc;
 using namespace qdutils;
 using namespace android;
@@ -429,6 +433,9 @@
             return ADRENO_PIXELFORMAT_NV12_EXT;
         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
             return ADRENO_PIXELFORMAT_TP10;
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010:
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+            return ADRENO_PIXELFORMAT_P010;
         case HAL_PIXEL_FORMAT_RGBA_1010102:
             return ADRENO_PIXELFORMAT_R10G10B10A2_UNORM;
         case HAL_PIXEL_FORMAT_RGBX_1010102:
@@ -812,7 +819,11 @@
                                   COLOR_FMT_NV12_BPP10_UBWC, ycbcr);
             ycbcr->chroma_step = 3;
         break;
-
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+            getYuvUbwcSPPlaneInfo(hnd->base, width, height,
+                                  COLOR_FMT_P010_UBWC, ycbcr);
+            ycbcr->chroma_step = 4;
+        break;
         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
         case HAL_PIXEL_FORMAT_YCrCb_422_SP:
         case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
@@ -922,6 +933,7 @@
     {
         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
             return true;
         default:
             return false;
@@ -994,6 +1006,11 @@
             aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width) * 3) / 4;
             aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height);
             break;
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+            // The macro returns the stride which is 2 times the width, hence / 2
+            aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_P010_UBWC, width) / 2);
+            aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_P010_UBWC, height);
+            break;
         default:
             ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
             aligned_w = 0;
@@ -1076,6 +1093,9 @@
         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
             size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_BPP10_UBWC, width, height);
             break;
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+            size = VENUS_BUFFER_SIZE(COLOR_FMT_P010_UBWC, width, height);
+            break;
         default:
             ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
             break;
@@ -1181,6 +1201,7 @@
         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
         case HAL_PIXEL_FORMAT_YCbCr_420_P010:
         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
             offset[1] = static_cast<uint32_t>(
                     reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
             break;
@@ -1220,55 +1241,55 @@
 
     switch (hal_format) {
         case HAL_PIXEL_FORMAT_RGBA_8888:
-            *drm_format = DRM_FORMAT_RGBA8888;
+            *drm_format = DRM_FORMAT_ABGR8888;
             break;
         case HAL_PIXEL_FORMAT_RGBA_5551:
-            *drm_format = DRM_FORMAT_RGBA5551;
+            *drm_format = DRM_FORMAT_ABGR1555;
             break;
         case HAL_PIXEL_FORMAT_RGBA_4444:
-            *drm_format = DRM_FORMAT_RGBA4444;
+            *drm_format = DRM_FORMAT_ABGR4444;
             break;
         case HAL_PIXEL_FORMAT_BGRA_8888:
-            *drm_format = DRM_FORMAT_BGRA8888;
+            *drm_format = DRM_FORMAT_ARGB8888;
             break;
         case HAL_PIXEL_FORMAT_RGBX_8888:
-            *drm_format = DRM_FORMAT_RGBX8888;
+            *drm_format = DRM_FORMAT_XBGR8888;
             break;
         case HAL_PIXEL_FORMAT_BGRX_8888:
-            *drm_format = DRM_FORMAT_BGRX8888;
+            *drm_format = DRM_FORMAT_XRGB8888;
             break;
         case HAL_PIXEL_FORMAT_RGB_888:
-            *drm_format = DRM_FORMAT_RGB888;
+            *drm_format = DRM_FORMAT_BGR888;
             break;
         case HAL_PIXEL_FORMAT_RGB_565:
-            *drm_format = DRM_FORMAT_RGB565;
-            break;
-        case HAL_PIXEL_FORMAT_BGR_565:
             *drm_format = DRM_FORMAT_BGR565;
             break;
+        case HAL_PIXEL_FORMAT_BGR_565:
+            *drm_format = DRM_FORMAT_RGB565;
+            break;
         case HAL_PIXEL_FORMAT_RGBA_1010102:
-            *drm_format = DRM_FORMAT_RGBA1010102;
-            break;
-        case HAL_PIXEL_FORMAT_ARGB_2101010:
-            *drm_format = DRM_FORMAT_ARGB2101010;
-            break;
-        case HAL_PIXEL_FORMAT_RGBX_1010102:
-            *drm_format = DRM_FORMAT_RGBX1010102;
-            break;
-        case HAL_PIXEL_FORMAT_XRGB_2101010:
-            *drm_format = DRM_FORMAT_XRGB2101010;
-            break;
-        case HAL_PIXEL_FORMAT_BGRA_1010102:
-            *drm_format = DRM_FORMAT_BGRA1010102;
-            break;
-        case HAL_PIXEL_FORMAT_ABGR_2101010:
             *drm_format = DRM_FORMAT_ABGR2101010;
             break;
-        case HAL_PIXEL_FORMAT_BGRX_1010102:
+        case HAL_PIXEL_FORMAT_ARGB_2101010:
+            *drm_format = DRM_FORMAT_BGRA1010102;
+            break;
+        case HAL_PIXEL_FORMAT_RGBX_1010102:
+            *drm_format = DRM_FORMAT_XBGR2101010;
+            break;
+        case HAL_PIXEL_FORMAT_XRGB_2101010:
             *drm_format = DRM_FORMAT_BGRX1010102;
             break;
+        case HAL_PIXEL_FORMAT_BGRA_1010102:
+            *drm_format = DRM_FORMAT_ARGB2101010;
+            break;
+        case HAL_PIXEL_FORMAT_ABGR_2101010:
+            *drm_format = DRM_FORMAT_RGBA1010102;
+            break;
+        case HAL_PIXEL_FORMAT_BGRX_1010102:
+            *drm_format = DRM_FORMAT_XRGB2101010;
+            break;
         case HAL_PIXEL_FORMAT_XBGR_2101010:
-            *drm_format = DRM_FORMAT_XBGR2101010;
+            *drm_format = DRM_FORMAT_RGBX1010102;
             break;
         case HAL_PIXEL_FORMAT_YCbCr_420_SP:
             *drm_format = DRM_FORMAT_NV12;
@@ -1291,6 +1312,11 @@
             *drm_format = DRM_FORMAT_NV12;
             *drm_format_modifier = DRM_FORMAT_MOD_QCOM_DX;
             break;
+        case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+            *drm_format = DRM_FORMAT_NV12;
+            *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED |
+               DRM_FORMAT_MOD_QCOM_DX;
+            break;
         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
             *drm_format = DRM_FORMAT_NV12;
             *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED |
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 6f42ac2..82fdcdb 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -121,6 +121,7 @@
 #define HAL_PIXEL_FORMAT_CbYCrY_422_I            0x120
 #define HAL_PIXEL_FORMAT_BGR_888                 0x121
 #define HAL_PIXEL_FORMAT_RAW8                    0x123
+#define HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC     0x124
 
 #define HAL_PIXEL_FORMAT_INTERLACE               0x180
 
diff --git a/libgralloc1/gr_adreno_info.cpp b/libgralloc1/gr_adreno_info.cpp
index 0692ca6..f8b1af6 100644
--- a/libgralloc1/gr_adreno_info.cpp
+++ b/libgralloc1/gr_adreno_info.cpp
@@ -177,6 +177,11 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
       return ADRENO_PIXELFORMAT_NV12_EXT;
+    case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
+      return ADRENO_PIXELFORMAT_TP10;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      return ADRENO_PIXELFORMAT_P010;
     default:
       ALOGE("%s: No map for format: 0x%x", __FUNCTION__, hal_format);
       break;
diff --git a/libgralloc1/gr_adreno_info.h b/libgralloc1/gr_adreno_info.h
index 7ad6801..5a3b531 100644
--- a/libgralloc1/gr_adreno_info.h
+++ b/libgralloc1/gr_adreno_info.h
@@ -45,6 +45,7 @@
   ADRENO_PIXELFORMAT_B8G8R8A8_SRGB = 91,
   ADRENO_PIXELFORMAT_B8G8R8X8_SRGB = 93,
   ADRENO_PIXELFORMAT_NV12 = 103,
+  ADRENO_PIXELFORMAT_P010 = 104,
   ADRENO_PIXELFORMAT_YUY2 = 107,
   ADRENO_PIXELFORMAT_B4G4R4A4 = 115,
   ADRENO_PIXELFORMAT_NV12_EXT = 506,       // NV12 with non-std alignment and offsets
@@ -60,6 +61,7 @@
   ADRENO_PIXELFORMAT_NV21 = 619,
   ADRENO_PIXELFORMAT_Y8U8V8A8 = 620,  // YUV 4:4:4 packed (1 plane)
   ADRENO_PIXELFORMAT_Y8 = 625,        //  Single 8-bit luma only channel YUV format
+  ADRENO_PIXELFORMAT_TP10 = 654,      // YUV 4:2:0 planar 10 bits/comp (2 planes)
 } ADRENOPIXELFORMAT;
 
 class AdrenoMemInfo {
diff --git a/libgralloc1/gr_allocator.cpp b/libgralloc1/gr_allocator.cpp
index 4da3dfd..ddcf41d 100644
--- a/libgralloc1/gr_allocator.cpp
+++ b/libgralloc1/gr_allocator.cpp
@@ -69,6 +69,10 @@
 #define ION_SC_PREVIEW_FLAGS ION_SECURE
 #endif
 
+#ifndef COLOR_FMT_P010_UBWC
+#define COLOR_FMT_P010_UBWC 9
+#endif
+
 using std::vector;
 using std::shared_ptr;
 
@@ -406,6 +410,11 @@
       ycbcr->chroma_step = 3;
       break;
 
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      GetYuvUbwcSPPlaneInfo(hnd->base, width, height, COLOR_FMT_P010_UBWC, ycbcr);
+      ycbcr->chroma_step = 4;
+      break;
+
     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
     case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
@@ -485,6 +494,7 @@
   switch (format) {
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
       return true;
     default:
       return false;
@@ -629,6 +639,11 @@
       *aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width) * 3) / 4;
       *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height);
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      // The macro returns the stride which is 2 times the width, hence / 2
+      *aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_P010_UBWC, width) / 2);
+      *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_P010_UBWC, height);
+      break;
     default:
       ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
       *aligned_w = 0;
@@ -706,6 +721,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
       size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_BPP10_UBWC, width, height);
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      size = VENUS_BUFFER_SIZE(COLOR_FMT_P010_UBWC, width, height);
+      break;
     default:
       ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
       break;
diff --git a/libgralloc1/gralloc_priv.h b/libgralloc1/gralloc_priv.h
index b558975..ea2d57c 100644
--- a/libgralloc1/gralloc_priv.h
+++ b/libgralloc1/gralloc_priv.h
@@ -127,6 +127,7 @@
 #define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C
 #define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D
 #define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F
+#define HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC 0x124
 
 #define HAL_PIXEL_FORMAT_INTERLACE 0x180
 
diff --git a/sdm/include/core/layer_buffer.h b/sdm/include/core/layer_buffer.h
index 636982c..9029c12 100644
--- a/sdm/include/core/layer_buffer.h
+++ b/sdm/include/core/layer_buffer.h
@@ -141,6 +141,8 @@
 
   kFormatYCbCr420TP10Ubwc,            //!< UBWC aligned YCbCr420TP10 format.
 
+  kFormatYCbCr420P010Ubwc,            //!< UBWC aligned YCbCr420P010 format.
+
   /* All YUV-Packed formats, Any new format will be added towards end of this group to maintain
      backward compatibility.
   */
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 8a79ee8..cbd585b 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -399,6 +399,8 @@
     case SDE_PIX_FMT_RGBX_1010102_UBWC: *sdm_format = kFormatRGBX1010102Ubwc;          break;
     case SDE_PIX_FMT_Y_CBCR_H2V2_P010:  *sdm_format = kFormatYCbCr420P010;             break;
     case SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC: *sdm_format = kFormatYCbCr420TP10Ubwc;     break;
+    /* TODO(user) : enable when defined in uapi
+      case SDE_PIX_FMT_Y_CBCR_H2V2_P010_UBWC: *sdm_format = kFormatYCbCr420P010Ubwc;     break; */
     default: *sdm_format = kFormatInvalid;
   }
 }
@@ -494,64 +496,64 @@
                              vector<LayerBufferFormat> *sdm_formats) {
   vector<LayerBufferFormat> &fmts(*sdm_formats);
   switch (drm_format) {
-    case DRM_FORMAT_ARGB8888:
+    case DRM_FORMAT_BGRA8888:
       fmts.push_back(kFormatARGB8888);
       break;
-    case DRM_FORMAT_RGBA8888:
+    case DRM_FORMAT_ABGR8888:
       fmts.push_back(drm_format_modifier ? kFormatRGBA8888Ubwc : kFormatRGBA8888);
       break;
-    case DRM_FORMAT_BGRA8888:
+    case DRM_FORMAT_ARGB8888:
       fmts.push_back(kFormatBGRA8888);
       break;
-    case DRM_FORMAT_XRGB8888:
+    case DRM_FORMAT_BGRX8888:
       fmts.push_back(kFormatXRGB8888);
       break;
-    case DRM_FORMAT_RGBX8888:
+    case DRM_FORMAT_XBGR8888:
       fmts.push_back(drm_format_modifier ? kFormatRGBX8888Ubwc : kFormatRGBX8888);
       break;
-    case DRM_FORMAT_BGRX8888:
+    case DRM_FORMAT_XRGB8888:
       fmts.push_back(kFormatBGRX8888);
       break;
-    case DRM_FORMAT_RGBA5551:
+    case DRM_FORMAT_ABGR1555:
       fmts.push_back(kFormatRGBA5551);
       break;
-    case DRM_FORMAT_RGBA4444:
+    case DRM_FORMAT_ABGR4444:
       fmts.push_back(kFormatRGBA4444);
       break;
-    case DRM_FORMAT_RGB888:
+    case DRM_FORMAT_BGR888:
       fmts.push_back(kFormatRGB888);
       break;
-    case DRM_FORMAT_BGR888:
+    case DRM_FORMAT_RGB888:
       fmts.push_back(kFormatBGR888);
       break;
-    case DRM_FORMAT_RGB565:
-      fmts.push_back(drm_format_modifier ? kFormatBGR565Ubwc : kFormatBGR565);
-      break;
     case DRM_FORMAT_BGR565:
+      fmts.push_back(drm_format_modifier ? kFormatBGR565Ubwc : kFormatRGB565);
+      break;
+    case DRM_FORMAT_RGB565:
       fmts.push_back(kFormatBGR565);
       break;
-    case DRM_FORMAT_RGBA1010102:
+    case DRM_FORMAT_ABGR2101010:
       fmts.push_back(drm_format_modifier ? kFormatRGBA1010102Ubwc : kFormatRGBA1010102);
       break;
-    case DRM_FORMAT_ARGB2101010:
+    case DRM_FORMAT_BGRA1010102:
       fmts.push_back(kFormatARGB2101010);
       break;
-    case DRM_FORMAT_RGBX1010102:
+    case DRM_FORMAT_XBGR2101010:
       fmts.push_back(drm_format_modifier ? kFormatRGBX1010102Ubwc : kFormatRGBX1010102);
       break;
-    case DRM_FORMAT_XRGB2101010:
+    case DRM_FORMAT_BGRX1010102:
       fmts.push_back(kFormatXRGB2101010);
       break;
-    case DRM_FORMAT_BGRA1010102:
+    case DRM_FORMAT_ARGB2101010:
       fmts.push_back(kFormatBGRA1010102);
       break;
-    case DRM_FORMAT_ABGR2101010:
+    case DRM_FORMAT_RGBA1010102:
       fmts.push_back(kFormatABGR2101010);
       break;
-    case DRM_FORMAT_BGRX1010102:
+    case DRM_FORMAT_XRGB2101010:
       fmts.push_back(kFormatBGRX1010102);
       break;
-    case DRM_FORMAT_XBGR2101010:
+    case DRM_FORMAT_RGBX1010102:
       fmts.push_back(kFormatXBGR2101010);
       break;
     case DRM_FORMAT_YVU420:
@@ -561,6 +563,9 @@
       if (drm_format_modifier == (DRM_FORMAT_MOD_QCOM_COMPRESSED |
           DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_TIGHT)) {
           fmts.push_back(kFormatYCbCr420TP10Ubwc);
+      } else if (drm_format_modifier == (DRM_FORMAT_MOD_QCOM_COMPRESSED |
+                                         DRM_FORMAT_MOD_QCOM_DX)) {
+        fmts.push_back(kFormatYCbCr420P010Ubwc);
       } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED) {
          fmts.push_back(kFormatYCbCr420SPVenusUbwc);
       } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_DX) {
@@ -569,9 +574,6 @@
          fmts.push_back(kFormatYCbCr420SemiPlanarVenus);
          fmts.push_back(kFormatYCbCr420SemiPlanar);
       }
-      // TODO(user):
-      // else if (drm_format_modifier == (DRM_FORMAT_MOD_QCOM_COMPRESSED | DRM_FORMAT_MOD_QCOM_DX))
-      //   fmts.push_back(kFormatYCbCr420P010Ubwc);
       break;
     case DRM_FORMAT_NV21:
       fmts.push_back(kFormatYCrCb420SemiPlanarVenus);
diff --git a/sdm/libs/hwc/hwc_buffer_allocator.cpp b/sdm/libs/hwc/hwc_buffer_allocator.cpp
index 8e5c5bd..80d72f7 100644
--- a/sdm/libs/hwc/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc/hwc_buffer_allocator.cpp
@@ -300,6 +300,10 @@
     *target = HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC;
     *flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
     break;
+  case kFormatYCbCr420P010Ubwc:
+    *target = HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC;
+    *flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
+    break;
   case kFormatRGBA8888Ubwc:
     *target = HAL_PIXEL_FORMAT_RGBA_8888;
     *flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index 9484b35..5940faf 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -990,6 +990,7 @@
     case HAL_PIXEL_FORMAT_RGBA_1010102:        format = kFormatRGBA1010102Ubwc;         break;
     case HAL_PIXEL_FORMAT_RGBX_1010102:        format = kFormatRGBX1010102Ubwc;         break;
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: format = kFormatYCbCr420TP10Ubwc;        break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC: format = kFormatYCbCr420P010Ubwc;        break;
     default:
       DLOGE("Unsupported format type for UBWC %d", source);
       return kFormatInvalid;
@@ -1027,6 +1028,7 @@
   case HAL_PIXEL_FORMAT_XBGR_2101010:             format = kFormatXBGR2101010;              break;
   case HAL_PIXEL_FORMAT_YCbCr_420_P010:           format = kFormatYCbCr420P010;             break;
   case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:      format = kFormatYCbCr420TP10Ubwc;         break;
+  case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:      format = kFormatYCbCr420P010Ubwc;         break;
   default:
     DLOGW("Unsupported format type = %d", source);
     return kFormatInvalid;
diff --git a/sdm/libs/hwc2/hwc_buffer_allocator.cpp b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
index 29963a6..3cfaf0a 100644
--- a/sdm/libs/hwc2/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
@@ -246,6 +246,9 @@
     case kFormatYCbCr420TP10Ubwc:
       *target = HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC;
       break;
+    case kFormatYCbCr420P010Ubwc:
+      *target = HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC;
+      break;
     case kFormatRGBA8888Ubwc:
       *target = HAL_PIXEL_FORMAT_RGBA_8888;
       *flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 2de1e8e..0aaad8e 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -1016,6 +1016,9 @@
       case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
         format = kFormatYCbCr420TP10Ubwc;
         break;
+      case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+        format = kFormatYCbCr420P010Ubwc;
+        break;
       default:
         DLOGE("Unsupported format type for UBWC %d", source);
         return kFormatInvalid;
@@ -1106,6 +1109,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
       format = kFormatYCbCr420TP10Ubwc;
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      format = kFormatYCbCr420P010Ubwc;
+      break;
     default:
       DLOGW("Unsupported format type = %d", source);
       return kFormatInvalid;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 91fb04b..302e339 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -365,6 +365,9 @@
       case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
         format = kFormatYCbCr420TP10Ubwc;
         break;
+      case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+        format = kFormatYCbCr420P010Ubwc;
+        break;
       default:
         DLOGE("Unsupported format type for UBWC %d", source);
         return kFormatInvalid;
@@ -455,6 +458,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
       format = kFormatYCbCr420TP10Ubwc;
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+      format = kFormatYCbCr420P010Ubwc;
+      break;
     default:
       DLOGW("Unsupported format type = %d", source);
       return kFormatInvalid;
diff --git a/sdm/libs/utils/formats.cpp b/sdm/libs/utils/formats.cpp
index 43abb63..b7deb18 100644
--- a/sdm/libs/utils/formats.cpp
+++ b/sdm/libs/utils/formats.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -42,6 +42,7 @@
   case kFormatRGBA1010102Ubwc:
   case kFormatRGBX1010102Ubwc:
   case kFormatYCbCr420TP10Ubwc:
+  case kFormatYCbCr420P010Ubwc:
     return true;
   default:
     return false;
@@ -62,6 +63,7 @@
   case kFormatRGBX1010102Ubwc:
   case kFormatYCbCr420P010:
   case kFormatYCbCr420TP10Ubwc:
+  case kFormatYCbCr420P010Ubwc:
     return true;
   default:
     return false;
@@ -111,6 +113,7 @@
   case kFormatRGBX1010102Ubwc:          return "RGBX_1010102_UBWC";
   case kFormatYCbCr420P010:             return "Y_CBCR_420_P010";
   case kFormatYCbCr420TP10Ubwc:         return "Y_CBCR_420_TP10_UBWC";
+  case kFormatYCbCr420P010Ubwc:         return "Y_CBCR_420_P010_UBWC";
   default:                              return "UNKNOWN";
   }
 }