[PATCH i-g-t] tests/intel/kms_odd_pan: Add test to validate odd panning

Sharma, Swati2 swati2.sharma at intel.com
Tue Feb 18 06:59:15 UTC 2025


Hi Nemesa,

On 17-02-2025 08:44 pm, Nemesa Garg wrote:
> Add a new test to check whether odd pan is supported or not.
Please elaborate more in the description whats the intention of this 
test, what is this feature
all about?
Also, why do we need to create a new binary to validate this feature? 
Why can't
we add subtest in existing binaries like kms_plane?
>
> Signed-off-by: Nemesa Garg <nemesa.garg at intel.com>
> ---
>   tests/intel/kms_odd_pan.c | 155 ++++++++++++++++++++++++++++++++++++++
>   tests/meson.build         |   1 +
>   2 files changed, 156 insertions(+)
>   create mode 100644 tests/intel/kms_odd_pan.c
>
> diff --git a/tests/intel/kms_odd_pan.c b/tests/intel/kms_odd_pan.c
> new file mode 100644
> index 000000000..46f9c8fe2
> --- /dev/null
> +++ b/tests/intel/kms_odd_pan.c
> @@ -0,0 +1,155 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +/**
> + * TEST: kms odd pan
> + * Category: Display
> + * Description: Test to validate odd panning for planar format
> + * Driver requirement: xe
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + * Functionality: panning
> + */
> +
> +#include "igt.h"
> +#include "igt_vec.h"
> +#include <errno.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include "xe/xe_query.h"
> +
> +/**
> + * SUBTEST: odd-panning
> + * Description: Verify that odd panning in horizontal direction for planar format
> + * Driver requirement: i915, xe
> + * Functionality: kms_odd_pan
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + */
> +
> +IGT_TEST_DESCRIPTION("Test to validate odd panning for planar format");
> +
> +typedef struct {
> +	int drm_fd;
> +	igt_display_t display;
> +	igt_output_t *output;
> +	igt_plane_t **plane;
> +	struct igt_fb *fb;
> +} data_t;
> +
> +#define PLANE_WIDTH 810
> +#define PLANE_HEIGHT 590
> +
> +static void
> +prepare_planes(igt_display_t *display, const enum pipe pipe_id,
> +	       igt_output_t *output)
> +{
> +	igt_plane_t *primary;
> +	struct igt_fb primary_fb_1, primary_fb_2;
> +	unsigned int fb_id_1, fb_id_2;
> +	int j = 0, ret;
> +
> +	igt_output_set_pipe(output, pipe_id);
> +
> +	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +
> +	fb_id_1 = igt_create_pattern_fb(display->drm_fd,
> +					800, 590,
> +					DRM_FORMAT_NV12,
> +					DRM_FORMAT_MOD_LINEAR,
> +					&primary_fb_1);
> +
> +	fb_id_2 = igt_create_pattern_fb(display->drm_fd,
> +					800, 590,
> +					DRM_FORMAT_NV12,
> +					DRM_FORMAT_MOD_LINEAR,
> +					&primary_fb_2);
> +
> +	igt_assert(fb_id_1);
> +	igt_assert(fb_id_2);
> +
> +	igt_plane_set_fb(primary, &primary_fb_1);
> +
> +	igt_plane_set_size(primary, PLANE_WIDTH, PLANE_HEIGHT);
> +	igt_plane_set_position(primary, -501, 200);
> +
> +	ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +
> +	do {
> +		if (j % 2 == 0) {
> +			igt_plane_set_fb(primary, &primary_fb_1);
> +			igt_plane_set_size(primary, PLANE_WIDTH - j, PLANE_HEIGHT);
> +			ret = igt_display_try_commit_atomic(display, 0, NULL);
> +		} else {
> +			igt_plane_set_fb(primary, &primary_fb_2);
> +			igt_plane_set_size(primary, PLANE_WIDTH - j, PLANE_HEIGHT);
> +			ret = igt_display_try_commit_atomic(display, 0, NULL);
> +		}
> +		j++;
> +	} while (j < 20);
> +
> +	igt_assert_eq(ret, -22);
> +
> +	igt_plane_set_fb(primary, NULL);
> +	igt_output_set_pipe(output, PIPE_NONE);
> +	igt_display_try_commit2(display, COMMIT_ATOMIC);
> +
> +	igt_remove_fb(display->drm_fd, &primary_fb_1);
> +	igt_remove_fb(display->drm_fd, &primary_fb_2);
> +}
> +
> +static void run_test_pan(igt_display_t *display, const enum pipe pipe_id,
> +			 igt_output_t *output)
> +{
> +	prepare_planes(display, pipe_id, output);
> +}
> +
> +static void run_test_odd_pan(data_t *data)
> +{
> +	igt_display_t *display = &data->display;
> +	enum pipe pipe;
> +	igt_output_t *output;
> +
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +		igt_display_reset(display);
> +
> +		igt_output_set_pipe(output, pipe);
> +		if (!intel_pipe_output_combo_valid(display))
> +			continue;
> +
> +		igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), igt_output_name(output))
> +			run_test_pan(display, pipe, output);
> +
> +		if (pipe == 0)
> +			break;
> +	}
> +}
> +
> +igt_main
> +{
> +	data_t data = {};
> +
> +	igt_fixture {
> +		data.drm_fd = drm_open_driver_master(DRIVER_ANY);
> +		igt_require(data.drm_fd >= 0);
> +
> +		kmstest_set_vt_graphics_mode();
> +
> +		igt_display_require(&data.display, data.drm_fd);
> +		igt_require(data.display.is_atomic);
> +
> +		igt_display_require_output(&data.display);
> +	}
> +
> +	igt_describe("Tests odd  panning");
> +	igt_subtest_with_dynamic("odd-panning")
> +		run_test_odd_pan(&data);
> +
> +	igt_fixture {
> +		igt_display_fini(&data.display);
> +		drm_close_driver(data.drm_fd);
> +	}
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index f8a0ab836..97effb290 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -257,6 +257,7 @@ intel_kms_progs = [
>   	'kms_joiner',
>   	'kms_legacy_colorkey',
>   	'kms_mmap_write_crc',
> +	'kms_odd_pan',
>   	'kms_pipe_b_c_ivb',
>   	'kms_pipe_stress',
>   	'kms_pm_backlight',



More information about the igt-dev mailing list