Re: [PATCH v3 11/12] tests/kms_colorop: Add bypass transition tests
Alex Hung <[email protected]> Sat, 25 Jul 2026 01:25:01 -0600
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
Reviewed-by: Alex Hung <[email protected]> On 6/23/26 11:57, Harry Wentland wrote: > Add tests to verify color pipeline correctly transitions to bypass state > after being configured with various colorops. This ensures no stale state > remains when switching from an active configuration back to bypass. > > This also changes existing test behavior: tests no longer commit bypass > state at the end, leaving the pipeline in its configured state between > subtests. > > Test approach: > - Configure pipeline with specific colorops > - Verify configured output is correct > - Transition to bypass > - Verify bypass output matches input (identity transform) > > Test coverage: > * Enumerated 1D curve (srgb_eotf) > * Custom 1D LUT (srgb_inv_eotf_lut) > * CTM (ctm_3x4_50_desat) > * 3D LUT (3dlut_17_12_rgb) > * Multi-stage (srgb_eotf + ctm_3x4_50_desat) > > Assisted-by: Claude:claude-sonnet-4-5 > Signed-off-by: Harry Wentland <[email protected]> > --- > tests/kms_colorop.c | 127 +++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 115 insertions(+), 12 deletions(-) > > diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c > index 4e8b2563ea4e..a2784243c0f5 100644 > --- a/tests/kms_colorop.c > +++ b/tests/kms_colorop.c > @@ -80,6 +80,16 @@ > * SUBTEST: plane-XR30-XR30-multiply_125 > * SUBTEST: plane-XR30-XR30-multiply_inv_125 > * SUBTEST: plane-XR30-XR30-3dlut_17_12_rgb > + * SUBTEST: plane-bypass-XR24-XR24-srgb_eotf > + * SUBTEST: plane-bypass-XR24-XR24-srgb_inv_eotf_lut > + * SUBTEST: plane-bypass-XR24-XR24-ctm_3x4_50_desat > + * SUBTEST: plane-bypass-XR24-XR24-3dlut_17_12_rgb > + * SUBTEST: plane-bypass-XR24-XR24-srgb_eotf-ctm_3x4_50_desat > + * SUBTEST: plane-bypass-XR30-XR30-srgb_eotf > + * SUBTEST: plane-bypass-XR30-XR30-srgb_inv_eotf_lut > + * SUBTEST: plane-bypass-XR30-XR30-ctm_3x4_50_desat > + * SUBTEST: plane-bypass-XR30-XR30-3dlut_17_12_rgb > + * SUBTEST: plane-bypass-XR30-XR30-srgb_eotf-ctm_3x4_50_desat > * Description: Tests DRM colorop properties on RGB formats > * Driver requirement: amdgpu > * Functionality: kms_core > @@ -273,7 +283,8 @@ static void colorop_plane_test(igt_display_t *display, > igt_fb_t *output_fb, > __u32 fourcc_in, > __u32 fourcc_out, > - kms_colorop_t *colorops[]) > + kms_colorop_t *colorops[], > + bool verify_bypass) > { > igt_colorop_t *color_pipeline = NULL; > igt_fb_t sw_transform_fb; > @@ -337,17 +348,26 @@ static void colorop_plane_test(igt_display_t *display, > /* compare sw transformed and KMS transformed FBs */ > igt_assert(compare_with_bracket(&sw_transform_fb, output_fb)); > > - /* reset color pipeline*/ > - set_color_pipeline_bypass(plane); > + /* Test bypass transition if requested */ > + if (verify_bypass) { > + /* reset color pipeline*/ > + set_color_pipeline_bypass(plane); > > - /* Commit */ > - igt_plane_set_fb(plane, input_fb); > - igt_output_set_writeback_fb(output, output_fb); > + /* Commit */ > + igt_plane_set_fb(plane, input_fb); > + igt_output_set_writeback_fb(output, output_fb); > > - igt_display_commit_atomic(output->display, > - DRM_MODE_ATOMIC_ALLOW_MODESET, > - NULL); > - igt_get_and_wait_out_fence(output); > + igt_display_commit_atomic(output->display, > + DRM_MODE_ATOMIC_ALLOW_MODESET, > + NULL); > + igt_get_and_wait_out_fence(output); > + > + if (data.dump_check) > + igt_dump_fb(display, output_fb, ".", "bypass_output"); > + > + /* For RGB bypass, output should match input */ > + igt_assert(compare_with_bracket(input_fb, output_fb)); > + } > } > > static void check_plane_colorop_ids(igt_display_t *display) > @@ -471,6 +491,20 @@ int igt_main_args("d", long_options, help_str, opt_handler, NULL) > { { &kms_colorop_bt709_limited_ycbcr_to_rgb, &kms_colorop_srgb_eotf, &kms_colorop_ctm_3x4_50_desat, NULL }, "fm_bt709_limited-srgb_eotf-ctm_3x4_50_desat" }, > }; > > + /* Bypass transition tests - test config -> bypass -> verify identity (RGB only) */ > + struct { > + kms_colorop_t *colorops[MAX_COLOROPS]; > + const char *name; > + } tests_bypass_transitions_rgb[] = { > + /* One per colorop type */ > + { { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" }, > + { { &kms_colorop_srgb_inv_eotf_lut, NULL }, "srgb_inv_eotf_lut" }, > + { { &kms_colorop_ctm_3x4_50_desat, NULL }, "ctm_3x4_50_desat" }, > + { { &kms_colorop_3dlut_17_12_rgb, NULL }, "3dlut_17_12_rgb" }, > + /* Multi-stage */ > + { { &kms_colorop_srgb_eotf, &kms_colorop_ctm_3x4_50_desat, NULL }, "srgb_eotf-ctm_3x4_50_desat" }, > + }; > + > struct { > __u32 fourcc_in; > __u32 fourcc_out; > @@ -569,7 +603,75 @@ int igt_main_args("d", long_options, help_str, opt_handler, NULL) > &output_fb, > formats_rgb[j].fourcc_in, > formats_rgb[j].fourcc_out, > - tests_rgb[i].colorops); > + tests_rgb[i].colorops, > + false); > + } > + > + igt_fixture() { > + igt_detach_crtc(&display, output); > + igt_remove_fb(display.drm_fd, &input_fb); > + igt_remove_fb(display.drm_fd, &output_fb); > + > + } > + } > + } > + > + /* Bypass transition tests - RGB formats */ > + for (j = 0; j < ARRAY_SIZE(formats_rgb); j++) { > + igt_output_t *output; > + igt_plane_t *plane; > + igt_fb_t input_fb, output_fb; > + unsigned int fb_id; > + drmModeModeInfo mode; > + > + igt_subtest_group() { > + igt_fixture() { > + output = kms_writeback_get_output(&display, > + formats_rgb[j].fourcc_in, > + formats_rgb[j].fourcc_out); > + igt_require(output); > + > + if (output->use_override_mode) > + memcpy(&mode, &output->override_mode, sizeof(mode)); > + else > + memcpy(&mode, &output->config.default_mode, sizeof(mode)); > + > + /* create input fb */ > + plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY); > + igt_assert(plane); > + igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE)); > + > + fb_id = igt_create_color_pattern_fb(display.drm_fd, > + mode.hdisplay, mode.vdisplay, > + formats_rgb[j].fourcc_in, DRM_FORMAT_MOD_LINEAR, > + 0.2, 0.2, 0.2, &input_fb); > + igt_assert(fb_id >= 0); > + igt_plane_set_fb(plane, &input_fb); > + > + if (data.dump_check) > + igt_dump_fb(&display, &input_fb, ".", "input"); > + > + /* create output fb */ > + fb_id = igt_create_fb(display.drm_fd, mode.hdisplay, mode.vdisplay, > + formats_rgb[j].fourcc_out, > + igt_fb_mod_to_tiling(0), > + &output_fb); > + igt_require(fb_id > 0); > + } > + > + /* Run bypass transition tests */ > + for (i = 0; i < ARRAY_SIZE(tests_bypass_transitions_rgb); i++) { > + igt_describe("Test color pipeline to bypass transition"); > + igt_subtest_f("plane-bypass-%s-%s", formats_rgb[j].name, tests_bypass_transitions_rgb[i].name) > + colorop_plane_test(&display, > + output, > + plane, > + &input_fb, > + &output_fb, > + formats_rgb[j].fourcc_in, > + formats_rgb[j].fourcc_out, > + tests_bypass_transitions_rgb[i].colorops, > + true); > } > > igt_fixture() { > @@ -653,7 +755,8 @@ int igt_main_args("d", long_options, help_str, opt_handler, NULL) > &output_fb, > formats_yuv[j].fourcc_in, > formats_yuv[j].fourcc_out, > - tests_yuv[i].colorops); > + tests_yuv[i].colorops, > + false); > > /* Switch plane back to temp_fb to keep CRTC active */ > igt_plane_set_fb(plane, &temp_fb);