diff options
author | Swati Sharma <swati2.sharma@intel.com> | 2022-06-30 13:15:13 +0300 |
---|---|---|
committer | Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> | 2022-07-01 12:42:40 +0300 |
commit | 2824470eeed46d448ccc8111f96736da3abe66b5 (patch) | |
tree | 2fdc56ed506d6955873656ee9d901b2685ce8edc | |
parent | 8eef136d23537e295cd7ffcc8a6de14878e69c8d (diff) |
tests/kms_flip_scaled_crc: Validate NN scaling filter
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 missing property, assert on where
expect to find it.
- Allow test to run correctly on all gen9 upwards platforms.
- run default and NN filters on same test.
Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
-rw-r--r-- | tests/i915/kms_flip_scaled_crc.c | 47 |
1 files 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; |