drm/amd/display: Send correct DP colorspace infopacket
Look at connector->colorimetry to determine output colorspace. We don't want to impact current SDR behavior, so DRM_MODE_COLORIMETRY_DEFAULT preserves current behavior. Also add support to explicitly set BT601 and BT709. v4: - Roll support for BT709 and BT601 into this patch - Add default case to avoid warnings for unhandled enum values Signed-off-by: Harry Wentland <harry.wentland@amd.com> Reviewed-by: Joshua Ashton <joshua@froggi.es> Cc: Pekka Paalanen <ppaalanen@gmail.com> Cc: Sebastian Wick <sebastian.wick@redhat.com> Cc: Vitaly.Prosyak@amd.com Cc: Joshua Ashton <joshua@froggi.es> Cc: Simon Ser <contact@emersion.fr> Cc: Melissa Wen <mwen@igalia.com> Cc: dri-devel@lists.freedesktop.org Cc: amd-gfx@lists.freedesktop.org Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
a0b433c858
commit
2e656827ce
|
@ -5339,21 +5339,44 @@ get_aspect_ratio(const struct drm_display_mode *mode_in)
|
|||
}
|
||||
|
||||
static enum dc_color_space
|
||||
get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
|
||||
get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
|
||||
const struct drm_connector_state *connector_state)
|
||||
{
|
||||
enum dc_color_space color_space = COLOR_SPACE_SRGB;
|
||||
|
||||
switch (dc_crtc_timing->pixel_encoding) {
|
||||
case PIXEL_ENCODING_YCBCR422:
|
||||
case PIXEL_ENCODING_YCBCR444:
|
||||
case PIXEL_ENCODING_YCBCR420:
|
||||
{
|
||||
switch (connector_state->colorspace) {
|
||||
case DRM_MODE_COLORIMETRY_BT601_YCC:
|
||||
if (dc_crtc_timing->flags.Y_ONLY)
|
||||
color_space = COLOR_SPACE_YCBCR601_LIMITED;
|
||||
else
|
||||
color_space = COLOR_SPACE_YCBCR601;
|
||||
break;
|
||||
case DRM_MODE_COLORIMETRY_BT709_YCC:
|
||||
if (dc_crtc_timing->flags.Y_ONLY)
|
||||
color_space = COLOR_SPACE_YCBCR709_LIMITED;
|
||||
else
|
||||
color_space = COLOR_SPACE_YCBCR709;
|
||||
break;
|
||||
case DRM_MODE_COLORIMETRY_OPRGB:
|
||||
color_space = COLOR_SPACE_ADOBERGB;
|
||||
break;
|
||||
case DRM_MODE_COLORIMETRY_BT2020_RGB:
|
||||
case DRM_MODE_COLORIMETRY_BT2020_YCC:
|
||||
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
|
||||
color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
|
||||
else
|
||||
color_space = COLOR_SPACE_2020_YCBCR;
|
||||
break;
|
||||
case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
|
||||
default:
|
||||
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) {
|
||||
color_space = COLOR_SPACE_SRGB;
|
||||
/*
|
||||
* 27030khz is the separation point between HDTV and SDTV
|
||||
* according to HDMI spec, we use YCbCr709 and YCbCr601
|
||||
* respectively
|
||||
*/
|
||||
if (dc_crtc_timing->pix_clk_100hz > 270300) {
|
||||
} else if (dc_crtc_timing->pix_clk_100hz > 270300) {
|
||||
if (dc_crtc_timing->flags.Y_ONLY)
|
||||
color_space =
|
||||
COLOR_SPACE_YCBCR709_LIMITED;
|
||||
|
@ -5366,15 +5389,6 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
|
|||
else
|
||||
color_space = COLOR_SPACE_YCBCR601;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case PIXEL_ENCODING_RGB:
|
||||
color_space = COLOR_SPACE_SRGB;
|
||||
break;
|
||||
|
||||
default:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -5513,7 +5527,7 @@ static void fill_stream_properties_from_drm_display_mode(
|
|||
}
|
||||
}
|
||||
|
||||
stream->output_color_space = get_output_color_space(timing_out);
|
||||
stream->output_color_space = get_output_color_space(timing_out, connector_state);
|
||||
}
|
||||
|
||||
static void fill_audio_info(struct audio_info *audio_info,
|
||||
|
|
Loading…
Reference in New Issue