[Intel-gfx] [PATCH 7/7] drm/i915: Split ilk vs. icl csc matrix handling

Shankar, Uma uma.shankar at intel.com
Wed Mar 13 17:19:40 UTC 2019



>-----Original Message-----
>From: Ville Syrjala [mailto:ville.syrjala at linux.intel.com]
>Sent: Tuesday, February 19, 2019 1:02 AM
>To: intel-gfx at lists.freedesktop.org
>Cc: Shankar, Uma <uma.shankar at intel.com>; Roper, Matthew D
><matthew.d.roper at intel.com>
>Subject: [PATCH 7/7] drm/i915: Split ilk vs. icl csc matrix handling
>
>From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
>Split the csc matrix handling to ilk+ and icl+ functions.
>This keeps the logic clear on what is loaded into which CSC unit on the hardware.
>
>We also fix the icl+ code to load the full->limited range conversion matrix into the
>output CSC rather than the pipe CSC which was used on earlier platforms. And we also
>turn on the pipe CSC only when the ctm is present.

Look good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>

>Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
>---
> drivers/gpu/drm/i915/intel_color.c | 71 ++++++++++++++++++------------
> 1 file changed, 42 insertions(+), 29 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/intel_color.c b/drivers/gpu/drm/i915/intel_color.c
>index adc5c25a6fcd..ae91a4db71cf 100644
>--- a/drivers/gpu/drm/i915/intel_color.c
>+++ b/drivers/gpu/drm/i915/intel_color.c
>@@ -255,36 +255,19 @@ static void ilk_load_csc_matrix(const struct
>intel_crtc_state *crtc_state)
> 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
> 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> 	bool limited_color_range = ilk_csc_limited_range(crtc_state);
>-	enum pipe pipe = crtc->pipe;
>-	u16 coeffs[9] = {};
>-
>-	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
>-	    crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) {
>-		if (INTEL_GEN(dev_priv) >= 11)
>-			icl_update_output_csc(crtc, ilk_csc_off_zero,
>-					      ilk_csc_coeff_rgb_to_ycbcr,
>-					      ilk_csc_postoff_rgb_to_ycbcr);
>-		else
>-			ilk_update_pipe_csc(crtc, ilk_csc_off_zero,
>-					    ilk_csc_coeff_rgb_to_ycbcr,
>-					    ilk_csc_postoff_rgb_to_ycbcr);
>-
>-		I915_WRITE(PIPE_CSC_MODE(pipe), crtc_state->csc_mode);
>-		/*
>-		 * On pre GEN11 output CSC is not there, so with 1 pipe CSC
>-		 * RGB to YUV conversion can be done. No need to go further
>-		 */
>-		if (INTEL_GEN(dev_priv) < 11)
>-			return;
>-	}
>
> 	if (crtc_state->base.ctm) {
>-		ilk_csc_convert_ctm(crtc_state, coeffs);
>+		u16 coeff[9];
>
>-		ilk_update_pipe_csc(crtc, ilk_csc_off_zero, coeffs,
>+		ilk_csc_convert_ctm(crtc_state, coeff);
>+		ilk_update_pipe_csc(crtc, ilk_csc_off_zero, coeff,
> 				    limited_color_range ?
> 				    ilk_csc_postoff_limited_range :
> 				    ilk_csc_off_zero);
>+	} else if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) {
>+		ilk_update_pipe_csc(crtc, ilk_csc_off_zero,
>+				    ilk_csc_coeff_rgb_to_ycbcr,
>+				    ilk_csc_postoff_rgb_to_ycbcr);
> 	} else if (limited_color_range) {
> 		ilk_update_pipe_csc(crtc, ilk_csc_off_zero,
> 				    ilk_csc_coeff_limited_range,
>@@ -295,7 +278,33 @@ static void ilk_load_csc_matrix(const struct intel_crtc_state
>*crtc_state)
> 				    ilk_csc_off_zero);
> 	}
>
>-	I915_WRITE(PIPE_CSC_MODE(pipe), crtc_state->csc_mode);
>+	I915_WRITE(PIPE_CSC_MODE(crtc->pipe), crtc_state->csc_mode); }
>+
>+static void icl_load_csc_matrix(const struct intel_crtc_state
>+*crtc_state) {
>+	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
>+	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>+
>+	if (crtc_state->base.ctm) {
>+		u16 coeff[9];
>+
>+		ilk_csc_convert_ctm(crtc_state, coeff);
>+		ilk_update_pipe_csc(crtc, ilk_csc_off_zero,
>+				    coeff, ilk_csc_off_zero);
>+	}
>+
>+	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) {
>+		icl_update_output_csc(crtc, ilk_csc_off_zero,
>+				      ilk_csc_coeff_rgb_to_ycbcr,
>+				      ilk_csc_postoff_rgb_to_ycbcr);
>+	} else if (crtc_state->limited_color_range) {
>+		icl_update_output_csc(crtc, ilk_csc_off_zero,
>+				      ilk_csc_coeff_limited_range,
>+				      ilk_csc_postoff_limited_range);
>+	}
>+
>+	I915_WRITE(PIPE_CSC_MODE(crtc->pipe), crtc_state->csc_mode);
> }
>
> /*
>@@ -445,7 +454,10 @@ static void skl_color_commit(const struct intel_crtc_state
>*crtc_state)
>
> 	I915_WRITE(GAMMA_MODE(crtc->pipe), crtc_state->gamma_mode);
>
>-	ilk_load_csc_matrix(crtc_state);
>+	if (INTEL_GEN(dev_priv) >= 11)
>+		icl_load_csc_matrix(crtc_state);
>+	else
>+		ilk_load_csc_matrix(crtc_state);
> }
>
> static void bdw_load_degamma_lut(const struct intel_crtc_state *crtc_state) @@ -
>843,11 +855,12 @@ int intel_color_check(struct intel_crtc_state *crtc_state)
> 		crtc_state->gamma_mode = GAMMA_MODE_MODE_8BIT;
>
> 	if (INTEL_GEN(dev_priv) >= 11) {
>-		if (crtc_state->output_format ==
>INTEL_OUTPUT_FORMAT_YCBCR420 ||
>-		    crtc_state->output_format ==
>INTEL_OUTPUT_FORMAT_YCBCR444)
>+		if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB ||
>+		    crtc_state->limited_color_range)
> 			crtc_state->csc_mode |= ICL_OUTPUT_CSC_ENABLE;
>
>-		crtc_state->csc_mode |= ICL_CSC_ENABLE;
>+		if (crtc_state->base.ctm)
>+			crtc_state->csc_mode |= ICL_CSC_ENABLE;
> 	}
>
> 	return 0;
>--
>2.19.2



More information about the Intel-gfx mailing list