[igt-dev] [PATCH i-g-t] HAX tests/kms_frontbuffer_tracking: Hack in chamelium frame dump support

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Mon Apr 15 08:58:02 UTC 2019


Initialize the chamelium when starting the tests, and keep the reference FB's.
When we get a CRC mismatch, we dump all the frames in the current directory since
we started capturing, and include the reference frame as well.

Also unhide the nop methods by default for testing.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 lib/igt_chamelium.c              |   2 +-
 lib/igt_chamelium.h              |   1 +
 tests/kms_frontbuffer_tracking.c | 265 ++++++++++++++++++++++++++-----
 3 files changed, 226 insertions(+), 42 deletions(-)

diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index 9bba4b1fd1c8..aa141fdaf9f8 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -940,7 +940,7 @@ static pixman_image_t *convert_frame_format(pixman_image_t *src,
 	return converted;
 }
 
-static cairo_surface_t *convert_frame_dump_argb32(const struct chamelium_frame_dump *dump)
+cairo_surface_t *convert_frame_dump_argb32(const struct chamelium_frame_dump *dump)
 {
 	cairo_surface_t *dump_surface;
 	pixman_image_t *image_bgr;
diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h
index 233ead8556f1..72661862214d 100644
--- a/lib/igt_chamelium.h
+++ b/lib/igt_chamelium.h
@@ -131,5 +131,6 @@ void chamelium_assert_frame_match_or_dump(struct chamelium *chamelium,
 void chamelium_crop_analog_frame(struct chamelium_frame_dump *dump, int width,
 				 int height);
 void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump);
+cairo_surface_t *convert_frame_dump_argb32(const struct chamelium_frame_dump *dump);
 
 #endif /* IGT_CHAMELIUM_H */
diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c
index 63724585d432..2db944e1fc0a 100644
--- a/tests/kms_frontbuffer_tracking.c
+++ b/tests/kms_frontbuffer_tracking.c
@@ -27,6 +27,7 @@
 #include "igt.h"
 #include "igt_sysfs.h"
 #include "igt_psr.h"
+#include "igt_chamelium.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -158,6 +159,8 @@ struct {
 	igt_display_t display;
 
 	drm_intel_bufmgr *bufmgr;
+	struct chamelium *chamelium;
+	struct chamelium_port *cham_port;
 } drm;
 
 struct {
@@ -187,9 +190,12 @@ struct {
 
 igt_pipe_crc_t *pipe_crc;
 igt_crc_t *wanted_crc;
+struct igt_fb *wanted_fb;
+
 struct {
 	bool initialized;
 	igt_crc_t crc;
+	struct igt_fb frame;
 } blue_crcs[FORMAT_COUNT];
 
 /* The goal of this structure is to easily allow us to deal with cases where we
@@ -211,6 +217,7 @@ struct draw_pattern_info {
 
 	bool initialized[FORMAT_COUNT];
 	igt_crc_t *crcs[FORMAT_COUNT];
+	struct igt_fb *frames[FORMAT_COUNT];
 };
 
 /* Draw big rectangles on the screen. */
@@ -372,6 +379,47 @@ static void init_mode_params(struct modeset_params *params,
 	params->sprite.h = 64;
 }
 
+static drmModeConnection
+reprobe_connector(struct chamelium_port *port)
+{
+	drmModeConnector *connector;
+	drmModeConnection status;
+
+	igt_debug("Reprobing %s...\n", chamelium_port_get_name(port));
+	connector = chamelium_port_get_connector(drm.chamelium, port, true);
+	igt_assert(connector);
+	status = connector->connection;
+
+	drmModeFreeConnector(connector);
+	return status;
+}
+
+static void
+wait_for_connector(struct chamelium_port *port,
+		   drmModeConnection status)
+{
+	bool finished = false;
+
+	igt_debug("Waiting for %s to %sconnect...\n",
+		  chamelium_port_get_name(port),
+		  status == DRM_MODE_DISCONNECTED ? "dis" : "");
+
+	/*
+	 * Rely on simple reprobing so we don't fail tests that don't require
+	 * that hpd events work in the event that hpd doesn't work on the system
+	 */
+	igt_until_timeout(20) {
+		if (reprobe_connector(port) == status) {
+			finished = true;
+			return;
+		}
+
+		usleep(50000);
+	}
+
+	igt_assert(finished);
+}
+
 static bool find_connector(bool edp_only, bool pipe_a,
 			   igt_output_t *forbidden_output,
 			   enum pipe forbidden_pipe,
@@ -381,6 +429,60 @@ static bool find_connector(bool edp_only, bool pipe_a,
 	igt_output_t *output;
 	enum pipe pipe;
 
+	if (drm.chamelium) {
+		int count, i, j;
+		struct chamelium_port **ports, *port;
+
+		ports = chamelium_get_ports(drm.chamelium, &count);
+
+		for (i = 0; i < count; i++) {
+			drmModeConnector *conn =
+				chamelium_port_get_connector(drm.chamelium,
+							     ports[i], false);
+
+			output = igt_output_from_connector(&drm.display, conn),
+			drmModeFreeConnector(conn);
+
+			if (0 && edp_only && output->config.connector->connector_type !=
+					DRM_MODE_CONNECTOR_eDP)
+				continue;
+
+			if (output == forbidden_output)
+				continue;
+
+			port = ports[i];
+			pipe = PIPE_NONE;
+			if (pipe_a && (output->config.valid_crtc_idx_mask & 1))
+				pipe = PIPE_A;
+			else if (!pipe_a)
+				for (j = 0; j < IGT_MAX_PIPES; j++)
+					if (j != forbidden_pipe &&
+					    (output->config.valid_crtc_idx_mask & (j << 1))) {
+						pipe = j;
+						break;
+					}
+
+			if (pipe != PIPE_NONE) {
+				int edid_id = chamelium_new_edid(drm.chamelium,
+								 igt_kms_get_base_edid());
+
+				chamelium_port_set_edid(drm.chamelium, port, edid_id);
+				chamelium_plug(drm.chamelium, port);
+				wait_for_connector(port, DRM_MODE_CONNECTED);
+
+				/* force reprobe */
+				igt_output_set_pipe(output, PIPE_NONE);
+
+				if (!forbidden_output)
+					drm.cham_port = port;
+
+				*ret_output = output;
+				*ret_pipe = pipe;
+				return true;
+			}
+		}
+	}
+
 	for_each_pipe_with_valid_output(&drm.display, pipe, output) {
 		drmModeConnectorPtr c = output->config.connector;
 
@@ -1186,20 +1288,18 @@ static void collect_crc(igt_crc_t *crc)
 
 static void init_blue_crc(enum pixel_format format)
 {
-	struct igt_fb blue;
-
 	if (blue_crcs[format].initialized)
 		return;
 
 	create_fb(format, prim_mode_params.mode->hdisplay,
 		  prim_mode_params.mode->vdisplay, opt.tiling, PLANE_PRI,
-		  &blue);
+		  &blue_crcs[format].frame);
 
-	fill_fb(&blue, COLOR_PRIM_BG);
+	fill_fb(&blue_crcs[format].frame, COLOR_PRIM_BG);
 
 	igt_output_set_pipe(prim_mode_params.output, prim_mode_params.pipe);
 	igt_output_override_mode(prim_mode_params.output, prim_mode_params.mode);
-	igt_plane_set_fb(prim_mode_params.primary.plane, &blue);
+	igt_plane_set_fb(prim_mode_params.primary.plane, &blue_crcs[format].frame);
 	igt_display_commit(&drm.display);
 
 	if (!pipe_crc) {
@@ -1213,8 +1313,8 @@ static void init_blue_crc(enum pixel_format format)
 	print_crc("Blue CRC:  ", &blue_crcs[format].crc);
 
 	igt_display_reset(&drm.display);
-
-	igt_remove_fb(drm.fd, &blue);
+	if (!drm.cham_port)
+		igt_remove_fb(drm.fd, &blue_crcs[format].frame);
 
 	blue_crcs[format].initialized = true;
 }
@@ -1223,37 +1323,38 @@ static void init_crcs(enum pixel_format format,
 		      struct draw_pattern_info *pattern)
 {
 	int r, r_;
-	struct igt_fb tmp_fbs[pattern->n_rects];
 
 	if (pattern->initialized[format])
 		return;
 
 	pattern->crcs[format] = calloc(pattern->n_rects,
 				       sizeof(*(pattern->crcs[format])));
+	pattern->frames[format] = calloc(pattern->n_rects,
+				       sizeof(*(pattern->frames[format])));
 
 	for (r = 0; r < pattern->n_rects; r++)
 		create_fb(format, prim_mode_params.mode->hdisplay,
 			  prim_mode_params.mode->vdisplay, opt.tiling,
-			  PLANE_PRI, &tmp_fbs[r]);
+			  PLANE_PRI, &pattern->frames[format][r]);
 
 	for (r = 0; r < pattern->n_rects; r++)
-		fill_fb(&tmp_fbs[r], COLOR_PRIM_BG);
+		fill_fb(&pattern->frames[format][r], COLOR_PRIM_BG);
 
 	if (pattern->frames_stack) {
 		for (r = 0; r < pattern->n_rects; r++)
 			for (r_ = 0; r_ <= r; r_++)
-				draw_rect_igt_fb(pattern, &tmp_fbs[r],
+				draw_rect_igt_fb(pattern, &pattern->frames[format][r],
 						 IGT_DRAW_PWRITE, r_);
 	} else {
 		for (r = 0; r < pattern->n_rects; r++)
-			draw_rect_igt_fb(pattern, &tmp_fbs[r], IGT_DRAW_PWRITE,
+			draw_rect_igt_fb(pattern, &pattern->frames[format][r], IGT_DRAW_PWRITE,
 					 r);
 	}
 
 	igt_output_set_pipe(prim_mode_params.output, prim_mode_params.pipe);
 	igt_output_override_mode(prim_mode_params.output, prim_mode_params.mode);
 	for (r = 0; r < pattern->n_rects; r++) {
-		igt_plane_set_fb(prim_mode_params.primary.plane, &tmp_fbs[r]);
+		igt_plane_set_fb(prim_mode_params.primary.plane, &pattern->frames[format][r]);
 		igt_display_commit(&drm.display);
 
 		collect_crc(&pattern->crcs[format][r]);
@@ -1267,7 +1368,8 @@ static void init_crcs(enum pixel_format format,
 	igt_display_reset(&drm.display);
 
 	for (r = 0; r < pattern->n_rects; r++)
-		igt_remove_fb(drm.fd, &tmp_fbs[r]);
+		if (!drm.cham_port)
+			igt_remove_fb(drm.fd, &pattern->frames[format][r]);
 
 	pattern->initialized[format] = true;
 }
@@ -1292,6 +1394,11 @@ static void teardown_drm(void)
 	close(drm.fd);
 }
 
+static void setup_chamelium(void)
+{
+	drm.chamelium = chamelium_init(drm.fd);
+}
+
 static void setup_modeset(void)
 {
 	igt_require(init_modeset_cached_params());
@@ -1449,6 +1556,7 @@ static void setup_drrs(void)
 static void setup_environment(void)
 {
 	setup_drm();
+	setup_chamelium();
 	setup_modeset();
 
 	setup_fbc();
@@ -1562,6 +1670,56 @@ static int adjust_assertion_flags(const struct test_mode *t, int flags)
 	return flags;
 }
 
+
+static void dump_frame(int idx, char *name)
+{
+	struct chamelium_frame_dump *frame = chamelium_read_captured_frame(drm.chamelium, idx);
+	cairo_surface_t *surf;
+	igt_assert(frame);
+
+	surf = convert_frame_dump_argb32(frame);
+	igt_assert_eq(cairo_surface_write_to_png(surf, name), CAIRO_STATUS_SUCCESS);
+	cairo_surface_destroy(surf);
+	chamelium_destroy_frame_dump(frame);
+}
+
+static void check_crc_equal(igt_crc_t *ref, igt_crc_t *crc, struct igt_fb *fb)
+{
+	int count, i = 0, lim;
+	cairo_surface_t *surf;
+	igt_crc_t *crcs;
+	char name[256];
+
+	if (!drm.chamelium)
+		return igt_assert_crc_equal(ref, crc);
+
+	if (igt_check_crc_equal(ref, crc))
+		return;
+
+	igt_wait_for_vblank(drm.fd, prim_mode_params.pipe);
+	igt_wait_for_vblank(drm.fd, prim_mode_params.pipe);
+	chamelium_stop_capture(drm.chamelium, 0);
+	crcs = chamelium_read_captured_crcs(drm.chamelium, &count);
+
+	lim = chamelium_get_frame_limit(drm.chamelium, drm.cham_port, 0, 0);
+	igt_info("Read %i of %i frames\n", count, lim);
+
+	snprintf(name, sizeof(name), "p%u-reference.png", getpid());
+
+	surf = igt_get_cairo_surface(drm.fd, fb);
+	igt_assert_eq(cairo_surface_write_to_png(surf, name), CAIRO_STATUS_SUCCESS);
+	cairo_surface_destroy(surf);
+
+	for (i = 0; i < count; i++) {
+		snprintf(name, sizeof(name), "p%u-frame-%02i.png", getpid(), i);
+		dump_frame(i, name);
+	}
+
+	free(crcs);
+
+	igt_assert(0);
+}
+
 static void do_crc_assertions(int flags)
 {
 	igt_crc_t crc;
@@ -1573,7 +1731,7 @@ static void do_crc_assertions(int flags)
 	print_crc("Calculated CRC:", &crc);
 
 	igt_assert(wanted_crc);
-	igt_assert_crc_equal(&crc, wanted_crc);
+	check_crc_equal(wanted_crc, &crc, wanted_fb);
 }
 
 static void do_status_assertions(int flags)
@@ -1668,10 +1826,20 @@ static void __do_assertions(const struct test_mode *t, int flags,
 
 static void enable_prim_screen_and_wait(const struct test_mode *t)
 {
+	if (drm.cham_port)
+		chamelium_start_capture(drm.chamelium, drm.cham_port, 0, 0, 0, 0);
+
 	fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
 	set_mode_for_params(&prim_mode_params);
 
+	if (!pipe_crc) {
+		pipe_crc = igt_pipe_crc_new(drm.fd, prim_mode_params.pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
+		igt_assert(pipe_crc);
+		igt_pipe_crc_start(pipe_crc);
+	}
+
 	wanted_crc = &blue_crcs[t->format].crc;
+	wanted_fb = &blue_crcs[t->format].frame;
 	fbc_update_last_action();
 
 	do_assertions(ASSERT_NO_ACTION_CHANGE);
@@ -1679,6 +1847,9 @@ static void enable_prim_screen_and_wait(const struct test_mode *t)
 
 static void enable_both_screens_and_wait(const struct test_mode *t)
 {
+	if (drm.cham_port)
+		chamelium_start_capture(drm.chamelium, drm.cham_port, 0, 0, 0, 0);
+
 	fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
 	fill_fb_region(&scnd_mode_params.primary, COLOR_SCND_BG);
 
@@ -1687,13 +1858,8 @@ static void enable_both_screens_and_wait(const struct test_mode *t)
 
 	igt_display_commit2(&drm.display, drm.display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
 
-	if (!pipe_crc) {
-		pipe_crc = igt_pipe_crc_new(drm.fd, prim_mode_params.pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
-		igt_assert(pipe_crc);
-		igt_pipe_crc_start(pipe_crc);
-	}
-
 	wanted_crc = &blue_crcs[t->format].crc;
+	wanted_fb = &blue_crcs[t->format].frame;
 	fbc_update_last_action();
 
 	do_assertions(ASSERT_NO_ACTION_CHANGE);
@@ -1906,10 +2072,12 @@ static void rte_subtest(const struct test_mode *t)
 	}
 }
 
-static void update_wanted_crc(const struct test_mode *t, igt_crc_t *crc)
+static void update_wanted_crc(const struct test_mode *t, igt_crc_t *crc, struct igt_fb *fb)
 {
-	if (t->screen == SCREEN_PRIM)
+	if (t->screen == SCREEN_PRIM) {
 		wanted_crc = crc;
+		wanted_fb = fb;
+	}
 }
 
 static bool op_disables_psr(const struct test_mode *t,
@@ -1997,7 +2165,8 @@ static void draw_subtest(const struct test_mode *t)
 	for (r = 0; r < pattern->n_rects; r++) {
 		igt_info("Drawing rect %d\n", r);
 		draw_rect(pattern, target, t->method, r);
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				&pattern->frames[t->format][r]);
 		do_assertions(assertions);
 	}
 }
@@ -2065,7 +2234,8 @@ static void multidraw_subtest(const struct test_mode *t)
 					wc_used = true;
 
 				update_wanted_crc(t,
-						  &pattern->crcs[t->format][r]);
+						  &pattern->crcs[t->format][r],
+						  &pattern->frames[t->format][r]);
 
 				assertions = used_method != IGT_DRAW_MMAP_GTT ?
 					     ASSERT_LAST_ACTION_CHANGED :
@@ -2079,7 +2249,8 @@ static void multidraw_subtest(const struct test_mode *t)
 
 			fill_fb_region(target, COLOR_PRIM_BG);
 
-			update_wanted_crc(t, &blue_crcs[t->format].crc);
+			update_wanted_crc(t, &blue_crcs[t->format].crc,
+					  &blue_crcs[t->format].frame);
 			do_assertions(ASSERT_NO_ACTION_CHANGE);
 		}
 	}
@@ -2136,6 +2307,7 @@ static void badformat_subtest(const struct test_mode *t)
 	set_mode_for_params(&prim_mode_params);
 
 	wanted_crc = &blue_crcs[t->format].crc;
+	wanted_fb = &blue_crcs[t->format].frame;
 
 	if (!fbc_valid)
 		assertions |= ASSERT_FBC_DISABLED;
@@ -2198,7 +2370,8 @@ static void slow_draw_subtest(const struct test_mode *t)
 		draw_rect(pattern, target, t->method, r);
 		sleep(2);
 
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 
 		if (t->feature & FEATURE_DRRS)
 			do_assertions(ASSERT_DRRS_LOW);
@@ -2322,7 +2495,8 @@ static void flip_subtest(const struct test_mode *t)
 		if (r != 0)
 			draw_rect(pattern, &params->primary, t->method, r - 1);
 		draw_rect(pattern, &params->primary, t->method, r);
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 
 		page_flip_for_params(params, t->flip);
 
@@ -2372,7 +2546,8 @@ static void fliptrack_subtest(const struct test_mode *t, enum flip_type type)
 		do_assertions(0);
 
 		draw_rect(pattern, &params->primary, t->method, r);
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 
 		do_assertions(ASSERT_PSR_DISABLED);
 	}
@@ -2407,7 +2582,8 @@ static void move_subtest(const struct test_mode *t)
 
 	/* Just paint the right color since we start at 0x0. */
 	draw_rect(pattern, reg, t->method, 0);
-	update_wanted_crc(t, &pattern->crcs[t->format][0]);
+	update_wanted_crc(t, &pattern->crcs[t->format][0],
+			  &pattern->frames[t->format][0]);
 
 	do_assertions(assertions);
 
@@ -2420,7 +2596,8 @@ static void move_subtest(const struct test_mode *t)
 		igt_fb_set_size(reg->fb, reg->plane, rect.w, rect.h);
 		igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
 
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 
 		do_assertions(assertions);
 
@@ -2458,7 +2635,8 @@ static void onoff_subtest(const struct test_mode *t)
 
 	/* Just paint the right color since we start at 0x0. */
 	draw_rect(pattern, pick_target(t, params), t->method, 0);
-	update_wanted_crc(t, &pattern->crcs[t->format][0]);
+	update_wanted_crc(t, &pattern->crcs[t->format][0],
+			  &pattern->frames[t->format][0]);
 	do_assertions(assertions);
 
 	for (r = 0; r < 4; r++) {
@@ -2468,7 +2646,8 @@ static void onoff_subtest(const struct test_mode *t)
 			igt_plane_set_fb(reg->plane, NULL);
 			igt_display_commit(&drm.display);
 
-			update_wanted_crc(t, &blue_crcs[t->format].crc);
+			update_wanted_crc(t, &blue_crcs[t->format].crc,
+					  &blue_crcs[t->format].frame);
 
 		} else {
 			igt_plane_set_fb(reg->plane, reg->fb);
@@ -2476,7 +2655,8 @@ static void onoff_subtest(const struct test_mode *t)
 			igt_fb_set_size(reg->fb, reg->plane, reg->w, reg->h);
 			igt_display_commit(&drm.display);
 
-			update_wanted_crc(t, &pattern->crcs[t->format][0]);
+			update_wanted_crc(t, &pattern->crcs[t->format][0],
+					  &pattern->frames[t->format][0]);
 		}
 
 		do_assertions(assertions);
@@ -2525,7 +2705,8 @@ static void fullscreen_plane_subtest(const struct test_mode *t)
 
 	igt_plane_set_fb(params->sprite.plane, &fullscreen_fb);
 	igt_display_commit(&drm.display);
-	update_wanted_crc(t, &pattern->crcs[t->format][0]);
+	update_wanted_crc(t, &pattern->crcs[t->format][0],
+			  &pattern->frames[t->format][0]);
 
 	switch (t->screen) {
 	case SCREEN_PRIM:
@@ -2547,7 +2728,8 @@ static void fullscreen_plane_subtest(const struct test_mode *t)
 
 	if (t->screen == SCREEN_PRIM)
 		assertions = ASSERT_LAST_ACTION_CHANGED;
-	update_wanted_crc(t, &blue_crcs[t->format].crc);
+	update_wanted_crc(t, &blue_crcs[t->format].crc,
+			  &blue_crcs[t->format].frame);
 	do_assertions(assertions);
 
 	igt_remove_fb(drm.fd, &fullscreen_fb);
@@ -2797,7 +2979,8 @@ static void farfromfence_subtest(const struct test_mode *t)
 
 	for (r = 0; r < pattern->n_rects; r++) {
 		draw_rect(pattern, target, t->method, r);
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 
 		/* GTT draws disable PSR. */
 		do_assertions(assertions | ASSERT_PSR_DISABLED);
@@ -3048,7 +3231,8 @@ static void basic_subtest(const struct test_mode *t)
 			params->primary.fb = (params->primary.fb == fb1) ? &fb2 : fb1;
 
 			fill_fb_region(&params->primary, COLOR_PRIM_BG);
-			update_wanted_crc(t, &blue_crcs[t->format].crc);
+			update_wanted_crc(t, &blue_crcs[t->format].crc,
+					  &blue_crcs[t->format].frame);
 
 			page_flip_for_params(params, t->flip);
 			do_assertions(assertions);
@@ -3057,7 +3241,8 @@ static void basic_subtest(const struct test_mode *t)
 		}
 
 		draw_rect(pattern, &params->primary, method, r);
-		update_wanted_crc(t, &pattern->crcs[t->format][r]);
+		update_wanted_crc(t, &pattern->crcs[t->format][r],
+				  &pattern->frames[t->format][r]);
 		do_assertions(assertions);
 	}
 
@@ -3260,8 +3445,6 @@ static const char *flip_str(enum flip_type flip)
 		if (!opt.show_hidden && t.pipes == PIPE_DUAL &&		   \
 		    t.screen == SCREEN_OFFSCREEN)			   \
 			continue;					   \
-		if (!opt.show_hidden && t.feature == FEATURE_NONE)	   \
-			continue;					   \
 		if (!opt.show_hidden && t.fbs == FBS_SHARED &&		   \
 		    (t.plane == PLANE_CUR || t.plane == PLANE_SPR))	   \
 			continue;
-- 
2.20.1



More information about the igt-dev mailing list