[igt-dev] [PATCH i-g-t 4/4] tests/kms_flip_scaled_crc: Validate NN scaling filter

Kahola, Mika mika.kahola at intel.com
Fri Jul 1 06:11:32 UTC 2022


> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Juha-
> Pekka Heikkila
> Sent: Thursday, June 30, 2022 1:15 PM
> To: igt-dev at lists.freedesktop.org
> Subject: [igt-dev] [PATCH i-g-t 4/4] tests/kms_flip_scaled_crc: Validate NN
> scaling filter
> 
> From: Swati Sharma <swati2.sharma at intel.com>
> 
> SCALING_FILTER can be used either as plane scaler property or CRTC scaler
> property.
> The value of this property can be one of the following:
>     Default:
>              Driver's default scaling filter
>     Nearest Neighbor:
>              Nearest Neighbor scaling filter If NN is used for scaling, sharpness is
> preserved whereas if we use default scaling we can see blurriness at edges.
> 
> v2: -no need to set pipe scaler filter property
> v3: -addition of new lines to improve readability
>     -use of SPDX licence placeholder
>     -close(data.drm_fd)
> v4: -instead of creating new i-g-t, tweaked kms_flip_scaled_crc
>      to validate both default and nn scaling filters
> v5: -removed duplicate block
>     -added platform check for nn
> v6:(juha): -Don't skip on missng property, assert on where
>      expect to find it.
>     - Allow test to run correctly on all gen9 upwards paltforms.
>     - run default and NN filters on same test.
> 

Reviewed-by: Mika Kahola <mika.kahola at intel.com>

> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> ---
>  tests/i915/kms_flip_scaled_crc.c | 47 ++++++++++++++++++++++++--------
>  1 file changed, 36 insertions(+), 11 deletions(-)
> 
> diff --git a/tests/i915/kms_flip_scaled_crc.c b/tests/i915/kms_flip_scaled_crc.c
> index 88640da2..764eb70f 100644
> --- a/tests/i915/kms_flip_scaled_crc.c
> +++ b/tests/i915/kms_flip_scaled_crc.c
> @@ -37,6 +37,7 @@ typedef struct {
>  	igt_pipe_crc_t *pipe_crc;
>  	uint32_t attemptmodewidth;
>  	uint32_t attemptmodeheight;
> +	drmModeModeInfo mode;
>  } data_t;
> 
>  const struct {
> @@ -476,7 +477,7 @@ static void clear_lut(data_t *data, enum pipe pipe)
> 
>  static void test_flip_to_scaled(data_t *data, uint32_t index,
>  				enum pipe pipe, igt_output_t *output,
> -				drmModeModeInfoPtr modetoset)
> +				drmModeModeInfoPtr modetoset, int flags)
>  {
>  	igt_plane_t *primary;
>  	igt_crc_t small_crc, big_crc;
> @@ -510,14 +511,20 @@ static void test_flip_to_scaled(data_t *data, uint32_t
> index,
> 
>  	if (modetoset)
>  		igt_output_override_mode(output, modetoset);
> -	/*
> -	 * Setting a pipe invalidates the modetoset pointer.
> -	 * So, mode is overriden first and then pipe is set.
> -	 * Don't change this sequence.
> -	 */
> +
>  	igt_output_set_pipe(output, pipe);
> 
>  	primary = igt_output_get_plane_type(output,
> DRM_PLANE_TYPE_PRIMARY);
> +
> +	if (data->gen >= 11) {
> +		igt_assert_f(igt_plane_has_prop(primary,
> IGT_PLANE_SCALING_FILTER),
> +			     "Plane scaling filter prop not supported!\n");
> +		igt_plane_set_prop_enum(primary,
> IGT_PLANE_SCALING_FILTER,
> +					kmstest_scaling_filter_str(flags));
> +	} else {
> +		igt_debug("Plane scaling filter prop not supported on gen < 11,
> running with default\n");
> +	}
> +
>  	igt_skip_on_f(!igt_plane_has_format_mod(primary, data-
> >small_fb.drm_format, data->small_fb.modifier) ||
>  		      !igt_plane_has_format_mod(primary, data-
> >big_fb.drm_format,
>  		      data->big_fb.modifier), "No requested format/modifier on
> pipe %s\n", kmstest_pipe_name(pipe)); @@ -539,7 +546,8 @@ static void
> test_flip_to_scaled(data_t *data, uint32_t index,
>  	ret = igt_display_try_commit_atomic(&data->display,
> DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> 
>  	igt_skip_on_f(ret == -ERANGE, "Platform scaling limits exceeded,
> skipping.\n");
> -	igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh
> > 90), "Valid/default mode too big, cdclk limits exceeded. Check next
> connector\n");
> +	igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh
> > 90),
> +		      "Valid/default mode too big, cdclk limits exceeded. Check
> next
> +connector\n");
>  	igt_assert_eq(ret, 0);
> 
>  	igt_pipe_crc_start(data->pipe_crc);
> @@ -553,7 +561,8 @@ static void test_flip_to_scaled(data_t *data, uint32_t
> index,
>  					    DRM_MODE_PAGE_FLIP_EVENT,
> NULL);
> 
>  	igt_skip_on_f(ret == -ERANGE, "Platform scaling limits exceeded,
> skipping.\n");
> -	igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh
> > 90), "Valid/default mode too big, cdclk limits exceeded. Check next
> connector\n");
> +	igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh
> > 90),
> +		      "Valid/default mode too big, cdclk limits exceeded. Check
> next
> +connector\n");
>  	igt_assert_eq(ret, 0);
> 
>  	igt_assert(read(data->drm_fd, &ev, sizeof(ev)) == sizeof(ev)); @@ -
> 584,13 +593,28 @@ static drmModeModeInfoPtr find_mode(data_t *data,
> igt_output_t *output)
>  			    modetoset->vrefresh < output->config.connector-
> >modes[i].vrefresh)
>  				continue;
> 
> -			modetoset = &output->config.connector->modes[i];
> +			data->mode = output->config.connector->modes[i];
> +			modetoset = &data->mode;
>  		}
>  	}
> 
>  	return modetoset;
>  }
> 
> +static void run_tests(data_t *data, uint32_t index, enum pipe pipe,
> +		      igt_output_t * output, drmModeModeInfoPtr modetoset) {
> +	test_flip_to_scaled(data, index, pipe, output, modetoset, 0);
> +
> +	/*
> +	 * test Nearest Neighbor filter. For scaler indexes see
> +	 * scaling_filter_names structure in igt_kms.c
> +	 * Platform scaling filter property is supported only gen >= 11.
> +	 */
> +	if (data->gen >= 11)
> +		test_flip_to_scaled(data, index, pipe, output, modetoset, 1); }
> +
>  igt_main
>  {
>  	enum pipe pipe;
> @@ -616,6 +640,7 @@ igt_main
>  		}
>  	}
> 
> +	igt_describe("Tests scaler using default and nearest neighbor plane
> +scaling filters");
>  	for (int index = 0; index < ARRAY_SIZE(flip_scenario_test); index++) {
>  		igt_describe(flip_scenario_test[index].describe);
>  		igt_subtest_with_dynamic(flip_scenario_test[index].name) {
> @@ -627,14 +652,14 @@ igt_main
>  					if (modetoset) {
>  						found = true;
>  						igt_dynamic_f("pipe-%s-valid-
> mode", kmstest_pipe_name(pipe))
> -
> 	test_flip_to_scaled(&data, index, pipe, output, modetoset);
> +							run_tests(&data,
> index, pipe, output, modetoset);
>  						break;
>  					}
>  				}
>  				if (!found) {
> 
> 	for_each_valid_output_on_pipe(&data.display, pipe, output) {
>  						igt_dynamic_f("pipe-%s-
> default-mode", kmstest_pipe_name(pipe))
> -
> 	test_flip_to_scaled(&data, index, pipe, output, NULL);
> +							run_tests(&data,
> index, pipe, output, modetoset);
>  					}
>  				}
>  				break;
> --
> 2.25.1



More information about the igt-dev mailing list