sdm: Add support for P010 Venus format

Add support for P010 Venus video format in SDM. Handle Qualcomm Venus
h/w video decoder aligned P010 buffer format.

Change-Id: I3edf21a5c3d90556c69c9944558398b65e4ed1e5
CRs-Fixed: 2149780
diff --git a/libgralloc1/gr_adreno_info.cpp b/libgralloc1/gr_adreno_info.cpp
index 1ac99be..8d83627 100644
--- a/libgralloc1/gr_adreno_info.cpp
+++ b/libgralloc1/gr_adreno_info.cpp
@@ -205,6 +205,7 @@
       return ADRENO_PIXELFORMAT_TP10;
     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
       return ADRENO_PIXELFORMAT_P010;
     case HAL_PIXEL_FORMAT_RGBA_1010102:
        return ADRENO_PIXELFORMAT_R10G10B10A2_UNORM;
diff --git a/libgralloc1/gr_buf_mgr.cpp b/libgralloc1/gr_buf_mgr.cpp
index cd89d41..8aeee40 100644
--- a/libgralloc1/gr_buf_mgr.cpp
+++ b/libgralloc1/gr_buf_mgr.cpp
@@ -835,6 +835,7 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
       return true;
     default:
       return false;
diff --git a/libgralloc1/gr_utils.cpp b/libgralloc1/gr_utils.cpp
index a7e8c91..6af5df6 100644
--- a/libgralloc1/gr_utils.cpp
+++ b/libgralloc1/gr_utils.cpp
@@ -240,6 +240,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
       size = ALIGN((alignedw * alignedh * 2) + (alignedw * alignedh) + 1, SIZE_4K);
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+      size = VENUS_BUFFER_SIZE(COLOR_FMT_P010, width, height);
+      break;
     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
     case HAL_PIXEL_FORMAT_YCbCr_422_I:
@@ -399,10 +402,6 @@
       GetYuvSPPlaneInfo(hnd->base, width, height, 1, ycbcr);
       break;
 
-    case HAL_PIXEL_FORMAT_YCbCr_420_P010:
-      GetYuvSPPlaneInfo(hnd->base, width, height, 2, ycbcr);
-      break;
-
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
       if (!interlaced) {
         GetYuvUbwcSPPlaneInfo(hnd->base, width, height, COLOR_FMT_NV12_UBWC, ycbcr);
@@ -412,6 +411,10 @@
       ycbcr->chroma_step = 2;
       break;
 
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010:
+      GetYuvSPPlaneInfo(hnd->base, width, height, 2, ycbcr);
+      break;
+
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
       GetYuvUbwcSPPlaneInfo(hnd->base, width, height, COLOR_FMT_NV12_BPP10_UBWC, ycbcr);
       ycbcr->chroma_step = 3;
@@ -422,6 +425,19 @@
       ycbcr->chroma_step = 4;
       break;
 
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+      ystride = VENUS_Y_STRIDE(COLOR_FMT_P010, width);
+      cstride = VENUS_UV_STRIDE(COLOR_FMT_P010, width);
+      ycbcr->y = reinterpret_cast<void *>(hnd->base);
+      ycbcr->cb = reinterpret_cast<void *>(hnd->base +
+                                           ystride * VENUS_Y_SCANLINES(COLOR_FMT_P010, height));
+      ycbcr->cr = reinterpret_cast<void *>(hnd->base +
+                                           ystride * VENUS_Y_SCANLINES(COLOR_FMT_P010, height) + 1);
+      ycbcr->ystride = ystride;
+      ycbcr->cstride = cstride;
+      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:
@@ -743,6 +759,10 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
       aligned_w = ALIGN(width, 16);
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+      aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_P010, width) / 2);
+      aligned_h = INT(VENUS_Y_SCANLINES(COLOR_FMT_P010, height));
+      break;
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
     case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
       aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_NV12, width));
@@ -829,6 +849,7 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
       offset[1] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
       break;
     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
diff --git a/libgralloc1/gralloc_priv.h b/libgralloc1/gralloc_priv.h
index ef1bbc3..db0afd2 100644
--- a/libgralloc1/gralloc_priv.h
+++ b/libgralloc1/gralloc_priv.h
@@ -131,6 +131,7 @@
 #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_YCbCr_420_P010_VENUS 0x7FA30C0A
 
 #define HAL_PIXEL_FORMAT_CbYCrY_422_I            0x120
 #define HAL_PIXEL_FORMAT_BGR_888                 0x121
