All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH 14/22] flip_test: factor out the event state
Date: Tue, 16 Oct 2012 17:34:48 +0300	[thread overview]
Message-ID: <1350398096-3649-15-git-send-email-imre.deak@intel.com> (raw)
In-Reply-To: <1350398096-3649-1-git-send-email-imre.deak@intel.com>

Factor out the status vars that are specific to the flip events into a
separate structure. This will allow us tracking the vblank events with
the same code.

We move the increment of the flip event counter to the end of the test
loop, but this shouldn't affect anything. This is the only functional
change.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 tests/flip_test.c |  105 ++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 72 insertions(+), 33 deletions(-)

diff --git a/tests/flip_test.c b/tests/flip_test.c
index 6cfc0ec..966089f 100644
--- a/tests/flip_test.c
+++ b/tests/flip_test.c
@@ -63,6 +63,26 @@ struct type_name {
 	const char *name;
 };
 
+struct event_state {
+	const char *name;
+
+	/*
+	 * Event data for the last event that has already passed our check.
+	 * Updated using the below current_* vars in update_state().
+	 */
+	struct timeval last_ts;			/* kernel reported timestamp */
+	struct timeval last_received_ts;	/* the moment we received it */
+
+	/*
+	 * Event data for for the current event that we just received and
+	 * going to check for validity. Set in event_handler().
+	 */
+	struct timeval current_ts;		/* kernel reported timestamp */
+	struct timeval current_received_ts;	/* the moment we received it */
+
+	int count;				/* # of events of this type */
+};
+
 struct test_output {
 	uint32_t id;
 	int mode_valid;
@@ -71,16 +91,13 @@ struct test_output {
 	drmModeConnector *connector;
 	int crtc;
 	int flags;
-	int count;
 	unsigned int current_fb_id;
 	unsigned int fb_width;
 	unsigned int fb_height;
 	unsigned int fb_ids[2];
 	struct kmstest_fb fb_info[2];
-	struct timeval current_flip_received;
-	struct timeval current_flip_ts;
-	struct timeval last_flip_received;
-	struct timeval last_flip_ts;
+
+	struct event_state flip_state;
 };
 
 static void emit_dummy_load(struct test_output *o)
@@ -176,44 +193,52 @@ analog_tv_connector(struct test_output *o)
 		connector_type == DRM_MODE_CONNECTOR_Composite;
 }
 
+static void event_handler(struct event_state *es, unsigned int frame,
+			  unsigned int sec, unsigned int usec)
+{
+	gettimeofday(&es->current_received_ts, NULL);
+	es->current_ts.tv_sec = sec;
+	es->current_ts.tv_usec = usec;
+}
+
 static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
 			      unsigned int usec, void *data)
 {
 	struct test_output *o = data;
 
-	o->current_flip_ts.tv_sec = sec;
-	o->current_flip_ts.tv_usec = usec;
-
-	gettimeofday(&o->current_flip_received, NULL);
+	event_handler(&o->flip_state, frame, sec, usec);
 }
 
