display-hal: Add support for P010 ubwc format

This patch adds support for handling P010 ubwc format in display-hal
libs.

Change-Id: I1c7489be859a608566240c3b6722c84bb9a468ca
CRs-fixed: 2018756
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..3c347f5 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;
@@ -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