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; diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp index dc6f9310..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, @@ -485,14 +569,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; @@ -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) { @@ -537,7 +631,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; @@ -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; } - 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; } #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 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; 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; }