-static void check_all_state(struct test_output *o)
+static void check_state(struct test_output *o, struct event_state *es)
 {
 	struct timeval diff;
 	double usec_interflip;
 
-	timersub(&o->current_flip_ts, &o->current_flip_received, &diff);
-
+	timersub(&es->current_ts, &es->current_received_ts, &diff);
 	if (diff.tv_sec > 0 || (diff.tv_sec == 0 && diff.tv_usec > 2000)) {
-		fprintf(stderr, "pageflip timestamp delayed for too long: %is, %iusec\n",
-			(int) diff.tv_sec, (int) diff.tv_usec);
+		fprintf(stderr, "%s ts delayed for too long: %is, %iusec\n",
+			es->name, (int)diff.tv_sec, (int)diff.tv_usec);
 		exit(5);
 	}
 
-	if (!timercmp(&o->last_flip_received, &o->current_flip_ts, <)) {
-		fprintf(stderr, "pageflip ts before the pageflip was issued!\n");
-		timersub(&o->current_flip_ts, &o->last_flip_received, &diff);
+	if (!timercmp(&es->last_received_ts, &es->current_ts, <)) {
+		fprintf(stderr, "%s ts before the %s was issued!\n",
+				es->name, es->name);
+
+		timersub(&es->current_ts, &es->last_received_ts, &diff);
 		fprintf(stderr, "timerdiff %is, %ius\n",
 			(int) diff.tv_sec, (int) diff.tv_usec);
 		exit(6);
 	}
 
-	if (o->count > 1 && o->flags & TEST_CHECK_TS && !analog_tv_connector(o)) {
-		timersub(&o->current_flip_ts, &o->last_flip_ts, &diff);
-		usec_interflip = 1.0 / ((double) o->mode.vrefresh) * 1000.0 * 1000.0;
 
-		if (fabs((((double) diff.tv_usec) - usec_interflip) / usec_interflip) > 0.005) {
-			fprintf(stderr, "inter-flip timestamp jitter: %is, %ius\n",
+	if (es->count > 1 && (o->flags & TEST_CHECK_TS) && (!analog_tv_connector(o))) {
+		timersub(&es->current_ts, &es->last_ts, &diff);
+		usec_interflip = 1.0 / ((double)o->mode.vrefresh) * 1000.0 * 1000.0;
+		if (fabs((((double) diff.tv_usec) - usec_interflip) /
+		    usec_interflip) > 0.005) {
+			fprintf(stderr, "inter-%s ts jitter: %is, %ius\n",
+				es->name,
 				(int) diff.tv_sec, (int) diff.tv_usec);
 			/* atm this is way too easy to hit, thanks to the hpd
 			 * poll helper :( hence make it non-fatal for now */
@@ -222,6 +247,11 @@ static void check_all_state(struct test_output *o)
 	}
 }
 
+static void check_all_state(struct test_output *o)
+{
+	check_state(o, &o->flip_state);
+}
+
 static void run_test_step(struct test_output *o)
 {
 	unsigned int new_fb_id;
@@ -230,8 +260,9 @@ static void run_test_step(struct test_output *o)
 
 	/* pan before the flip completes */
 	if (o->flags & TEST_PAN) {
-		int x_ofs = o->count * 10 > o->mode.hdisplay ?
-			    o->mode.hdisplay : o->count * 10;
+		int count = o->flip_state.count;
+		int x_ofs = count * 10 > o->mode.hdisplay ?
+			    o->mode.hdisplay : count * 10;
 
 		if (drmModeSetCrtc(drm_fd, o->crtc, o->fb_ids[o->current_fb_id],
 				   x_ofs, 0, &o->id, 1, &o->mode)) {
@@ -249,7 +280,7 @@ static void run_test_step(struct test_output *o)
 	o->current_fb_id = !o->current_fb_id;
 	new_fb_id = o->fb_ids[o->current_fb_id];
 
-	if (o->flags & TEST_EINVAL && o->count > 1)
+	if ((o->flags & TEST_EINVAL) && o->flip_state.count > 1)
 		assert(do_page_flip(o, new_fb_id) == expected_einval);
 
 	if (o->flags & TEST_MODESET) {
@@ -266,7 +297,6 @@ static void run_test_step(struct test_output *o)
 	if (o->flags & TEST_DPMS)
 		do_or_die(set_dpms(o, DRM_MODE_DPMS_ON));
 
-	o->count++;
 	printf("."); fflush(stdout);
 
 	do_or_die(do_page_flip(o, new_fb_id));
@@ -292,10 +322,16 @@ static void run_test_step(struct test_output *o)
 		assert(do_page_flip(o, new_fb_id) == expected_einval);
 }
 
+static void update_state(struct event_state *es)
+{
+	es->last_received_ts = es->current_received_ts;
+	es->last_ts = es->current_ts;
+	es->count++;
+}
+
 static void update_all_state(struct test_output *o)
 {
-	o->last_flip_received = o->current_flip_received;
-	o->last_flip_ts = o->current_flip_ts;
+	update_state(&o->flip_state);
 }
 
 static void connector_find_preferred_mode(struct test_output *o, int crtc_id)
@@ -417,17 +453,19 @@ fb_is_bound(struct test_output *o, int fb)
 	return mode.mode_valid && mode.fb_id == fb;
 }
 
-static void check_final_state(struct test_output *o, unsigned int ellapsed)
+static void check_final_state(struct test_output *o, struct event_state *es,
+			      unsigned int ellapsed)
 {
 	/* Verify we drop no frames, but only if it's not a TV encoder, since
 	 * those use some funny fake timings behind userspace's back. */
 	if (o->flags & TEST_CHECK_TS && !analog_tv_connector(o)) {
 		int expected;
+		int count = es->count;
 
 		expected = ellapsed * o->mode.vrefresh / (1000 * 1000);
-		if (o->count < expected * 99/100) {
+		if (count < expected * 99/100) {
 			fprintf(stderr, "dropped frames, expected %d, counted %d, encoder type %d\n",
-				expected, o->count, o->encoder->encoder_type);
+				expected, count, o->encoder->encoder_type);
 			exit(3);
 		}
 	}
@@ -539,7 +577,7 @@ static void flip_mode(struct test_output *o, int crtc, int duration)
 	if (o->flags & TEST_CHECK_TS)
 		sleep(1);
 
-	gettimeofday(&o->last_flip_received, NULL);
+	gettimeofday(&o->flip_state.last_ts, NULL);
 
 	if (do_page_flip(o, o->fb_ids[1])) {
 		fprintf(stderr, "failed to page flip: %s\n", strerror(errno));
@@ -551,7 +589,7 @@ static void flip_mode(struct test_output *o, int crtc, int duration)
 
 	ellapsed = event_loop(o, duration);
 
-	check_final_state(o, ellapsed);
+	check_final_state(o, &o->flip_state, ellapsed);
 
 	fprintf(stdout, "\npage flipping on crtc %d, connector %d: PASSED\n",
 		crtc, o->id);
@@ -581,6 +619,7 @@ static int run_test(int duration, int flags)
 			memset(&o, 0, sizeof(o));
 			o.id = resources->connectors[c];
 			o.flags = flags;
+			o.flip_state.name = "flip";
 
 			flip_mode(&o, resources->crtcs[i], duration);
 		}
-- 
1.7.9.5

  parent reply	other threads:[~2012-10-16 14:35 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-16 14:34 [PATCH 00/22] i-g-t: flip_test: add vblank test cases Imre Deak
2012-10-16 14:34 ` [PATCH 01/22] drmtest: add function to remove an DRM FB Imre Deak
2012-10-16 14:34 ` [PATCH 02/22] flip_test: free FBs after each test run Imre Deak
2012-10-16 14:34 ` [PATCH 03/22] flip_test: reset the state for " Imre Deak
2012-10-16 14:34 ` [PATCH 04/22] flip_test: check drmHandleEvents()' return value Imre Deak
2012-10-16 14:34 ` [PATCH 05/22] test_flip: fix checking for delayed event reception Imre Deak
2012-10-16 14:34 ` [PATCH 06/22] flip_test: store fb width, height in test context object Imre Deak
2012-10-16 14:34 ` [PATCH 07/22] flip_test: factor out drmModePageFlip Imre Deak
2012-10-16 14:34 ` [PATCH 08/22] flip_test: move output panning inside the flip_handler Imre Deak
2012-10-16 14:59   ` Daniel Vetter
2012-10-16 14:34 ` [PATCH 09/22] flip_test: factor out the event loop/wait for event logic Imre Deak
2012-10-16 14:34 ` [PATCH 10/22] flip_test: factor out the final state check Imre Deak
2012-10-16 14:34 ` [PATCH 11/22] flip_test: store current flip/received timestamps in the context obj Imre Deak
2012-10-16 14:34 ` [PATCH 12/22] flip_test: split the flip handler into logical parts Imre Deak
2012-10-16 14:34 ` [PATCH 13/22] flip_test: swap the order of check state/run test step Imre Deak
2012-10-16 14:34 ` Imre Deak [this message]
2012-10-16 14:34 ` [PATCH 15/22] flip_test: don't skip checks for sequence #1 Imre Deak
2012-10-16 14:34 ` [PATCH 16/22] flip_test: store crtc_idx in the test context obj Imre Deak
2012-10-16 14:34 ` [PATCH 17/22] flip_test: unify the name of the current test in status messages Imre Deak
2012-10-16 14:34 ` [PATCH 18/22] flip_test: make page flip tests conditional Imre Deak
2012-10-16 14:34 ` [PATCH 19/22] flip_test: add logic to track pending events Imre Deak
2012-10-16 14:34 ` [PATCH 20/22] flip_test: add event sequence number tracking Imre Deak
2012-10-16 14:34 ` [PATCH 21/22] flip_test: add check to see if any event has occured Imre Deak
2012-10-16 14:34 ` [PATCH 22/22] flip_test: add wait-for-vblank tests Imre Deak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1350398096-3649-15-git-send-email-imre.deak@intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.