Merge "display: Enhance debug logging"
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 6bf7f97..01981ca 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -304,6 +304,12 @@
* uint32_t - CRTC ID
*/
CONNECTOR_SET_CRTC,
+ /*
+ * Op: Sets connector hdr metadata
+ * Arg: uint32_t - Connector ID
+ * drm_msm_ext_hdr_metadata - hdr_metadata
+ */
+ CONNECTOR_SET_HDR_METADATA,
};
enum struct DRMRotation {
@@ -370,6 +376,7 @@
/* Per CRTC Resource Info*/
struct DRMCrtcInfo {
bool has_src_split;
+ bool has_hdr;
uint32_t max_blend_stages;
uint32_t max_solidfill_stages;
QSEEDVersion qseed_version;
@@ -394,6 +401,7 @@
uint32_t max_dest_scaler_input_width = 0;
uint32_t max_dest_scaler_output_width = 0;
uint32_t max_dest_scale_up = 1;
+ uint32_t min_prefill_lines = 0;
};
enum struct DRMPlaneType {
@@ -476,6 +484,7 @@
DRMRotation panel_orientation;
drm_panel_hdr_properties panel_hdr_prop;
uint32_t transfer_time_us;
+ drm_msm_ext_hdr_properties ext_hdr_prop;
};
/* Identifier token for a display */
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_allocator.cpp b/libgralloc1/gr_allocator.cpp
index 175603e..066ac34 100644
--- a/libgralloc1/gr_allocator.cpp
+++ b/libgralloc1/gr_allocator.cpp
@@ -194,11 +194,18 @@
if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED ||
format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_ALLOC_UBWC) {
+ // Use of 10BIT_TP and 10BIT bits is supposed to be mutually exclusive.
+ // Each bit maps to only one format. Here we will check one of the bits
+ // and ignore the other.
if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT_TP) {
gr_format = HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC;
+ } else if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT) {
+ gr_format = HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC;
} else {
gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
}
+ } else if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT) {
+ gr_format = HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS;
} else if (cons_usage & GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER) {
gr_format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE; // NV12
} else if (cons_usage & GRALLOC1_CONSUMER_USAGE_CAMERA) {
@@ -289,10 +296,6 @@
heap_id |= ION_HEAP(ION_SYSTEM_HEAP_ID);
}
- if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_CAMERA_HEAP) {
- heap_id |= ION_HEAP(ION_CAMERA_HEAP_ID);
- }
-
if (prod_usage & GRALLOC1_PRODUCER_USAGE_PRIVATE_ADSP_HEAP ||
prod_usage & GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA) {
heap_id |= ION_HEAP(ION_ADSP_HEAP_ID);
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..a7ed5a8 100644
--- a/libgralloc1/gralloc_priv.h
+++ b/libgralloc1/gralloc_priv.h
@@ -39,8 +39,8 @@
* cannot be used with noncontiguous heaps */
#define GRALLOC1_PRODUCER_USAGE_PRIVATE_UNCACHED GRALLOC1_PRODUCER_USAGE_PRIVATE_1
-/* CAMERA heap is a carveout heap for camera, is not secured */
-#define GRALLOC1_PRODUCER_USAGE_PRIVATE_CAMERA_HEAP GRALLOC1_PRODUCER_USAGE_PRIVATE_2
+/* This flag is used to indicate P010 format */
+#define GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT GRALLOC1_PRODUCER_USAGE_PRIVATE_2
/* ADSP heap is a carveout heap, is not secured */
#define GRALLOC1_PRODUCER_USAGE_PRIVATE_ADSP_HEAP GRALLOC1_PRODUCER_USAGE_PRIVATE_3
@@ -68,6 +68,9 @@
/* This flag is used for SECURE display usecase */
#define GRALLOC1_CONSUMER_USAGE_PRIVATE_SECURE_DISPLAY 0x01000000
+/* This flag is used to indicate P010 format */
+#define GRALLOC1_CONSUMER_USAGE_PRIVATE_10BIT GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT
+
/* Unused flag */
#define GRALLOC1_USAGE_PRIVATE_UNUSED1 0x04000000
@@ -78,7 +81,6 @@
#define GRALLOC_USAGE_PRIVATE_UNCACHED GRALLOC1_PRODUCER_USAGE_PRIVATE_UNCACHED
#define GRALLOC_USAGE_PRIVATE_IOMMU_HEAP GRALLOC1_PRODUCER_USAGE_PRIVATE_IOMMU_HEAP
#define GRALLOC_USAGE_PRIVATE_WFD GRALLOC1_CONSUMER_USAGE_PRIVATE_WFD
-#define GRALLOC_USAGE_PRIVATE_CAMERA_HEAP GRALLOC1_PRODUCER_USAGE_PRIVATE_CAMERA_HEAP
#define GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY GRALLOC1_CONSUMER_USAGE_PRIVATE_SECURE_DISPLAY
#define GRALLOC_USAGE_PRIVATE_MM_HEAP 0x0
@@ -131,6 +133,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/display_interface.h b/sdm/include/core/display_interface.h
index 92efd9f..303c89b 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -153,6 +153,8 @@
bool secure = false; //!< If this display is capable of handling secure content.
bool is_cmdmode = false; //!< If panel is command mode panel.
bool hdr_supported = false; //!< if HDR is enabled
+ bool hdr_metadata_type_one = false; //!< Metadata type one obtained from HDR sink
+ uint32_t hdr_eotf = 0; //!< Electro optical transfer function
uint32_t max_luminance = 0; //!< From Panel's peak luminance
uint32_t average_luminance = 0; //!< From Panel's average luminance
uint32_t min_luminance = 0; //!< From Panel's blackness level
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/include/private/color_params.h b/sdm/include/private/color_params.h
index 6de858c..12e41fd 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -55,6 +55,7 @@
kDisableFrameCapture = BITMAP(7),
kConfigureDetailedEnhancer = BITMAP(8),
kInvalidatingAndkSetPanelBrightness = BITMAP(9),
+ kModeSet = BITMAP(10),
kGetDetailedEnhancerData = BITMAP(21),
kNoAction = BITMAP(31),
};
@@ -121,7 +122,7 @@
};
struct PPPendingParams {
- PendingAction action = kNoAction;
+ int32_t action = kNoAction;
void *params = NULL;
};
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 9f6a5d6..d2d4b0b 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -228,6 +228,7 @@
CompRatioMap comp_ratio_nrt_map;
uint32_t cache_size = 0; // cache size in bytes
HWQseedStepVersion pipe_qseed3_version = kQseed3v2; // only valid when has_qseed3=true
+ uint32_t min_prefill_lines = 0;
void Reset() { *this = HWResourceInfo(); }
};
@@ -292,6 +293,8 @@
uint32_t left_roi_count = 1; // Number if ROI supported on left panel
uint32_t right_roi_count = 1; // Number if ROI supported on right panel
bool hdr_enabled = false; // HDR feature supported
+ bool hdr_metadata_type_one = false; // Static HDR metadata type one
+ uint32_t hdr_eotf = 0; // Electro optical transfer function
uint32_t peak_luminance = 0; // Panel's peak luminance level
uint32_t average_luminance = 0; // Panel's average luminance level
uint32_t blackness_level = 0; // Panel's blackness level
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index f04c826..b07c8a6 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -404,6 +404,8 @@
fixed_info->max_luminance = fixed_info->hdr_supported ? hw_panel_info_.peak_luminance: 0;
fixed_info->average_luminance = fixed_info->hdr_supported ? hw_panel_info_.average_luminance : 0;
fixed_info->min_luminance = fixed_info->hdr_supported ? hw_panel_info_.blackness_level: 0;
+ fixed_info->hdr_eotf = hw_panel_info_.hdr_eotf;
+ fixed_info->hdr_metadata_type_one = hw_panel_info_.hdr_metadata_type_one;
return kErrorNone;
}
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_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index 16355c8..5b7576a 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -97,6 +97,7 @@
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
virtual void InitializeConfigs();
virtual DisplayError DumpDebugData() { return kErrorNone; }
+ virtual void PopulateHWPanelInfo();
enum {
kHWEventVSync,
@@ -113,7 +114,6 @@
DisplayError SetStride(HWDeviceType device_type, LayerBufferFormat format, uint32_t width,
uint32_t *target);
DisplayError PopulateDisplayAttributes(uint32_t index);
- void PopulateHWPanelInfo();
void GetHWDisplayPortAndMode();
void GetHWPanelMaxBrightness();
bool EnableHotPlugDetection(int enable);
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 9070ca3..269cc16 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -192,7 +192,6 @@
hw_resource->has_dyn_bw_support = false;
hw_resource->has_qseed3 = false;
hw_resource->has_concurrent_writeback = false;
- hw_resource->has_hdr = true;
hw_resource->hw_version = SDEVERSION(4, 0, 1);
// TODO(user): On FB driver hw_revision comprises of major version, minor version and hw_revision.
@@ -279,6 +278,7 @@
void HWInfoDRM::GetSystemInfo(HWResourceInfo *hw_resource) {
DRMCrtcInfo info;
drm_mgr_intf_->GetCrtcInfo(0 /* system_info */, &info);
+ hw_resource->has_hdr = info.has_hdr;
hw_resource->is_src_split = info.has_src_split;
hw_resource->has_qseed3 = (info.qseed_version == sde_drm::QSEEDVersion::V3);
hw_resource->num_blending_stages = info.max_blend_stages;
@@ -323,6 +323,7 @@
hw_resource->hw_dest_scalar_info.max_scale_up = info.max_dest_scale_up;
hw_resource->hw_dest_scalar_info.max_input_width = info.max_dest_scaler_input_width;
hw_resource->hw_dest_scalar_info.max_output_width = info.max_dest_scaler_output_width;
+ hw_resource->min_prefill_lines = info.min_prefill_lines;
}
void HWInfoDRM::GetHWPlanesInfo(HWResourceInfo *hw_resource) {
@@ -492,8 +493,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;
}
}
@@ -662,7 +664,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/core/drm/hw_tv_drm.cpp b/sdm/libs/core/drm/hw_tv_drm.cpp
index 565652e..f1d0d80 100644
--- a/sdm/libs/core/drm/hw_tv_drm.cpp
+++ b/sdm/libs/core/drm/hw_tv_drm.cpp
@@ -28,6 +28,7 @@
*/
#include "hw_tv_drm.h"
+#include <sys/time.h>
#include <utils/debug.h>
#include <utils/sys.h>
#include <utils/formats.h>
@@ -41,9 +42,19 @@
#include <map>
#include <utility>
+#ifndef HDR_EOTF_SMTPE_ST2084
+#define HDR_EOTF_SMTPE_ST2084 2
+#endif
+#ifndef HDR_EOTF_HLG
+#define HDR_EOTF_HLG 3
+#endif
#define __CLASS__ "HWTVDRM"
+#define HDR_DISABLE 0
+#define HDR_ENABLE 1
+#define MIN_HDR_RESET_WAITTIME 2
+
using drm_utils::DRMMaster;
using drm_utils::DRMResMgr;
using drm_utils::DRMLibLoader;
@@ -60,6 +71,23 @@
namespace sdm {
+static int32_t GetEOTF(const GammaTransfer &transfer) {
+ int32_t hdr_transfer = -1;
+
+ switch (transfer) {
+ case Transfer_SMPTE_ST2084:
+ hdr_transfer = HDR_EOTF_SMTPE_ST2084;
+ break;
+ case Transfer_HLG:
+ hdr_transfer = HDR_EOTF_HLG;
+ break;
+ default:
+ DLOGW("Unknown Transfer: %d", transfer);
+ }
+
+ return hdr_transfer;
+}
+
HWTVDRM::HWTVDRM(BufferSyncHandler *buffer_sync_handler, BufferAllocator *buffer_allocator,
HWInfoInterface *hw_info_intf)
: HWDeviceDRM(buffer_sync_handler, buffer_allocator, hw_info_intf) {
@@ -148,5 +176,119 @@
return kErrorNone;
}
+void HWTVDRM::PopulateHWPanelInfo() {
+ hw_panel_info_ = {};
+
+ HWDeviceDRM::PopulateHWPanelInfo();
+ hw_panel_info_.hdr_enabled = connector_info_.ext_hdr_prop.hdr_supported;
+ hw_panel_info_.hdr_metadata_type_one = connector_info_.ext_hdr_prop.hdr_metadata_type_one;
+ hw_panel_info_.hdr_eotf = connector_info_.ext_hdr_prop.hdr_eotf;
+ hw_panel_info_.peak_luminance = connector_info_.ext_hdr_prop.hdr_max_luminance;
+ hw_panel_info_.average_luminance = connector_info_.ext_hdr_prop.hdr_avg_luminance;
+ hw_panel_info_.blackness_level = connector_info_.ext_hdr_prop.hdr_min_luminance;
+ DLOGI("TV Panel: %s, type_one = %d, eotf = %d, luminance[max = %d, min = %d, avg = %d]",
+ hw_panel_info_.hdr_enabled ? "HDR" : "Non-HDR", hw_panel_info_.hdr_metadata_type_one,
+ hw_panel_info_.hdr_eotf, hw_panel_info_.peak_luminance, hw_panel_info_.blackness_level,
+ hw_panel_info_.average_luminance);
+}
+
+DisplayError HWTVDRM::Commit(HWLayers *hw_layers) {
+ DisplayError error = UpdateHDRMetaData(hw_layers);
+ if (error != kErrorNone) {
+ return error;
+ }
+ return HWDeviceDRM::Commit(hw_layers);
+}
+
+DisplayError HWTVDRM::UpdateHDRMetaData(HWLayers *hw_layers) {
+ static struct timeval hdr_reset_start, hdr_reset_end;
+ static bool reset_hdr_flag = false;
+ const HWHDRLayerInfo &hdr_layer_info = hw_layers->info.hdr_layer_info;
+ if (!hw_panel_info_.hdr_enabled) {
+ return kErrorNone;
+ }
+
+ DisplayError error = kErrorNone;
+
+ Layer hdr_layer = {};
+ if (hdr_layer_info.operation == HWHDRLayerInfo::kSet && hdr_layer_info.layer_index > -1) {
+ hdr_layer = *(hw_layers->info.stack->layers.at(UINT32(hdr_layer_info.layer_index)));
+ }
+
+ const LayerBuffer *layer_buffer = &hdr_layer.input_buffer;
+ const MasteringDisplay &mastering_display = layer_buffer->color_metadata.masteringDisplayInfo;
+ const ContentLightLevel &light_level = layer_buffer->color_metadata.contentLightLevel;
+ const Primaries &primaries = mastering_display.primaries;
+
+ if (hdr_layer_info.operation == HWHDRLayerInfo::kSet) {
+ // Reset reset_hdr_flag to handle where there are two consecutive HDR video playbacks with not
+ // enough non-HDR frames in between to reset the HDR metadata.
+ reset_hdr_flag = false;
+
+ int32_t eotf = GetEOTF(layer_buffer->color_metadata.transfer);
+ hdr_metadata_.hdr_supported = 1;
+ hdr_metadata_.hdr_state = HDR_ENABLE;
+ hdr_metadata_.eotf = (eotf < 0) ? 0 : UINT32(eotf);
+ hdr_metadata_.white_point_x = primaries.whitePoint[0];
+ hdr_metadata_.white_point_y = primaries.whitePoint[1];
+ hdr_metadata_.display_primaries_x[0] = primaries.rgbPrimaries[0][0];
+ hdr_metadata_.display_primaries_y[0] = primaries.rgbPrimaries[0][1];
+ hdr_metadata_.display_primaries_x[1] = primaries.rgbPrimaries[1][0];
+ hdr_metadata_.display_primaries_y[1] = primaries.rgbPrimaries[1][1];
+ hdr_metadata_.display_primaries_x[2] = primaries.rgbPrimaries[2][0];
+ hdr_metadata_.display_primaries_y[2] = primaries.rgbPrimaries[2][1];
+ hdr_metadata_.min_luminance = mastering_display.minDisplayLuminance;
+ hdr_metadata_.max_luminance = mastering_display.maxDisplayLuminance/10000;
+ hdr_metadata_.max_content_light_level = light_level.maxContentLightLevel;
+ hdr_metadata_.max_average_light_level = light_level.minPicAverageLightLevel;
+
+ drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_HDR_METADATA, token_.conn_id, &hdr_metadata_);
+ DumpHDRMetaData(hdr_layer_info.operation);
+ } else if (hdr_layer_info.operation == HWHDRLayerInfo::kReset) {
+ memset(&hdr_metadata_, 0, sizeof(hdr_metadata_));
+ hdr_metadata_.hdr_supported = 1;
+ hdr_metadata_.hdr_state = HDR_ENABLE;
+ reset_hdr_flag = true;
+ gettimeofday(&hdr_reset_start, NULL);
+
+ drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_HDR_METADATA, token_.conn_id, &hdr_metadata_);
+ DumpHDRMetaData(hdr_layer_info.operation);
+ } else if (hdr_layer_info.operation == HWHDRLayerInfo::kNoOp) {
+ // TODO(user): This case handles the state transition from HDR_ENABLED to HDR_DISABLED.
+ // As per HDMI spec requirement, we need to send zero metadata for atleast 2 sec after end of
+ // playback. This timer calculates the 2 sec window after playback stops to stop sending HDR
+ // metadata. This will be replaced with an idle timer implementation in the future.
+ if (reset_hdr_flag) {
+ gettimeofday(&hdr_reset_end, NULL);
+ float hdr_reset_time_start = ((hdr_reset_start.tv_sec*1000) + (hdr_reset_start.tv_usec/1000));
+ float hdr_reset_time_end = ((hdr_reset_end.tv_sec*1000) + (hdr_reset_end.tv_usec/1000));
+
+ if (((hdr_reset_time_end-hdr_reset_time_start)/1000) >= MIN_HDR_RESET_WAITTIME) {
+ memset(&hdr_metadata_, 0, sizeof(hdr_metadata_));
+ hdr_metadata_.hdr_supported = 1;
+ hdr_metadata_.hdr_state = HDR_DISABLE;
+ reset_hdr_flag = false;
+
+ drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_HDR_METADATA, token_.conn_id,
+ &hdr_metadata_);
+ }
+ }
+ }
+
+ return error;
+}
+
+void HWTVDRM::DumpHDRMetaData(HWHDRLayerInfo::HDROperation operation) {
+ DLOGI("Operation = %d, HDR Metadata: MaxDisplayLuminance = %d MinDisplayLuminance = %d\n"
+ "MaxContentLightLevel = %d MaxAverageLightLevel = %d Red_x = %d Red_y = %d Green_x = %d\n"
+ "Green_y = %d Blue_x = %d Blue_y = %d WhitePoint_x = %d WhitePoint_y = %d EOTF = %d\n",
+ operation, hdr_metadata_.max_luminance, hdr_metadata_.min_luminance,
+ hdr_metadata_.max_content_light_level, hdr_metadata_.max_average_light_level,
+ hdr_metadata_.display_primaries_x[0], hdr_metadata_.display_primaries_y[0],
+ hdr_metadata_.display_primaries_x[1], hdr_metadata_.display_primaries_y[1],
+ hdr_metadata_.display_primaries_x[2], hdr_metadata_.display_primaries_y[2],
+ hdr_metadata_.white_point_x, hdr_metadata_.white_point_y, hdr_metadata_.eotf);
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/drm/hw_tv_drm.h b/sdm/libs/core/drm/hw_tv_drm.h
index 54ce327..5661bc2 100644
--- a/sdm/libs/core/drm/hw_tv_drm.h
+++ b/sdm/libs/core/drm/hw_tv_drm.h
@@ -46,10 +46,16 @@
virtual DisplayError Doze();
virtual DisplayError DozeSuspend();
virtual DisplayError Standby();
+ virtual DisplayError Commit(HWLayers *hw_layers);
+ virtual void PopulateHWPanelInfo();
private:
+ DisplayError UpdateHDRMetaData(HWLayers *hw_layers);
+ void DumpHDRMetaData(HWHDRLayerInfo::HDROperation operation);
+
static const int kBitRGB = 20;
static const int kBitYUV = 21;
+ drm_msm_ext_hdr_metadata hdr_metadata_ = {};
};
} // namespace sdm
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 51b485e..7829fcd 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -133,6 +133,16 @@
return HWC2::Error::None;
}
+HWC2::Error HWCColorMode::RestoreColorTransform() {
+ DisplayError error = display_intf_->SetColorTransform(kColorTransformMatrixCount, color_matrix_);
+ if (error != kErrorNone) {
+ DLOGE("Failed to set Color Transform");
+ return HWC2::Error::BadParameter;
+ }
+
+ return HWC2::Error::None;
+}
+
HWC2::Error HWCColorMode::SetColorTransform(const float *matrix, android_color_transform_t hint) {
DTRACE_SCOPED();
double color_matrix[kColorTransformMatrixCount] = {0};
@@ -468,6 +478,9 @@
bool secure_display_active = false;
layer_stack_.flags.animating = animating_;
+ uint32_t color_mode_count = 0;
+ display_intf_->GetColorModeCount(&color_mode_count);
+
// Add one layer for fb target
// TODO(user): Add blit target layers
for (auto hwc_layer : layer_set_) {
@@ -540,7 +553,7 @@
bool hdr_layer = layer->input_buffer.color_metadata.colorPrimaries == ColorPrimaries_BT2020 &&
(layer->input_buffer.color_metadata.transfer == Transfer_SMPTE_ST2084 ||
layer->input_buffer.color_metadata.transfer == Transfer_HLG);
- if (hdr_layer && !disable_hdr_handling_) {
+ if (hdr_layer && !disable_hdr_handling_ && color_mode_count) {
// dont honor HDR when its handling is disabled
layer->input_buffer.flags.hdr = true;
layer_stack_.flags.hdr_present = true;
@@ -549,8 +562,11 @@
// TODO(user): Move to a getter if this is needed at other places
hwc_rect_t scaled_display_frame = {INT(layer->dst_rect.left), INT(layer->dst_rect.top),
INT(layer->dst_rect.right), INT(layer->dst_rect.bottom)};
- ApplyScanAdjustment(&scaled_display_frame);
+ if (hwc_layer->GetGeometryChanges() & kDisplayFrame) {
+ ApplyScanAdjustment(&scaled_display_frame);
+ }
hwc_layer->SetLayerDisplayFrame(scaled_display_frame);
+ hwc_layer->ResetPerFrameData();
// SDM requires these details even for solid fill
if (layer->flags.solid_fill) {
LayerBuffer *layer_buffer = &layer->input_buffer;
@@ -1464,6 +1480,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;
@@ -1628,10 +1647,13 @@
// Create rects to represent the new source and destination crops
LayerRect crop = LayerRect(0, 0, FLOAT(x_pixels), FLOAT(y_pixels));
- LayerRect dst = LayerRect(0, 0, FLOAT(fb_config.x_pixels), FLOAT(fb_config.y_pixels));
+ hwc_rect_t scaled_display_frame = {0, 0, INT(x_pixels), INT(y_pixels)};
+ ApplyScanAdjustment(&scaled_display_frame);
+ client_target_->SetLayerDisplayFrame(scaled_display_frame);
+ client_target_->ResetPerFrameData();
+
auto client_target_layer = client_target_->GetSDMLayer();
client_target_layer->src_rect = crop;
- client_target_layer->dst_rect = dst;
int aligned_width;
int aligned_height;
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index c775bc7..263b69f 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -63,6 +63,7 @@
HWC2::Error SetColorMode(android_color_mode_t mode);
HWC2::Error SetColorModeById(int32_t color_mode_id);
HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint);
+ HWC2::Error RestoreColorTransform();
private:
static const uint32_t kColorTransformMatrixCount = 16;
@@ -176,6 +177,9 @@
virtual HWC2::Error SetColorModeById(int32_t color_mode_id) {
return HWC2::Error::Unsupported;
}
+ virtual HWC2::Error RestoreColorTransform() {
+ return HWC2::Error::Unsupported;
+ }
virtual HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint) {
return HWC2::Error::Unsupported;
}
@@ -212,6 +216,7 @@
float* out_min_luminance);
virtual HWC2::Error SetDisplayAnimating(bool animating) {
animating_ = animating;
+ validated_ = false;
return HWC2::Error::None;
}
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index d728afa..ee6f03e 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -153,8 +153,10 @@
boot_animation_completed_ = true;
// Applying default mode after bootanimation is finished And
// If Data is Encrypted, it is ready for access.
- if (display_intf_)
+ if (display_intf_) {
display_intf_->ApplyDefaultDisplayMode();
+ RestoreColorTransform();
+ }
}
}
@@ -273,6 +275,18 @@
return status;
}
+HWC2::Error HWCDisplayPrimary::RestoreColorTransform() {
+ auto status = color_mode_->RestoreColorTransform();
+ if (status != HWC2::Error::None) {
+ DLOGE("failed to RestoreColorTransform");
+ return status;
+ }
+
+ callbacks_->Refresh(HWC_DISPLAY_PRIMARY);
+
+ return status;
+}
+
HWC2::Error HWCDisplayPrimary::SetColorTransform(const float *matrix,
android_color_transform_t hint) {
if (!matrix) {
diff --git a/sdm/libs/hwc2/hwc_display_primary.h b/sdm/libs/hwc2/hwc_display_primary.h
index daf832d..c1e23ed 100644
--- a/sdm/libs/hwc2/hwc_display_primary.h
+++ b/sdm/libs/hwc2/hwc_display_primary.h
@@ -59,6 +59,7 @@
virtual HWC2::Error SetColorMode(android_color_mode_t mode);
virtual HWC2::Error SetColorModeById(int32_t color_mode_id);
virtual HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint);
+ virtual HWC2::Error RestoreColorTransform();
virtual int Perform(uint32_t operation, ...);
virtual void SetSecureDisplay(bool secure_display_active);
virtual DisplayError Refresh();
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index bf660b5..cd9ce7b 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/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index cd51405..d139d0c 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -1538,57 +1538,73 @@
pending_action.action = kNoAction;
}
- switch (pending_action.action) {
- case kInvalidating:
- Refresh(HWC_DISPLAY_PRIMARY);
- break;
- case kEnterQDCMMode:
- ret = color_mgr_->EnableQDCMMode(true, hwc_display_[HWC_DISPLAY_PRIMARY]);
- break;
- case kExitQDCMMode:
- ret = color_mgr_->EnableQDCMMode(false, hwc_display_[HWC_DISPLAY_PRIMARY]);
- break;
- case kApplySolidFill:
- ret =
- color_mgr_->SetSolidFill(pending_action.params, true, hwc_display_[HWC_DISPLAY_PRIMARY]);
- Refresh(HWC_DISPLAY_PRIMARY);
- break;
- case kDisableSolidFill:
- ret =
- color_mgr_->SetSolidFill(pending_action.params, false, hwc_display_[HWC_DISPLAY_PRIMARY]);
- Refresh(HWC_DISPLAY_PRIMARY);
- break;
- case kSetPanelBrightness:
- brightness_value = reinterpret_cast<int32_t *>(resp_payload.payload);
- if (brightness_value == NULL) {
- DLOGE("Brightness value is Null");
- ret = -EINVAL;
- } else {
- ret = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPanelBrightness(*brightness_value);
- }
- break;
- case kEnableFrameCapture:
- ret = color_mgr_->SetFrameCapture(pending_action.params, true,
+ int32_t action = pending_action.action;
+ int count = -1;
+ while (action > 0) {
+ count++;
+ int32_t bit = (action & 1);
+ action = action >> 1;
+
+ if (!bit)
+ continue;
+
+ DLOGV_IF(kTagQDCM, "pending action = %d", BITMAP(count));
+ switch (BITMAP(count)) {
+ case kInvalidating:
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kEnterQDCMMode:
+ ret = color_mgr_->EnableQDCMMode(true, hwc_display_[HWC_DISPLAY_PRIMARY]);
+ break;
+ case kExitQDCMMode:
+ ret = color_mgr_->EnableQDCMMode(false, hwc_display_[HWC_DISPLAY_PRIMARY]);
+ break;
+ case kApplySolidFill:
+ ret = color_mgr_->SetSolidFill(pending_action.params,
+ true, hwc_display_[HWC_DISPLAY_PRIMARY]);
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kDisableSolidFill:
+ ret = color_mgr_->SetSolidFill(pending_action.params,
+ false, hwc_display_[HWC_DISPLAY_PRIMARY]);
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kSetPanelBrightness:
+ brightness_value = reinterpret_cast<int32_t *>(resp_payload.payload);
+ if (brightness_value == NULL) {
+ DLOGE("Brightness value is Null");
+ ret = -EINVAL;
+ } else {
+ ret = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPanelBrightness(*brightness_value);
+ }
+ break;
+ case kEnableFrameCapture:
+ ret = color_mgr_->SetFrameCapture(pending_action.params, true,
hwc_display_[HWC_DISPLAY_PRIMARY]);
- Refresh(HWC_DISPLAY_PRIMARY);
- break;
- case kDisableFrameCapture:
- ret = color_mgr_->SetFrameCapture(pending_action.params, false,
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kDisableFrameCapture:
+ ret = color_mgr_->SetFrameCapture(pending_action.params, false,
hwc_display_[HWC_DISPLAY_PRIMARY]);
- break;
- case kConfigureDetailedEnhancer:
- ret = color_mgr_->SetDetailedEnhancer(pending_action.params,
+ break;
+ case kConfigureDetailedEnhancer:
+ ret = color_mgr_->SetDetailedEnhancer(pending_action.params,
hwc_display_[HWC_DISPLAY_PRIMARY]);
- Refresh(HWC_DISPLAY_PRIMARY);
- break;
- case kNoAction:
- break;
- default:
- DLOGW("Invalid pending action = %d!", pending_action.action);
- break;
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kModeSet:
+ ret = static_cast<int>
+ (hwc_display_[HWC_DISPLAY_PRIMARY]->RestoreColorTransform());
+ Refresh(HWC_DISPLAY_PRIMARY);
+ break;
+ case kNoAction:
+ break;
+ default:
+ DLOGW("Invalid pending action = %d!", pending_action.action);
+ break;
+ }
}
}
-
// for display API getter case, marshall returned params into out_parcel.
output_parcel->writeInt32(ret);
HWCColorManager::MarshallStructIntoParcel(resp_payload, output_parcel);
diff --git a/sdm/libs/hwc2/hwc_session_services.cpp b/sdm/libs/hwc2/hwc_session_services.cpp
index f19c85b..23a2a6f 100644
--- a/sdm/libs/hwc2/hwc_session_services.cpp
+++ b/sdm/libs/hwc2/hwc_session_services.cpp
@@ -252,6 +252,7 @@
}
}
}
+ _hidl_cb(error, display_attributes);
return Void();
}
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: