All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
To: Swati Sharma <swati2.sharma@intel.com>, <igt-dev@lists.freedesktop.org>
Subject: Re: [PATCH i-g-t,v5 6/7] tests/kms_chamelium_color_pipeline: Add FIXED_MATRIX colorop tests
Date: Wed, 9 Sep 2026 15:59:44 +0530	[thread overview]
Message-ID: <1d32aa1a-83f0-4d77-9fa3-f55bd7142265@intel.com> (raw)
In-Reply-To: <20260831192935.463134-7-swati2.sharma@intel.com>



On 9/1/2026 12:59 AM, Swati Sharma wrote:
> Add Chamelium frame-capture equivalents of the FIXED_MATRIX colorop
> tests from kms_color_pipeline. Unlike the pipe-CRC variant, these
> validate the output using chamelium_frame_match_or_dump() with analog
> frame comparison, whose tolerance accommodates the small differences
> between the software color model and the hardware fixed-point matrix
> that a bit-exact pipe CRC cannot.
> 
> The SW reference framebuffer is computed by converting the YUV input
> through igt_fb_convert(), which internally applies igt_ycbcr_to_rgb_matrix(),
> matching the reference computation used in the pipe-CRC variant.
> 
> New subtests:
>   - plane-fixed-matrix-yuv-rgb-bt601
>   - plane-fixed-matrix-yuv-rgb-bt709
>   - plane-fixed-matrix-yuv-rgb-bt2020
>   - plane-fixed-matrix-yuv-rgb-bt601-lim
>   - plane-fixed-matrix-yuv-rgb-bt709-lim
>   - plane-fixed-matrix-yuv-rgb-bt2020-lim
>   - plane-fixed-matrix-yuv-rgb-bt601-lut1d
>   - plane-fixed-matrix-yuv-rgb-bt709-lut1d
>   - plane-fixed-matrix-yuv-rgb-bt2020-lut1d
>   - plane-fixed-matrix-yuv-rgb-bt601-lim-lut1d
>   - plane-fixed-matrix-yuv-rgb-bt709-lim-lut1d
>   - plane-fixed-matrix-yuv-rgb-bt2020-lim-lut1d
> 
> v2: -Naming changes (CSC_FF -> FIXED_MATRIX)
> v3: -Drop YCbCr limited to full and RGB709 to RGB2020 matrices
>       until we have non-IGT userspace that shows their use
>      -Rename subtests to yuv-rgb-btXXX with limited range variants
> v4: -Revert colorop_type_only() back to ctm_colorop_only()
>      -Reuse _test_plane_colorops() for FIXED_MATRIX instead of
>       separate _test_plane_fixed_matrix_colorops()
>      -Move cleanup before assert so failed plane doesn't affect
>       next plane
>      -Store encoding/range in colorop fixed_matrix_info
> v5: -use igt_crtc_name() instead of kmstest_pipe_name()
> 
> Assisted-by: Claude Opus 4.6
> Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
> ---
>   .../chamelium/kms_chamelium_color_pipeline.c  | 279 ++++++++++++++++--
>   1 file changed, 252 insertions(+), 27 deletions(-)
> 
> diff --git a/tests/chamelium/kms_chamelium_color_pipeline.c b/tests/chamelium/kms_chamelium_color_pipeline.c
> index db6107221..c69783450 100644
> --- a/tests/chamelium/kms_chamelium_color_pipeline.c
> +++ b/tests/chamelium/kms_chamelium_color_pipeline.c
> @@ -34,6 +34,26 @@
>    * @lut3d-green-only:		3D LUT
>    */
>   
> +/**
> + * SUBTEST: plane-fixed-matrix-%s
> + * Description: Test FIXED_MATRIX colorop for color space conversion: %arg[1].
> + *
> + * arg[1]:
> + *
> + * @yuv-rgb-bt601:		YUV BT.601 full range to RGB BT.601
> + * @yuv-rgb-bt709:		YUV BT.709 full range to RGB BT.709
> + * @yuv-rgb-bt2020:		YUV BT.2020 full range to RGB BT.2020
> + * @yuv-rgb-bt601-lim:		YUV BT.601 limited range to RGB BT.601
> + * @yuv-rgb-bt709-lim:		YUV BT.709 limited range to RGB BT.709
> + * @yuv-rgb-bt2020-lim:		YUV BT.2020 limited range to RGB BT.2020
> + * @yuv-rgb-bt601-lut1d:	YUV BT.601 full range to RGB BT.601, then 1D LUT
> + * @yuv-rgb-bt709-lut1d:	YUV BT.709 full range to RGB BT.709, then 1D LUT
> + * @yuv-rgb-bt2020-lut1d:	YUV BT.2020 full range to RGB BT.2020, then 1D LUT
> + * @yuv-rgb-bt601-lim-lut1d:	YUV BT.601 limited range to RGB BT.601, then 1D LUT
> + * @yuv-rgb-bt709-lim-lut1d:	YUV BT.709 limited range to RGB BT.709, then 1D LUT
> + * @yuv-rgb-bt2020-lim-lut1d:	YUV BT.2020 limited range to RGB BT.2020, then 1D LUT
> + */
> +
>   IGT_TEST_DESCRIPTION("Test to validate DRM plane color pipeline using Chamelium frame capture instead of pipe CRC");
>   
>   static void test_cleanup(data_t *data)
> @@ -103,45 +123,63 @@ static void _test_plane_colorops(data_t *data,
>   				 const color_t *fb_colors,
>   				 const color_t *exp_colors,
>   				 kms_colorop_t *colorops[],
> -				 struct chamelium_port *port)
> +				 struct chamelium_port *port,
> +				 uint32_t input_format,
> +				 enum igt_color_encoding encoding,
> +				 enum igt_color_range range)

too many arguments, same as the non cham tests.

Other than that, LGTM

Reviewed-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>

>   {
>   	igt_display_t *display = &data->display;
>   	drmModeModeInfo *mode = data->mode;
>   	igt_colorop_t *color_pipeline;
>   	struct igt_fb fb, fbref;
>   	struct chamelium_frame_dump *frame;
> +	bool is_yuv = igt_format_is_yuv(input_format);
>   	bool ret;
>   
>   	color_pipeline = get_color_pipeline(display, plane, colorops);
>   	igt_skip_on(!color_pipeline);
>   
>   	/* Create HW framebuffer */
> -	igt_assert(igt_create_fb(data->drm_fd,
> -				 mode->hdisplay,
> -				 mode->vdisplay,
> -				 DRM_FORMAT_XRGB8888,
> -				 DRM_FORMAT_MOD_LINEAR,
> -				 &fb));
> +	if (is_yuv) {
> +		igt_assert(igt_create_fb_with_bo_size(data->drm_fd,
> +						      mode->hdisplay,
> +						      mode->vdisplay,
> +						      input_format,
> +						      DRM_FORMAT_MOD_LINEAR,
> +						      encoding, range,
> +						      &fb, 0, 0));
> +	} else {
> +		igt_assert(igt_create_fb(data->drm_fd,
> +					 mode->hdisplay,
> +					 mode->vdisplay,
> +					 input_format,
> +					 DRM_FORMAT_MOD_LINEAR,
> +					 &fb));
> +	}
>   
> -	/* Create reference framebuffer */
> -	igt_assert(igt_create_fb(data->drm_fd,
> -				 mode->hdisplay,
> -				 mode->vdisplay,
> -				 DRM_FORMAT_XRGB8888,
> -				 DRM_FORMAT_MOD_LINEAR,
> -				 &fbref));
> +	/* Paint test fb */
> +	if (ctm_colorop_only(colorops) || is_yuv)
> +		paint_rectangles(data, mode, fb_colors, &fb);
> +	else
> +		paint_gradient_rectangles(data, mode, fb_colors, &fb);
>   
> -	/* ---- Software reference ---- */
> -	paint_rectangles(data, mode, exp_colors, &fbref);
> +	/* Create reference framebuffer */
> +	if (is_yuv) {
> +		igt_fb_convert(&fbref, &fb, DRM_FORMAT_XRGB8888,
> +			       DRM_FORMAT_MOD_LINEAR);
> +	} else {
> +		igt_assert(igt_create_fb(data->drm_fd,
> +					 mode->hdisplay,
> +					 mode->vdisplay,
> +					 DRM_FORMAT_XRGB8888,
> +					 DRM_FORMAT_MOD_LINEAR,
> +					 &fbref));
> +		paint_rectangles(data, mode, exp_colors, &fbref);
> +	}
>   
>   	/* ---- Hardware path ---- */
>   	set_color_pipeline(display, plane, colorops, color_pipeline);
>   
> -	if (ctm_colorop_only(colorops))
> -		paint_rectangles(data, mode, fb_colors, &fb);
> -	else
> -		paint_gradient_rectangles(data, mode, fb_colors, &fb);
> -
>   	igt_plane_set_fb(plane, &fb);
>   	igt_display_commit_atomic(&data->display, 0, NULL);
>   
> @@ -156,19 +194,17 @@ static void _test_plane_colorops(data_t *data,
>   					    &fbref,
>   					    CHAMELIUM_CHECK_ANALOG);
>   
> -	igt_assert(ret);
> -
>   	chamelium_destroy_frame_dump(frame);
>   
> -	/* Cleanup */
> +	/* Cleanup before assert so failed plane doesn't affect next plane */
>   	set_color_pipeline_bypass(plane);
>   	reset_colorops(colorops);
> -
>   	igt_plane_set_fb(plane, NULL);
>   	igt_display_commit_atomic(&data->display, 0, NULL);
> -
>   	igt_remove_fb(data->drm_fd, &fb);
>   	igt_remove_fb(data->drm_fd, &fbref);
> +
> +	igt_assert(ret);
>   }
>   
>   static void
> @@ -191,7 +227,8 @@ test_plane_colorops(data_t *data, igt_crtc_t *crtc,
>   		igt_dynamic_f("pipe-%s-plane-%u", kmstest_pipe_name(crtc->pipe), plane_id)
>   			_test_plane_colorops(data, plane, fb_colors,
>   					     exp_colors, colorops,
> -					     data->ports[port_idx]);
> +					     data->ports[port_idx],
> +					     DRM_FORMAT_XRGB8888, 0, 0);
>   	}
>   }
>   
> @@ -345,6 +382,191 @@ run_tests_for_plane(data_t *data)
>   	}
>   }
>   
> +static void
> +test_plane_fixed_matrix_colorops(data_t *data, igt_crtc_t *crtc,
> +				 const color_t *fb_colors,
> +				 kms_colorop_t *colorops[],
> +				 enum igt_color_encoding encoding,
> +				 enum igt_color_range range,
> +				 int port_idx)
> +{
> +	int n_planes = crtc->n_planes;
> +	igt_output_t *output = data->output;
> +	igt_plane_t *plane;
> +
> +	for (int plane_id = 0; plane_id < n_planes; plane_id++) {
> +		plane = igt_output_get_plane(output, plane_id);
> +
> +		if (!igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE))
> +			continue;
> +
> +		igt_dynamic_f("pipe-%s-plane-%u", igt_crtc_name(crtc), plane_id)
> +			_test_plane_colorops(data, plane, fb_colors,
> +					     NULL, colorops,
> +					     data->ports[port_idx],
> +					     DRM_FORMAT_YUYV,
> +					     encoding, range);
> +	}
> +}
> +
> +static void
> +run_tests_for_fixed_matrix(data_t *data)
> +{
> +	igt_crtc_t *crtc;
> +	igt_output_t *output = NULL;
> +	int port_idx = 0;
> +	static const color_t colors_rgb[] = {
> +		{ 1.0, 0.0, 0.0 },
> +		{ 0.0, 1.0, 0.0 },
> +		{ 0.0, 0.0, 1.0 },
> +	};
> +	kms_colorop_t lut1d_linear = {
> +		.type = KMS_COLOROP_CUSTOM_LUT1D,
> +		.name = "1D LUT (linear)",
> +		.lut1d = &igt_1dlut_linear,
> +		.transform = &igt_color_linear,
> +	};
> +	kms_colorop_t fixed_matrix_yuv601_rgb601 = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV601 to RGB601",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR601_FULL_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT601,
> +			.range = IGT_COLOR_YCBCR_FULL_RANGE,
> +		},
> +	};
> +	kms_colorop_t fixed_matrix_yuv709_rgb709 = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV709 to RGB709",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR709_FULL_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT709,
> +			.range = IGT_COLOR_YCBCR_FULL_RANGE,
> +		},
> +	};
> +	kms_colorop_t fixed_matrix_yuv2020_rgb2020 = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV2020 to RGB2020",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR2020_NC_FULL_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT2020,
> +			.range = IGT_COLOR_YCBCR_FULL_RANGE,
> +		},
> +	};
> +	kms_colorop_t fixed_matrix_yuv601_rgb601_lim = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV601 limited to RGB601",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR601_LIMITED_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT601,
> +			.range = IGT_COLOR_YCBCR_LIMITED_RANGE,
> +		},
> +	};
> +	kms_colorop_t fixed_matrix_yuv709_rgb709_lim = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV709 limited to RGB709",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR709_LIMITED_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT709,
> +			.range = IGT_COLOR_YCBCR_LIMITED_RANGE,
> +		},
> +	};
> +	kms_colorop_t fixed_matrix_yuv2020_rgb2020_lim = {
> +		.type = KMS_COLOROP_FIXED_MATRIX,
> +		.name = "FIXED_MATRIX YUV2020 limited to RGB2020",
> +		.fixed_matrix_info = {
> +			.fixed_matrix = KMS_COLOROP_FIXED_MATRIX_YCBCR2020_NC_LIMITED_RGB,
> +			.encoding = IGT_COLOR_YCBCR_BT2020,
> +			.range = IGT_COLOR_YCBCR_LIMITED_RANGE,
> +		},
> +	};
> +
> +	struct {
> +		const char *name;
> +		const color_t *fb_colors;
> +		kms_colorop_t *colorops[MAX_COLOROPS];
> +	} fixed_matrix_tests[] = {
> +		{ .name = "yuv-rgb-bt601",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv601_rgb601, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt709",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv709_rgb709, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt2020",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv2020_rgb2020, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt601-lim",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv601_rgb601_lim, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt709-lim",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv709_rgb709_lim, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt2020-lim",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv2020_rgb2020_lim, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt601-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv601_rgb601, &lut1d_linear, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt709-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv709_rgb709, &lut1d_linear, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt2020-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv2020_rgb2020, &lut1d_linear, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt601-lim-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv601_rgb601_lim, &lut1d_linear, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt709-lim-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv709_rgb709_lim, &lut1d_linear, NULL },
> +		},
> +		{ .name = "yuv-rgb-bt2020-lim-lut1d",
> +		  .fb_colors = colors_rgb,
> +		  .colorops = { &fixed_matrix_yuv2020_rgb2020_lim, &lut1d_linear, NULL },
> +		},
> +	};
> +
> +	for (int i = 0; i < ARRAY_SIZE(fixed_matrix_tests); i++) {
> +		igt_describe_f("Test FIXED_MATRIX pipeline: plane-fixed-matrix-%s",
> +			       fixed_matrix_tests[i].name);
> +		igt_subtest_with_dynamic_f("plane-fixed-matrix-%s",
> +					   fixed_matrix_tests[i].name) {
> +			for_each_crtc_with_single_output(&data->display, crtc,
> +							 output) {
> +				data->output = output;
> +
> +				if (!crtc_output_combo_valid(data, crtc))
> +					continue;
> +
> +				port_idx = test_setup(data, crtc);
> +				if (port_idx < 0) {
> +					test_cleanup(data);
> +					continue;
> +				}
> +
> +				test_plane_fixed_matrix_colorops(data, crtc,
> +								 fixed_matrix_tests[i].fb_colors,
> +								 fixed_matrix_tests[i].colorops,
> +								 fixed_matrix_tests[i].colorops[0]->fixed_matrix_info.encoding,
> +								 fixed_matrix_tests[i].colorops[0]->fixed_matrix_info.range,
> +								 port_idx);
> +
> +				test_cleanup(data);
> +			}
> +		}
> +	}
> +}
> +
>   int igt_main()
>   {
>   	int i;
> @@ -404,6 +626,9 @@ int igt_main()
>   	igt_subtest_group()
>   		run_tests_for_plane(&data);
>   
> +	igt_subtest_group()
> +		run_tests_for_fixed_matrix(&data);
> +
>   	igt_fixture() {
>   		igt_display_fini(&data.display);
>   		drm_close_driver(data.drm_fd);


  reply	other threads:[~2026-09-09 10:30 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31 19:29 [PATCH i-g-t,v5 0/7] Add FIXED_MATRIX colorop tests Swati Sharma
2026-08-31 19:29 ` [PATCH i-g-t, v5 1/7] lib/igt_kms: Rename IGT_COLOROP_FIXED_MATRIX to IGT_COLOROP_FIXED_MATRIX_TYPE Swati Sharma
2026-09-09 10:27   ` Borah, Chaitanya Kumar
2026-08-31 19:29 ` [PATCH i-g-t, v5 2/7] lib/igt_kms: Order IGT_COLOROP_FIXED_MATRIX_TYPE before IGT_COLOROP_NEXT Swati Sharma
2026-09-09 10:27   ` [PATCH i-g-t,v5 " Borah, Chaitanya Kumar
2026-08-31 19:29 ` [PATCH i-g-t, v5 3/7] tests/kms_colorop_helper: Add Fixed Matrix enum names table Swati Sharma
2026-09-09 10:28   ` [PATCH i-g-t,v5 " Borah, Chaitanya Kumar
2026-08-31 19:29 ` [PATCH i-g-t, v5 4/7] tests/kms_color_pipeline: Add FIXED_MATRIX colorop tests Swati Sharma
2026-09-09 10:29   ` [PATCH i-g-t,v5 " Borah, Chaitanya Kumar
2026-08-31 19:29 ` [PATCH i-g-t, v5 5/7] tests/kms_color_pipeline: Remove unused color_depth and drm_format Swati Sharma
2026-08-31 19:29 ` [PATCH i-g-t, v5 6/7] tests/kms_chamelium_color_pipeline: Add FIXED_MATRIX colorop tests Swati Sharma
2026-09-09 10:29   ` Borah, Chaitanya Kumar [this message]
2026-08-31 19:29 ` [PATCH i-g-t, v5 7/7] tests/chamelium/kms_chamelium_color_pipeline: Fix CRTC naming Swati Sharma
2026-09-09 10:30   ` [PATCH i-g-t,v5 " Borah, Chaitanya Kumar
2026-09-01 19:21 ` ✓ Xe.CI.BAT: success for Add FIXED_MATRIX colorop tests (rev5) Patchwork
2026-09-01 19:51 ` ✓ i915.CI.BAT: " Patchwork
2026-09-02  5:27 ` ✗ i915.CI.Full: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1d32aa1a-83f0-4d77-9fa3-f55bd7142265@intel.com \
    --to=chaitanya.kumar.borah@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=swati2.sharma@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.