diff --git a/libqdutils/qd_utils.cpp b/libqdutils/qd_utils.cpp
index c55354d..25555bf 100644
--- a/libqdutils/qd_utils.cpp
+++ b/libqdutils/qd_utils.cpp
@@ -355,6 +355,8 @@
     return "YCbCr_420_P010";
   case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
     return "YCbCr_420_TP10_UBWC";
+  case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+    return "YCbCr_420_P010_VENUS";
   default:
     return "Unknown_format";
   }
diff --git a/sdm/include/core/layer_buffer.h b/sdm/include/core/layer_buffer.h
index c0e3305..649dda4 100644
--- a/sdm/include/core/layer_buffer.h
+++ b/sdm/include/core/layer_buffer.h
@@ -148,6 +148,8 @@
 
   kFormatYCbCr420P010Ubwc,            //!< UBWC aligned YCbCr420P010 format.
 
+  kFormatYCbCr420P010Venus,           //!< Venus 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_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index e129a7d..c2beb7a 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -192,6 +192,7 @@
       *drm_format = DRM_FORMAT_NV21;
       break;
     case kFormatYCbCr420P010:
+    case kFormatYCbCr420P010Venus:
       *drm_format = DRM_FORMAT_NV12;
       *drm_format_modifier = DRM_FORMAT_MOD_QCOM_DX;
       break;
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 55bc003..1f31727 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -491,8 +491,9 @@
     case SDE_PIX_FMT_RGBA_1010102_UBWC: *sdm_format = kFormatRGBA1010102Ubwc;          break;
     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;
-    case SDE_PIX_FMT_Y_CBCR_H2V2_P010_UBWC: *sdm_format = kFormatYCbCr420P010Ubwc;     break;
+    case SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC:  *sdm_format = kFormatYCbCr420TP10Ubwc;     break;
+    case SDE_PIX_FMT_Y_CBCR_H2V2_P010_UBWC:  *sdm_format = kFormatYCbCr420P010Ubwc;     break;
+    case SDE_PIX_FMT_Y_CBCR_H2V2_P010_VENUS: *sdm_format = kFormatYCbCr420P010Venus;    break;
     default: *sdm_format = kFormatInvalid;
   }
 }
@@ -661,7 +662,8 @@
       } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED) {
          fmts.push_back(kFormatYCbCr420SPVenusUbwc);
       } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_DX) {
-         fmts.push_back(kFormatYCbCr420P010);
+        fmts.push_back(kFormatYCbCr420P010);
+        fmts.push_back(kFormatYCbCr420P010Venus);
       } else {
          fmts.push_back(kFormatYCbCr420SemiPlanarVenus);
          fmts.push_back(kFormatYCbCr420SemiPlanar);
diff --git a/sdm/libs/hwc2/hwc_buffer_allocator.cpp b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
index e41a267..e9839b9 100644
--- a/sdm/libs/hwc2/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
@@ -337,6 +337,9 @@
       *target = HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC;
       *flags |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
       break;
+    case kFormatYCbCr420P010Venus:
+      *target = HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS;
+      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 a89147c..c846771 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -1458,6 +1458,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
       format = kFormatYCbCr420P010Ubwc;
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+      format = kFormatYCbCr420P010Venus;
+      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 2466413..d8b16c1 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -659,6 +659,9 @@
     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
       format = kFormatYCbCr420P010Ubwc;
       break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
+      format = kFormatYCbCr420P010Venus;
+      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 4b7190b..42dfea9 100644
--- a/sdm/libs/utils/formats.cpp
+++ b/sdm/libs/utils/formats.cpp
@@ -64,6 +64,7 @@
   case kFormatYCbCr420P010:
   case kFormatYCbCr420TP10Ubwc:
   case kFormatYCbCr420P010Ubwc:
+  case kFormatYCbCr420P010Venus:
     return true;
   default:
     return false;
@@ -114,6 +115,7 @@
   case kFormatYCbCr420P010:             return "Y_CBCR_420_P010";
   case kFormatYCbCr420TP10Ubwc:         return "Y_CBCR_420_TP10_UBWC";
   case kFormatYCbCr420P010Ubwc:         return "Y_CBCR_420_P010_UBWC";
+  case kFormatYCbCr420P010Venus:        return "Y_CBCR_420_P010_VENUS";
   default:                              return "UNKNOWN";
   }
 }
@@ -153,6 +155,7 @@
     case kFormatBGR888:
     case kFormatYCbCr420P010:
     case kFormatYCbCr420P010Ubwc:
+    case kFormatYCbCr420P010Venus:
       return 3.0f;
     case kFormatRGB565:
     case kFormatBGR565: