[igt-dev] [v5 PATCH i-g-t 4/4] tests/kms_flip_scaled_crc: Validate NN scaling filter
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Wed Jun 29 12:37:36 UTC 2022
On 28.6.2022 21.51, Swati Sharma wrote:
> 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
>
> Cc: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> Cc: Petri Latvala <petri.latvala at intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
> ---
> tests/i915/kms_flip_scaled_crc.c | 48 ++++++++++++++++++--------------
> 1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/tests/i915/kms_flip_scaled_crc.c b/tests/i915/kms_flip_scaled_crc.c
> index 88640da2..f241806d 100644
> --- a/tests/i915/kms_flip_scaled_crc.c
> +++ b/tests/i915/kms_flip_scaled_crc.c
> @@ -476,7 +476,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;
> @@ -518,6 +518,7 @@ static void test_flip_to_scaled(data_t *data, uint32_t index,
> igt_output_set_pipe(output, pipe);
>
> primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> + igt_skip_on_f(!igt_plane_has_prop(primary, IGT_PLANE_SCALING_FILTER), "Plane scaling filter prop not supported");
> 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));
> @@ -532,6 +533,8 @@ static void test_flip_to_scaled(data_t *data, uint32_t index,
> data->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe,
> INTEL_PIPE_CRC_SOURCE_AUTO);
>
> + igt_plane_set_prop_enum(primary, IGT_PLANE_SCALING_FILTER, kmstest_scaling_filter_str(flags));
> +
> igt_plane_set_position(primary, 0, 0);
> igt_plane_set_fb(primary, &data->small_fb);
> igt_plane_set_size(primary, data->attemptmodewidth,
> @@ -601,7 +604,6 @@ igt_main
> igt_fixture {
> data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
> data.gen = intel_display_ver(intel_get_drm_devid(data.drm_fd));
> - igt_require(data.gen >= 9);
> igt_display_require(&data.display, data.drm_fd);
> igt_require(data.display.is_atomic);
> igt_require_pipe_crc(data.drm_fd);
> @@ -616,28 +618,32 @@ igt_main
> }
> }
>
> - 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) {
> - free_fbs(&data);
> - for_each_pipe(&data.display, pipe) {
> - bool found = false;
> - for_each_valid_output_on_pipe(&data.display, pipe, output) {
> - modetoset = find_mode(&data, output);
> - if (modetoset) {
> - found = true;
> - igt_dynamic_f("pipe-%s-valid-mode", kmstest_pipe_name(pipe))
> - test_flip_to_scaled(&data, index, pipe, output, modetoset);
> - break;
> - }
> - }
> - if (!found) {
> + igt_describe("Tests scaler using default and nearest neighbor plane scaling filters");
> + for (int filter = 0; filter < 2; filter++)
I'd still bake these filters into single (dynamic sub-)test if that is
easily workable.
> + for (int index = 0; index < ARRAY_SIZE(flip_scenario_test); index++) {
> + igt_describe(flip_scenario_test[index].describe);
> + igt_require(filter ? data.gen >= 10 : data.gen >= 9);
Above igt_require need to be moved one line below, inside
igt_subtest_with_dynamic_f to fix that "ninja -C build test"
Other than these things patch did look ok to me.
> + igt_subtest_with_dynamic_f("%s-%s", filter ? "nn" : "default", flip_scenario_test[index].name) {
> + free_fbs(&data);
> + for_each_pipe(&data.display, pipe) {
> + bool found = false;
> 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);
> + modetoset = find_mode(&data, output);
> + if (modetoset) {
> + found = true;
> + igt_dynamic_f("pipe-%s-valid-mode", kmstest_pipe_name(pipe))
> + test_flip_to_scaled(&data, index, pipe, output, modetoset, filter);
> + 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, filter);
> + }
> }
> + break;
> }
> - break;
> }
> }
> }
More information about the igt-dev
mailing list