@@ -131,6 +131,7 @@ std::string HwcDisplay::Dump() {
131131HwcDisplay::HwcDisplay (hwc2_display_t handle, HWC2::DisplayType type,
132132 DrmHwc *hwc)
133133 : hwc_(hwc), handle_(handle), type_(type), client_layer_(this , false ) {
134+ hdr_metadata_ = std::make_shared<hdr_output_metadata>();
134135 if (type_ == HWC2::DisplayType::Virtual) {
135136 writeback_layer_ = std::make_unique<HwcLayer>(this , false );
136137 }
@@ -552,6 +553,12 @@ HWC2::Error HwcDisplay::GetColorModes(uint32_t *num_modes, int32_t *modes) {
552553 modes[0 ] = HAL_COLOR_MODE_NATIVE;
553554 return HWC2::Error::None;
554555 }
556+ if (!Properties::EnableHdrDisplay ()) {
557+ *num_modes = 1 ;
558+ if (modes)
559+ modes[0 ] = HAL_COLOR_MODE_NATIVE;
560+ return HWC2::Error::None;
561+ }
555562
556563 if (!modes) {
557564 std::vector<Colormode> temp_modes;
@@ -561,16 +568,19 @@ HWC2::Error HwcDisplay::GetColorModes(uint32_t *num_modes, int32_t *modes) {
561568 }
562569
563570 std::vector<Colormode> temp_modes;
564- std::vector<int32_t > out_modes (modes, modes + *num_modes) ;
571+ std::vector<int32_t > out_modes;
565572 GetEdid ()->GetColorModes (temp_modes);
566573 if (temp_modes.empty ()) {
567- out_modes.emplace_back (HAL_COLOR_MODE_NATIVE);
568- return HWC2::Error::None;
574+ out_modes.emplace_back (HAL_COLOR_MODE_NATIVE);
575+ } else {
576+ for (auto &c : temp_modes) {
577+ out_modes.emplace_back (static_cast <int32_t >(c));
578+ }
569579 }
570580
571- for (auto &c : temp_modes)
572- out_modes. emplace_back ( static_cast < int32_t >(c)) ;
573-
581+ for (size_t i = 0 ; i < out_modes. size (); ++i) {
582+ modes[i] = out_modes[i] ;
583+ }
574584 return HWC2::Error::None;
575585}
576586
@@ -703,22 +713,34 @@ HWC2::Error HwcDisplay::GetHdrCapabilities(uint32_t *num_types, int32_t *types,
703713 }
704714
705715 std::vector<ui::Hdr> temp_types;
706- std::vector<int32_t > out_types (types, types + *num_types) ;
716+ std::vector<int32_t > out_types;
707717 GetEdid ()->GetHdrCapabilities (temp_types, max_luminance,
708718 max_average_luminance, min_luminance);
719+
709720 for (auto &t : temp_types) {
710721 switch (t) {
722+ case ui::Hdr::DOLBY_VISION:
723+ out_types.emplace_back (HAL_HDR_DOLBY_VISION);
724+ break ;
711725 case ui::Hdr::HDR10:
712726 out_types.emplace_back (HAL_HDR_HDR10);
713727 break ;
714728 case ui::Hdr::HLG:
715729 out_types.emplace_back (HAL_HDR_HLG);
716730 break ;
731+ case ui::Hdr::HDR10_PLUS:
732+ out_types.emplace_back (HAL_HDR_HDR10_PLUS);
733+ break ;
717734 default :
718735 // Ignore any other HDR types
719736 break ;
720737 }
721738 }
739+
740+ for (size_t i = 0 ; i < out_types.size (); ++i) {
741+ types[i] = out_types[i];
742+ }
743+
722744 return HWC2::Error::None;
723745}
724746
@@ -912,7 +934,7 @@ HWC2::Error HwcDisplay::SetColorMode(int32_t mode) {
912934 */
913935 if (mode < HAL_COLOR_MODE_NATIVE || mode > HAL_COLOR_MODE_DISPLAY_BT2020)
914936 return HWC2::Error::BadParameter;
915-
937+ ALOGI ( " hwc SetColorMode %d " , mode);
916938 switch (mode) {
917939 case HAL_COLOR_MODE_NATIVE:
918940 hdr_metadata_.reset ();
@@ -1145,6 +1167,7 @@ HWC2::Error HwcDisplay::SetHdrOutputMetadata(ui::Hdr type) {
11451167 m->min_display_mastering_luminance = static_cast <uint64_t >(hdr_luminance[2 ] *
11461168 10000 .F );
11471169
1170+ #if 0
11481171 auto gamut = ColorGamut::BT2020();
11491172 auto primaries = gamut.getPrimaries();
11501173 m->display_primaries[0].x = ToU16ColorValue(primaries[0].x);
@@ -1157,6 +1180,24 @@ HWC2::Error HwcDisplay::SetHdrOutputMetadata(ui::Hdr type) {
11571180 auto whitePoint = gamut.getWhitePoint();
11581181 m->white_point.x = ToU16ColorValue(whitePoint.x);
11591182 m->white_point.y = ToU16ColorValue(whitePoint.y);
1183+ #else
1184+ auto gamut = ColorGamut::BT2020 ();
1185+ auto primaries = gamut.getPrimaries ();
1186+ auto whitePoint = gamut.getWhitePoint ();
1187+
1188+ GetEdid ()->GetColorGamut (primaries, whitePoint);
1189+
1190+ m->display_primaries [0 ].x = ToU16ColorValue (primaries[0 ].x );
1191+ m->display_primaries [0 ].y = ToU16ColorValue (primaries[0 ].y );
1192+ m->display_primaries [1 ].x = ToU16ColorValue (primaries[1 ].x );
1193+ m->display_primaries [1 ].y = ToU16ColorValue (primaries[1 ].y );
1194+ m->display_primaries [2 ].x = ToU16ColorValue (primaries[2 ].x );
1195+ m->display_primaries [2 ].y = ToU16ColorValue (primaries[2 ].y );
1196+
1197+ m->white_point .x = ToU16ColorValue (whitePoint.x );
1198+ m->white_point .y = ToU16ColorValue (whitePoint.y );
1199+
1200+ #endif
11601201
11611202 return HWC2::Error::None;
11621203}
0 commit comments