[PATCH i-g-t v1] tests/intel/kms_fbc_dirty_rect: cleanup the dirty rect tests

Reddy Guddati, Santhosh santhosh.reddy.guddati at intel.com
Thu Mar 13 08:12:29 UTC 2025


Hi Vinod,

On 07-03-2025 21:18, Vinod Govindapillai wrote:
> These tests rely on FBC is enabled, some FIFO underruns can
> disable FBC and can trigger asserts. In case if such asserts
> are triggered, we end up not clearing the used fbs and crcs.
> Use  common functions to prepare and clear igt test parameters
> as required for each tests
> 
> Signed-off-by: Vinod Govindapillai <vinod.govindapillai at intel.com>

LGTM
Reviewed-by: Santhosh Reddy Guddati <santhosh.reddy.guddati at intel.com>
> ---
>   tests/intel/kms_fbc_dirty_rect.c | 231 ++++++++++++-------------------
>   1 file changed, 90 insertions(+), 141 deletions(-)
> 
> diff --git a/tests/intel/kms_fbc_dirty_rect.c b/tests/intel/kms_fbc_dirty_rect.c
> index ea7a73124..4484355b2 100644
> --- a/tests/intel/kms_fbc_dirty_rect.c
> +++ b/tests/intel/kms_fbc_dirty_rect.c
> @@ -51,6 +51,10 @@
>   #define SQUARE_OFFSET 100
>   #define SQUARE_OFFSET_2 600
>   
> +#define N_FBS				4
> +#define MAIN_FB_IDX			0
> +#define DIRTY_RECT_FBS_START_IDX	1
> +
>   typedef struct {
>   	int drm_fd;
>   	int debugfs_fd;
> @@ -61,7 +65,7 @@ typedef struct {
>   	enum pipe pipe;
>   	u32 format;
>   
> -	igt_crc_t ref_crc;
> +	struct igt_fb fb[N_FBS];
>   
>   	enum {
>   		FEATURE_NONE  = 0,
> @@ -73,17 +77,12 @@ typedef struct {
>   	} feature;
>   } data_t;
>   
> -static void set_damage_clip(struct drm_mode_rect *damage, int x1, int y1, int x2, int y2)
> +static void set_damage_clip_w(struct drm_mode_rect *damage, int x1, int y1, int width, int height)
>   {
>   	damage->x1 = x1;
>   	damage->y1 = y1;
> -	damage->x2 = x2;
> -	damage->y2 = y2;
> -}
> -
> -static void set_damage_clip_w(struct drm_mode_rect *damage, int x1, int y1, int width, int height)
> -{
> -	set_damage_clip(damage, x1, y1, x1 + width, y1 + height);
> +	damage->x2 = x1 + width;
> +	damage->y2 = y1 + height;
>   }
>   
>   static void dirty_rect_draw_white_rects(data_t *data, struct igt_fb *fb,
> @@ -116,16 +115,11 @@ set_damage_area(igt_plane_t *plane,  struct drm_mode_rect *rects,
>   
>   static void
>   set_fb_and_collect_crc(data_t *data, igt_plane_t *plane, struct igt_fb *fb,
> -		       igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
> +		       igt_crc_t *crc)
>   {
>   	igt_plane_set_fb(plane, fb);
>   	igt_display_commit2(&data->display, COMMIT_ATOMIC);
>   
> -	if (!data->pipe_crc) {
> -		data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
> -						  IGT_PIPE_CRC_SOURCE_AUTO);
> -	}
> -
>   	igt_pipe_crc_start(data->pipe_crc);
>   	igt_pipe_crc_get_current(data->drm_fd, data->pipe_crc, crc);
>   	igt_pipe_crc_stop(data->pipe_crc);
> @@ -186,52 +180,45 @@ update_rect_with_dirtyfb(data_t *data, struct igt_fb *fb1, struct igt_fb *fb2,
>   
>   static void fbc_dirty_rectangle_dirtyfb(data_t *data)
>   {
> -	igt_pipe_crc_t *pipe_crc = data->pipe_crc;
> -	igt_display_t *display = &data->display;
> -	igt_output_t *output = data->output;
>   	igt_plane_t *primary;
> -	drmModeModeInfo *mode;
> -	struct igt_fb main_fb, fb2, fb3;
>   	struct drm_mode_rect full_rect, rect1, rect2;
>   	igt_crc_t main_crc, fb2_crc, fb3_crc, crc;
>   
> -	mode = igt_output_get_mode(output);
> -	igt_output_set_pipe(output, data->pipe);
> -	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
>   
> -	set_damage_clip_w(&full_rect, 0, 0, mode->hdisplay, mode->vdisplay);
> +	set_damage_clip_w(&full_rect, 0, 0, data->mode->hdisplay, data->mode->vdisplay);
>   	set_damage_clip_w(&rect1, SQUARE_OFFSET, SQUARE_OFFSET, SQUARE_SIZE, SQUARE_SIZE);
>   	set_damage_clip_w(&rect2, SQUARE_OFFSET_2, SQUARE_OFFSET_2, SQUARE_SIZE, SQUARE_SIZE);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay,
> -			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &main_fb);
> +			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[MAIN_FB_IDX]);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay,
> -			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &fb2);
> -	dirty_rect_draw_white_rects(data, &fb2, 1, &rect1);
> +			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[1]);
> +	dirty_rect_draw_white_rects(data, &data->fb[1], 1, &rect1);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay,
> -			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &fb3);
> -	dirty_rect_draw_white_rects(data, &fb3, 1, &rect2);
> +			    data->format, DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[2]);
> +	dirty_rect_draw_white_rects(data, &data->fb[2], 1, &rect2);
>   
>   	/* 1st screen - Empty blue screen */
>   	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &main_fb, pipe_crc, &main_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &main_crc);
>   
>   	/* 2nd screen - 1st white rect at 100, 100 - using damage area */
>   	set_damage_area(primary, &rect1, sizeof(rect1));
> -	set_fb_and_collect_crc(data, primary, &fb2, pipe_crc, &fb2_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[1], &fb2_crc);
>   
>   	/* 3rd screen - 2nd white rect at 600, 600 - using damage area.
>   	 * Now two white rects on screen
>   	 */
>   	set_damage_area(primary, &rect2, sizeof(rect2));
> -	set_fb_and_collect_crc(data, primary, &fb3, pipe_crc, &fb3_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[2], &fb3_crc);
>   
>   	/* 4th screen - clear the 2nd white rect at 600,600 with dirtyfb.
>   	 * Copy rect2 area from main_fb to fb3.
>   	 */
> -	update_rect_with_dirtyfb(data, &main_fb, &fb3, &rect2);
> +	update_rect_with_dirtyfb(data, &data->fb[MAIN_FB_IDX], &data->fb[2], &rect2);
>   	/* Now the screen must match 1st screen - with whole blue */
>   	igt_pipe_crc_collect_crc(data->pipe_crc, &crc);
>   	igt_assert_crc_equal(&crc, &main_crc);
> @@ -239,21 +226,10 @@ static void fbc_dirty_rectangle_dirtyfb(data_t *data)
>   	/* 5th screen - Copy the first rect at 100,100 with dirtyfb.
>   	 * Copy rect1 area from fb2 to fb3.
>   	 */
> -	update_rect_with_dirtyfb(data, &fb2, &fb3, &rect1);
> +	update_rect_with_dirtyfb(data, &data->fb[1], &data->fb[2], &rect1);
>   	/* Now the screen must match 2nd screen - with one rect at 100,100 */
>   	igt_pipe_crc_collect_crc(data->pipe_crc, &crc);
>   	igt_assert_crc_equal(&crc, &fb2_crc);
> -
> -	igt_plane_set_fb(primary, NULL);
> -	igt_remove_fb(data->drm_fd, &main_fb);
> -	igt_remove_fb(data->drm_fd, &fb2);
> -	igt_remove_fb(data->drm_fd, &fb3);
> -	igt_display_commit2(display, COMMIT_ATOMIC);
> -
> -	if (data->pipe_crc) {
> -		igt_pipe_crc_free(data->pipe_crc);
> -		data->pipe_crc = NULL;
> -	}
>   }
>   
>   /**
> @@ -270,56 +246,43 @@ static void fbc_dirty_rectangle_dirtyfb(data_t *data)
>    */
>   static void fbc_dirty_rectangle_outside_visible_region(data_t *data)
>   {
> -	igt_pipe_crc_t *pipe_crc = data->pipe_crc;
> -	igt_display_t *display = &data->display;
> -	igt_output_t *output = data->output;
>   	igt_plane_t *primary;
> -	struct igt_fb main_fb, rect_fb[3];
> -	struct drm_mode_rect rect[3], full_rect;
> -	igt_crc_t main_crc, rect_crc[3];
> +	struct drm_mode_rect rect[N_FBS];
> +	igt_crc_t rect_crc[N_FBS];
>   
> -	igt_output_set_pipe(output, data->pipe);
> -	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
> +
> +	set_damage_clip_w(&rect[0], 0, 0, data->mode->hdisplay + 200, data->mode->vdisplay + 200);
>   
> -	set_damage_clip(&full_rect, 0, 0, data->mode->hdisplay + 200, data->mode->vdisplay + 200);
>   	/* Rect Horizontally outside visible region */
> -	set_damage_clip_w(&rect[0], data->mode->hdisplay + 10, 100, SQUARE_SIZE, SQUARE_SIZE);
> +	set_damage_clip_w(&rect[1], data->mode->hdisplay + 10, 100, SQUARE_SIZE, SQUARE_SIZE);
> +
>   	/* Rect vertically outside visible region */
> -	set_damage_clip_w(&rect[1], 10, data->mode->vdisplay + 50, SQUARE_SIZE, SQUARE_SIZE);
> +	set_damage_clip_w(&rect[2], 10, data->mode->vdisplay + 50, SQUARE_SIZE, SQUARE_SIZE);
> +
>   	/* Rect Horizontally and vertically outside visible region */
> -	set_damage_clip_w(&rect[2], data->mode->hdisplay + 10, data->mode->vdisplay + 50,
> +	set_damage_clip_w(&rect[3], data->mode->hdisplay + 10, data->mode->vdisplay + 50,
>   			  SQUARE_SIZE, SQUARE_SIZE);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay + 200,
>   			    data->mode->vdisplay + 200, data->format,
> -			    DRM_FORMAT_MOD_LINEAR, 0.0, 1.0, 0.0, &main_fb);
> +			    DRM_FORMAT_MOD_LINEAR, 0.0, 1.0, 0.0, &data->fb[MAIN_FB_IDX]);
>   
> -	for (int i = 0; i < 3; i++) {
> +	for (int i = DIRTY_RECT_FBS_START_IDX; i < N_FBS; i++) {
>   		igt_create_color_fb(data->drm_fd, data->mode->hdisplay + 200,
>   				    data->mode->vdisplay + 200, data->format,
> -				    DRM_FORMAT_MOD_LINEAR, 0.0, 1.0, 0.0, &rect_fb[i]);
> -		dirty_rect_draw_white_rects(data, &rect_fb[i], 1, &rect[i]);
> +				    DRM_FORMAT_MOD_LINEAR, 0.0, 1.0, 0.0, &data->fb[i]);
> +		dirty_rect_draw_white_rects(data, &data->fb[i], 1, &rect[i]);
>   	}
>   
>   	/* Main rect */
> -	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &main_fb, pipe_crc, &main_crc);
> +	set_damage_area(primary, &rect[MAIN_FB_IDX], sizeof(rect[MAIN_FB_IDX]));
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &rect_crc[MAIN_FB_IDX]);
>   
> -	for (int i = 0; i < 3; i++) {
> +	for (int i = DIRTY_RECT_FBS_START_IDX; i < N_FBS; i++) {
>   		set_damage_area(primary, &rect[i], sizeof(rect[i]));
> -		set_fb_and_collect_crc(data, primary, &rect_fb[i], pipe_crc, &rect_crc[i]);
> -		igt_assert_crc_equal(&rect_crc[i], &main_crc);
> -	}
> -
> -	igt_plane_set_fb(primary, NULL);
> -	igt_remove_fb(data->drm_fd, &main_fb);
> -	for (int i = 0; i < 3; i++)
> -		igt_remove_fb(data->drm_fd, &rect_fb[i]);
> -	igt_display_commit2(display, COMMIT_ATOMIC);
> -
> -	if (data->pipe_crc) {
> -		igt_pipe_crc_free(data->pipe_crc);
> -		data->pipe_crc = NULL;
> +		set_fb_and_collect_crc(data, primary, &data->fb[i], &rect_crc[i]);
> +		igt_assert_crc_equal(&rect_crc[i], &rect_crc[MAIN_FB_IDX]);
>   	}
>   }
>   
> @@ -359,115 +322,119 @@ static void fbc_dirty_rectangle_outside_visible_region(data_t *data)
>    */
>   static void fbc_dirty_rectangle_basic(data_t *data)
>   {
> -	igt_display_t *display = &data->display;
> -	igt_output_t *output = data->output;
>   	igt_plane_t *primary;
> -	struct igt_fb main_fb;
> -	struct igt_fb rect_1_fb;
> -	struct igt_fb rect_2_fb;
> -	struct igt_fb rect_combined_fb;
>   	struct drm_mode_rect rect1;
>   	struct drm_mode_rect rect2;
>   	struct drm_mode_rect rect_combined[2];
>   	struct drm_mode_rect full_rect;
>   	igt_crc_t main_fb_crc, rect_1_fb_crc, rect_2_fb_crc, rect_combined_fb_crc, crc;
>   
> -	igt_output_set_pipe(output, data->pipe);
> -	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
>   
> -	set_damage_clip(&full_rect, 0, 0, data->mode->hdisplay-1, data->mode->vdisplay-1);
> -	set_damage_clip(&rect1, SQUARE_OFFSET, SQUARE_OFFSET, SQUARE_OFFSET + SQUARE_SIZE,
> -			SQUARE_OFFSET + SQUARE_SIZE);
> -	set_damage_clip(&rect2, SQUARE_OFFSET_2, SQUARE_OFFSET_2, SQUARE_OFFSET_2 + SQUARE_SIZE,
> -			SQUARE_OFFSET_2 + SQUARE_SIZE);
> -	set_damage_clip(&rect_combined[0], rect1.x1, rect1.y1, rect1.x2, rect1.y2);
> -	set_damage_clip(&rect_combined[1], rect2.x1, rect2.y1, rect2.x2, rect2.y2);
> +	set_damage_clip_w(&full_rect, 0, 0, data->mode->hdisplay, data->mode->vdisplay);
> +	set_damage_clip_w(&rect1, SQUARE_OFFSET, SQUARE_OFFSET, SQUARE_SIZE, SQUARE_SIZE);
> +	set_damage_clip_w(&rect2, SQUARE_OFFSET_2, SQUARE_OFFSET_2, SQUARE_SIZE, SQUARE_SIZE);
> +	rect_combined[0] = rect1;
> +	rect_combined[1] = rect2;
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay, data->format,
> -			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &main_fb);
> +			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[MAIN_FB_IDX]);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay, data->format,
> -			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &rect_1_fb);
> -	dirty_rect_draw_white_rects(data, &rect_1_fb, 1, &rect1);
> +			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[1]);
> +	dirty_rect_draw_white_rects(data, &data->fb[1], 1, &rect1);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay, data->format,
> -			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &rect_2_fb);
> -	dirty_rect_draw_white_rects(data, &rect_2_fb, 1, &rect2);
> +			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[2]);
> +	dirty_rect_draw_white_rects(data, &data->fb[2], 1, &rect2);
>   
>   	igt_create_color_fb(data->drm_fd, data->mode->hdisplay, data->mode->vdisplay, data->format,
> -			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &rect_combined_fb);
> -	dirty_rect_draw_white_rects(data, &rect_combined_fb, ARRAY_SIZE(rect_combined),
> +			    DRM_FORMAT_MOD_LINEAR, 0.0, 0.0, 1.0, &data->fb[3]);
> +	dirty_rect_draw_white_rects(data, &data->fb[3], ARRAY_SIZE(rect_combined),
>   				    rect_combined);
>   
>   	/* main_fb blank blue screen - get and store crc */
> -	set_fb_and_collect_crc(data, primary, &main_fb, data->pipe_crc, &main_fb_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &main_fb_crc);
>   
>   	/* Whole blue screen with one white rect and collect crc */
>   	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &rect_1_fb, data->pipe_crc, &rect_1_fb_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[1], &rect_1_fb_crc);
>   
>   	/* Second white rect and collect crc */
>   	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &rect_2_fb, data->pipe_crc, &rect_2_fb_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[2], &rect_2_fb_crc);
>   
>   	/* Both rects and collect crc */
>   	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &rect_combined_fb, data->pipe_crc,
> -			       &rect_combined_fb_crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[3], &rect_combined_fb_crc);
>   
>   	/* Put full blank screen back */
>   	set_damage_area(primary, &full_rect, sizeof(full_rect));
> -	set_fb_and_collect_crc(data, primary, &main_fb, data->pipe_crc, &crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &crc);
>   	igt_assert_crc_equal(&crc, &main_fb_crc);
>   
>   	/* Set combined rect - draw two white rects using damage area */
>   	set_damage_area(primary, rect_combined, sizeof(rect_combined));
> -	set_fb_and_collect_crc(data, primary, &rect_combined_fb, data->pipe_crc, &crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[3], &crc);
>   	igt_assert_crc_equal(&crc, &rect_combined_fb_crc);
>   
>   	/* Clear first rect using damage area. Only the second rect should be visible here! */
>   	set_damage_area(primary, &rect1, sizeof(rect1));
> -	set_fb_and_collect_crc(data, primary, &main_fb, data->pipe_crc, &crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &crc);
>   	igt_assert_crc_equal(&crc, &rect_2_fb_crc);
>   
>   	/* Clear the second rect as well. Now back to original blank screen */
>   	set_damage_area(primary, &rect2, sizeof(rect2));
> -	set_fb_and_collect_crc(data, primary, &main_fb, data->pipe_crc, &crc);
> +	set_fb_and_collect_crc(data, primary, &data->fb[MAIN_FB_IDX], &crc);
>   	igt_assert_crc_equal(&crc, &main_fb_crc);
> +}
>   
> -	igt_plane_set_fb(primary, NULL);
> -	igt_remove_fb(data->drm_fd, &main_fb);
> -	igt_remove_fb(data->drm_fd, &rect_1_fb);
> -	igt_remove_fb(data->drm_fd, &rect_2_fb);
> -	igt_remove_fb(data->drm_fd, &rect_combined_fb);
> -	igt_display_commit2(display, COMMIT_ATOMIC);
> +static void cleanup(data_t *data)

