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

Samala, Pranay pranay.samala at intel.com
Mon Feb 24 18:17:46 UTC 2025


Hi Nemesa,

> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Nemesa
> Garg
> Sent: Monday, February 24, 2025 8:07 PM
> To: igt-dev at lists.freedesktop.org
> Cc: Garg, Nemesa <nemesa.garg at intel.com>
> Subject: [PATCH i-g-t] tests/intel/kms_plane: Add test to validate odd panning
There is no kms_plane test in tests/intel/ dir.
Change subject to tests/kms_plane: and continue it.
> 
> This feature creates a NV12 plane having two framebuffers and moving it to odd
> position and then do continous flip along with the change in the width of
> framebuffer.
> This is to check whether panning at odd position is supported or not.
> 
> v2: Add test in kms_plane.[Swati]
> 
> Signed-off-by: Nemesa Garg <nemesa.garg at intel.com>
> ---
>  tests/kms_plane.c | 103
> ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 103 insertions(+)
> 
> diff --git a/tests/kms_plane.c b/tests/kms_plane.c index b9bf025bd..8490cfabc
> 100644
> --- a/tests/kms_plane.c
> +++ b/tests/kms_plane.c
> @@ -88,6 +88,15 @@
>   * @format-source-clamping:          with source clamping
>   */
> 
> +/**
> + * SUBTEST: odd-panning
> + * Description: Verify that odd panning in horizontal direction for
> +planar format
> + * Driver requirement: i915, xe
> + * Functionality: kms_odd_pan
I think plane_odd_pan will work. No need of kms
Correct me if I am wrong.

> + * Mega feature: General Display Features
> + * Test category: functionality test
> + */
> +
>  /*
>   * Throw away enough lsbs in pixel formats tests
>   * to get a match despite some differences between @@ -100,6 +109,9 @@
>  #define CRTC_RESTRICT_CNT	2
>  #define SIM_CRTC_RESTRICT_CNT	1
> 
> +#define PLANE_WIDTH 810
> +#define PLANE_HEIGHT 590
> +
>  typedef struct {
>  	float red;
>  	float green;
> @@ -121,6 +133,8 @@ typedef struct {
>  	uint32_t crop;
>  	bool extended;
>  	unsigned int flags;
> +	igt_plane_t **plane;
> +	struct igt_fb *fb;
I think you are not using these anywhere in code.
Remove it if not planning to use further.

>  } data_t;
> 
>  static bool all_pipes;
> @@ -1330,6 +1344,91 @@ static bool is_pipe_limit_reached(int count)
>  		return count >= CRTC_RESTRICT_CNT && !all_pipes;  }
> 
> +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); }
Why are we calling this prepare_planes function in run_test_pan function?
Just to ensure pipe_id remain constant?

Regards,
Pranay.
> +
> +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;
> +	}
> +}
> +
>  static void run_test(data_t *data, void (*test)(data_t *, enum pipe))  {
>  	enum pipe pipe;
> @@ -1408,6 +1507,10 @@ run_tests_for_pipe_plane(data_t *data)
>  		run_test(data, dynamic_test_handler);
>  	}
> 
> +	igt_describe("verify whether odd panning is supported or not");
> +	igt_subtest_with_dynamic("odd-panning")
> +		run_test_odd_pan(data);
> +
>  	igt_describe("verify planar settings for pixel format are accepted or
> rejected correctly");
>  	igt_subtest_f("planar-pixel-format-settings")
>  		test_planar_settings(data);
> --
> 2.25.1



More information about the igt-dev mailing list