From 7c560b3cf279a23576e3c7367e2bd8bfec02e6dc Mon Sep 17 00:00:00 2001 From: jialin Date: Fri, 4 Jul 2025 13:34:31 +0000 Subject: [PATCH 1/4] Add HDR xe driver support Enable hdr support flag for xe driver Test-done: Android boot and hdr video playback test Tracked-On: OAM- Signed-off-by: Jialin --- drm/DrmDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drm/DrmDevice.cpp b/drm/DrmDevice.cpp index c8993f2d..9bc45643 100644 --- a/drm/DrmDevice.cpp +++ b/drm/DrmDevice.cpp @@ -285,7 +285,7 @@ bool DrmDevice::IsHdrSupportedDevice() { } else { std::string name(ver->name); ALOGD("drm device name is : %s\n", name.c_str()); - if (name == "i915") { + if (name == "i915" || name == "xe") { is_hdr_supported_ = true; } else { is_hdr_supported_ = false; From 065dc97d30fe67d738c7eb3cb6d71be01401cfa5 Mon Sep 17 00:00:00 2001 From: jialin Date: Sat, 19 Jul 2025 17:01:00 +0000 Subject: [PATCH 2/4] Add 10bit colormode and fix hdr type issue 1.Add BT2020/BT2100 10bit colormode 2.Fix hdr set metadata return value error. 3.Skip hdr outtypes check to fix GetHdrCapabilities error. Test-done: Android boot and hdr video playback test Tracked-On: OAM- Signed-off-by: Jialin --- drm/DrmConnector.cpp | 6 +++--- hwc2_device/HwcDisplay.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp index dc6f9310..238b5150 100644 --- a/drm/DrmConnector.cpp +++ b/drm/DrmConnector.cpp @@ -485,14 +485,14 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes, ALOGE("outNumTypes couldn't be NULL!"); return false; } - +#if 0 if (NULL == outTypes) { ALOGE("outTypes couldn't be NULL!"); //TODO: clarify SF's logic here //kindly skip this check now and return nothing if it's NULL return false; } - +#endif if (NULL == outMaxLuminance) { ALOGE("outMaxLuminance couldn't be NULL!"); return false; @@ -537,7 +537,7 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes, *outMinLuminance = float(outminluminance); int ret = GetConnectorProperty(*drm_, *this, "HDR_OUTPUT_METADATA", &hdr_op_metadata_prop_); - if (ret) { + if (!ret) { ALOGE("%s Could not get HDR_OUTPUT_METADATA property\n", __FUNCTION__); } return true; diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index 6a250e85..4311a46a 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp @@ -984,7 +984,7 @@ HWC2::Error HwcDisplay::GetRenderIntents( int32_t mode, uint32_t *outNumIntents, int32_t * /*android_render_intent_v1_1_t*/ outIntents) { - if (NULL == outNumIntents || mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_DISPLAY_P3) { + if (NULL == outNumIntents || mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_BT2100_HLG) { return HWC2::Error::BadParameter; } From b127b8f5ffca3e342fe819ea1666b5c3139aa3c5 Mon Sep 17 00:00:00 2001 From: kanlihu Date: Fri, 29 Aug 2025 10:35:10 +0800 Subject: [PATCH 3/4] cancel status is abnormal --- backend/Backend.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend/Backend.cpp b/backend/Backend.cpp index 07194f03..d86390dc 100644 --- a/backend/Backend.cpp +++ b/backend/Backend.cpp @@ -111,7 +111,6 @@ std::tuple Backend::GetClientLayers( status = false; } if (!status) { - ALOGE("status is abnormal"); return GetExtraClientRange(display, layers, client_start, client_size); } return GetExtraClientRange2(display, layers, client_start, client_size, device_start, device_size); @@ -234,7 +233,6 @@ std::tuple Backend::GetExtraClientRange2( return GetExtraClientRange(display, layers, client_start, client_size); } else if (avail_planes == device_size) { if (device_start != 0 && (device_start + device_size) != layers.size()) { - ALOGE("status is abnormal"); return GetExtraClientRange(display, layers, client_start, client_size); } @@ -248,7 +246,6 @@ std::tuple Backend::GetExtraClientRange2( int prepend = device_start; int append = layers.size() - (device_start + device_size); if (std::min(prepend, append) > extra_device) { - ALOGE("status is abnormal"); return GetExtraClientRange(display, layers, client_start, client_size); } @@ -266,7 +263,6 @@ std::tuple Backend::GetExtraClientRange2( int midpend = client_start - (device_start + device_size); int append = layers.size() - (client_start + client_size); if (prepend > extra_device) { - ALOGE("status is abnormal"); return GetExtraClientRange(display, layers, client_start, client_size); } int remain = extra_device - prepend; @@ -287,7 +283,6 @@ std::tuple Backend::GetExtraClientRange2( int midpend = device_start - (client_start + client_size); int append = layers.size() - (device_start + device_size); if (append > extra_device) { - ALOGE("status is abnormal"); return GetExtraClientRange(display, layers, client_start, client_size); } int remain = extra_device - append; From 3214063650d8d67ea253a00143a049f59497bdbd Mon Sep 17 00:00:00 2001 From: kanlihu Date: Mon, 8 Sep 2025 15:12:17 +0800 Subject: [PATCH 4/4] Add hdr support for DISPLAY20 Native Color Chromaticity: Primary #1: (0.683838, 0.315918) Primary #2: (0.244873, 0.729980) Primary #3: (0.138916, 0.041992) White Point: (0.312988, 0.328857) Native Maximum Luminance (Full Coverage): 507.500000 cd/m^2 Native Maximum Luminance (10% Rectangular Coverage): 507.500000 cd/m^2 Native Minimum Luminance: 10.000000 cd/m^2 Colorimetry Data Block: BT2020RGB HDR Static Metadata Data Block: Electro optical transfer functions: Traditional gamma - SDR luminance range SMPTE ST2084 --- drm/DrmConnector.cpp | 108 +++++++++++++++++++++++++++++++++++++++++-- drm/DrmConnector.h | 15 ++++++ 2 files changed, 120 insertions(+), 3 deletions(-) diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp index 238b5150..fd63bd64 100644 --- a/drm/DrmConnector.cpp +++ b/drm/DrmConnector.cpp @@ -26,8 +26,11 @@ #include #include +//#define ATRACE_TAG ATRACE_TAG_ALWAYS #include "DrmDevice.h" #include "utils/log.h" +#include "utils/Trace.h" + #ifndef DRM_MODE_CONNECTOR_SPI // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) @@ -333,6 +336,15 @@ void DrmConnector::SetActiveMode(DrmMode &mode) { active_mode_ = mode; } +static uint16_t flout2Primary(double f) +{ + uint16_t output = f * 50000; + if (output > 50000) + output = 50000; + + return output; +} + uint16_t DrmConnector::ColorPrimary(short val) { short temp = val & 0x3FF; short count = 1; @@ -432,6 +444,42 @@ void DrmConnector::GetColorPrimaries( uint8_t *b, struct cta_display_color_prima p->white_point_y = ColorPrimary(val); } +void DrmConnector::ParseColorPrimariesForDisplayID20( + uint8_t *b, struct cta_display_color_primaries *p) { + double colorM[4][2]; + if (!b || !p) + return; + uint8_t *x = b; + colorM[0][0] = 0.683838; + colorM[0][1] = 0.315918; + colorM[1][0] = 0.244873; + colorM[1][1] = 0.729980; + colorM[2][0] = 0.138916; + colorM[2][1] = 0.041992; + colorM[3][0] = 0.312988; + colorM[3][1] = 0.328857; + + p->display_primary_r_x = flout2Primary(colorM[0][0]); + p->display_primary_r_y = flout2Primary(colorM[0][1]); + p->display_primary_g_x = flout2Primary(colorM[1][0]); + p->display_primary_g_y = flout2Primary(colorM[1][1]); + p->display_primary_b_x = flout2Primary(colorM[2][0]); + p->display_primary_b_y = flout2Primary(colorM[2][1]); + p->white_point_x = flout2Primary(colorM[3][0]); + p->white_point_y = flout2Primary(colorM[3][1]); +} + +void DrmConnector::ParseHDRStaticMetadataForDisplayID20( + uint8_t *b, size_t size +) { + double outmaxluminance, outmaxaverageluminance, outminluminance; + ALOGD("Found HDR Static Metadata in EDID extension block."); + edid_contains_hdr_tag_ = true; + outmaxluminance = 507.500; + outmaxaverageluminance = 507.500; + outminluminance = 10.0000; +} + void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) { int current_block; uint8_t *cta_ext_blk; @@ -449,8 +497,7 @@ void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) { for (current_block = 1; current_block <= num_blocks; current_block++) { cta_ext_blk = edid + 128 * current_block; - if (cta_ext_blk[0] != CTA_EXTENSION_TAG) - continue; + if (cta_ext_blk[0] == CTA_EXTENSION_TAG) { d = cta_ext_blk[2]; cta_db_start = cta_ext_blk + 4; cta_db_end = cta_ext_blk + d - 1; @@ -474,7 +521,44 @@ void DrmConnector::ParseCTAFromExtensionBlock(uint8_t *edid) { DrmConnector::GetColorPrimaries(dbptr + 2, &primaries_); } } + } + //for H3C case + if (cta_ext_blk[0] == 0x70 + && cta_ext_blk[1] == 0x20 + && cta_ext_blk[8] == 0x94 + && cta_ext_blk[9] == 0x0b + && cta_ext_blk[10] == 0xd5) { + isDisplayID20HDR_ = true; + DrmConnector::ParseHDRStaticMetadataForDisplayID20(cta_ext_blk, 0); + DrmConnector::ParseColorPrimariesForDisplayID20(cta_ext_blk, &primaries_); + } + } +} + +bool DrmConnector::GetHdrCapabilitiesFromDisplayID20( + uint32_t *outNumTypes, int32_t *outTypes, + float *outMaxLuminance, + float *outMaxAverageLuminance, + float *outMinLuminance +) { + + if(outTypes) { + *(outTypes + *outNumTypes) = (uint32_t)EOTF_ST2084; + (*outNumTypes)+=1; } + double outmaxluminance, outmaxaverageluminance, outminluminance; + outmaxluminance = 507.500; + outmaxaverageluminance = 507.500; + outminluminance = 10.0; + + if (outMaxLuminance) + *outMaxLuminance = float(outmaxluminance); + if (outMaxLuminance) + *outMaxAverageLuminance = float(outmaxaverageluminance); + if (outMinLuminance) + *outMinLuminance = float(outminluminance); + + return true; } bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes, @@ -508,6 +592,16 @@ bool DrmConnector::GetHdrCapabilities(uint32_t *outNumTypes, int32_t *outTypes, return false; } + if (isDisplayID20HDR_) { + int ret = GetConnectorProperty(*drm_, *this, "HDR_OUTPUT_METADATA", &hdr_op_metadata_prop_); + if (!ret) { + ALOGE("%s Could not get HDR_OUTPUT_METADATA property\n", __FUNCTION__); + } + return GetHdrCapabilitiesFromDisplayID20( + outNumTypes, outTypes, + outMaxLuminance, outMaxAverageLuminance, outMinLuminance); + } + if (display_hdrMd_) { // HDR meta block bit 3 of byte 3: STPTE ST 2084 if (display_hdrMd_->eotf & 0x04) { @@ -553,8 +647,16 @@ bool DrmConnector::GetRenderIntents(uint32_t *outNumIntents, int32_t *outIntents *(outNumIntents)+=1; *(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_ENHANCE; *(outNumIntents)+=1; + return true; + } + if (isDisplayID20HDR_) { + *(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_COLORIMETRIC; + *(outNumIntents)+=1; + *(outIntents + *outNumIntents) = HAL_RENDER_INTENT_TONE_MAP_ENHANCE; + *(outNumIntents)+=1; + return true; } - return true; + return true; } #define MIN(x, y) (((x) < (y)) ? (x) : (y)) diff --git a/drm/DrmConnector.h b/drm/DrmConnector.h index 456a879a..48535a46 100644 --- a/drm/DrmConnector.h +++ b/drm/DrmConnector.h @@ -140,6 +140,19 @@ class DrmConnector : public PipelineBindable { float *outMaxLuminance, float *outMaxAverageLuminance, float *outMinLuminance); + bool GetHdrCapabilitiesFromDisplayID20( + uint32_t *outNumTypes, int32_t *outTypes, + float *outMaxLuminance, + float *outMaxAverageLuminance, + float *outMinLuminance + ); + void ParseHDRStaticMetadataForDisplayID20( + uint8_t *b, size_t size + ); + void ParseColorPrimariesForDisplayID20( + uint8_t *b, struct cta_display_color_primaries *p + ); + bool GetRenderIntents( uint32_t *outNumIntents, int32_t *outIntents); void PrepareHdrMetadata(hdr_md *layer_hdr_metadata, @@ -181,6 +194,8 @@ class DrmConnector : public PipelineBindable { struct cta_edid_hdr_metadata_static *display_hdrMd_ = nullptr; hdr_md hdr_metadata_; + + bool isDisplayID20HDR_ = false; }; } // namespace android