I think the cleanup is not called when igt_assert happens in the 
function, but the overall changes like creating common functions to 
preare and cleanup looks good.

> +{
> +	igt_remove_fb(data->drm_fd, &data->fb[0]);
> +	igt_remove_fb(data->drm_fd, &data->fb[1]);
> +	igt_remove_fb(data->drm_fd, &data->fb[2]);
> +	igt_remove_fb(data->drm_fd, &data->fb[3]);
>   
> -	if (data->pipe_crc) {
> -		igt_pipe_crc_free(data->pipe_crc);
> -		data->pipe_crc = NULL;
> -	}
> +	igt_pipe_crc_free(data->pipe_crc);
> +
> +	igt_output_set_pipe(data->output, PIPE_NONE);
> +
> +	igt_display_commit2(&data->display, COMMIT_ATOMIC);
>   }
>   
> -static void prepare_test(data_t *data, igt_output_t *output)
> +static bool prepare_test(data_t *data)
>   {
> +	igt_display_reset(&data->display);
> +
> +	data->mode = igt_output_get_mode(data->output);
> +	igt_output_set_pipe(data->output, data->pipe);
> +	data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
> +					  IGT_PIPE_CRC_SOURCE_AUTO);
> +
>   	igt_require_f(intel_fbc_supported_on_chipset(data->drm_fd, data->pipe),
>   		      "FBC not supported by the chipset on pipe\n");
>   
>   	if (psr_sink_support(data->drm_fd, data->debugfs_fd, PSR_MODE_1, NULL) ||
> -		psr_sink_support(data->drm_fd, data->debugfs_fd, PSR_MODE_2, NULL) ||
> -		psr_sink_support(data->drm_fd, data->debugfs_fd, PR_MODE, NULL)) {
> +	    psr_sink_support(data->drm_fd, data->debugfs_fd, PSR_MODE_2, NULL) ||
> +	    psr_sink_support(data->drm_fd, data->debugfs_fd, PR_MODE, NULL)) {
>   		igt_info("PSR is supported by the sink. Disabling PSR to test Dirty FBC functionality.\n");
> -		psr_disable(data->drm_fd, data->debugfs_fd, output);
> +		psr_disable(data->drm_fd, data->debugfs_fd, data->output);
>   	}
>   
>   	if (data->feature & FEATURE_FBC)
>   		intel_fbc_enable(data->drm_fd);
> +
> +	return intel_pipe_output_combo_valid(&data->display);
>   }
>   
>   static void fbc_dirty_rectangle_test(data_t *data, void (*test_func)(data_t *))
>   {
> -	prepare_test(data, data->output);
> +	if (!prepare_test(data))
> +		return;
> +
>   	test_func(data);
> +	cleanup(data);
>   }
>   
>   igt_main
> @@ -491,13 +458,7 @@ igt_main
>   
>   		for_each_pipe(&data.display, data.pipe) {
>   			for_each_valid_output_on_pipe(&data.display, data.pipe, data.output) {
> -				data.mode = igt_output_get_mode(data.output);
>   				data.format = DRM_FORMAT_XRGB8888;
> -				igt_display_reset(&data.display);
> -				igt_output_set_pipe(data.output, data.pipe);
> -
> -				if (!intel_pipe_output_combo_valid(&data.display))
> -					continue;
>   
>   				igt_dynamic_f("pipe-%s-%s",
>   					       kmstest_pipe_name(data.pipe),
> @@ -514,13 +475,7 @@ igt_main
>   
>   		for_each_pipe(&data.display, data.pipe) {
>   			for_each_valid_output_on_pipe(&data.display, data.pipe, data.output) {
> -				data.mode = igt_output_get_mode(data.output);
>   				data.format = DRM_FORMAT_XRGB8888;
> -				igt_display_reset(&data.display);
> -				igt_output_set_pipe(data.output, data.pipe);
> -
> -				if (!intel_pipe_output_combo_valid(&data.display))
> -					continue;
>   
>   				igt_dynamic_f("pipe-%s-%s",
>   					       kmstest_pipe_name(data.pipe),
> @@ -540,12 +495,6 @@ igt_main
>   
>   		for_each_pipe(&data.display, data.pipe) {
>   			for_each_valid_output_on_pipe(&data.display, data.pipe, data.output) {
> -				data.mode = igt_output_get_mode(data.output);
> -				igt_display_reset(&data.display);
> -				igt_output_set_pipe(data.output, data.pipe);
> -
> -				if (!intel_pipe_output_combo_valid(&data.display))
> -					continue;
>   
>   				for (int i = 0; i < num_formats; i++) {
>   					igt_dynamic_f("pipe-%s-%s-format-%s",



More information about the igt-dev mailing list