[Piglit] [PATCH 8/9] Added timeouts to tests that use SwapBuffersMsc.

Jamey Sharp jamey at minilop.net
Wed Apr 23 17:27:22 PDT 2014


From: TheoH <Theo0x48 at gmail.com>

We've observed hangs on some drivers in these calls, which make it
harder to run the rest of the Piglit test suite.

Signed-off-by: Theo Hill <Theo0x48 at gmail.com>
Signed-off-by: Jamey Sharp <jamey at minilop.net>
---
 .../glx_oml_sync_control/swapbuffersmsc-divisor-zero.c     | 14 ++++++++++++--
 tests/spec/glx_oml_sync_control/swapbuffersmsc-return.c    | 13 +++++++++++--
 tests/spec/glx_oml_sync_control/timing.c                   | 12 ++++++++++++
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/tests/spec/glx_oml_sync_control/swapbuffersmsc-divisor-zero.c b/tests/spec/glx_oml_sync_control/swapbuffersmsc-divisor-zero.c
index d83905c..fa6db1c 100644
--- a/tests/spec/glx_oml_sync_control/swapbuffersmsc-divisor-zero.c
+++ b/tests/spec/glx_oml_sync_control/swapbuffersmsc-divisor-zero.c
@@ -46,8 +46,18 @@ draw(Display *dpy)
 	int64_t start_ust = 0xd0, start_msc = 0xd0, start_sbc = 0xd0;
 	int64_t swapped_ust = 0xd0, swapped_msc = 0xd0, swapped_sbc = 0xd0;
 	int64_t current_ust = 0xd0, current_msc = 0xd0, current_sbc = 0xd0;
-	int64_t target_msc, outstanding_sbc;
+	int64_t target_msc, outstanding_sbc, msc_delta = 5;
 	bool already_wrapped = false;
+	int32_t rate_num, rate_den;
+	double timeout;
+
+	if (!glXGetMscRateOML(dpy, win, &rate_num, &rate_den)) {
+		timeout = 1.0 / 10; /* Assume MSC rate is at least 10Hz */
+	} else {
+		timeout = (double) rate_den / rate_num;
+	}
+	piglit_set_timeout(timeout * msc_delta * 2, PIGLIT_FAIL); /* Safety factor 2 */
+
 
 	glXGetSyncValuesOML(dpy, win, &start_ust, &start_msc, &start_sbc);
 	if (start_sbc != 0) {
@@ -63,7 +73,7 @@ wrap:
 	glClear(GL_COLOR_BUFFER_BIT);
 
 	/* Queue a swap for 5 frames from when we started. */
-	target_msc = start_msc + 5;
+	target_msc = start_msc + msc_delta;
 	glXSwapBuffersMscOML(dpy, win, target_msc, 0, 0);
 	outstanding_sbc++;
 
diff --git a/tests/spec/glx_oml_sync_control/swapbuffersmsc-return.c b/tests/spec/glx_oml_sync_control/swapbuffersmsc-return.c
index a37fc9a..74d5873 100644
--- a/tests/spec/glx_oml_sync_control/swapbuffersmsc-return.c
+++ b/tests/spec/glx_oml_sync_control/swapbuffersmsc-return.c
@@ -49,7 +49,16 @@ draw(Display *dpy)
 	int64_t start_ust = 0xd0, start_msc = 0xd0, start_sbc = 0xd0;
 	int64_t next_sbc;
 	bool pass = true;
-	int i;
+	int i, loops = 3;
+	int32_t rate_num, rate_den;
+	double timeout;
+
+	if (!glXGetMscRateOML(dpy, win, &rate_num, &rate_den)) {
+		timeout = 1.0 / 10; /* Assume MSC rate is at least 10Hz */
+	} else {
+		timeout = (double)rate_den / rate_num;
+	}
+	piglit_set_timeout(timeout * loops * 2, PIGLIT_FAIL); /* Safety factor 2 */
 
 	if (swap_interval != -1) {
 #if defined(GLX_MESA_swap_control)
@@ -81,7 +90,7 @@ draw(Display *dpy)
 	}
 	next_sbc = start_sbc + 1;
 
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < loops; i++) {
 		int64_t ret_sbc;
 
 		glClearColor(0.0, 1.0, 0.0, 0.0);
diff --git a/tests/spec/glx_oml_sync_control/timing.c b/tests/spec/glx_oml_sync_control/timing.c
index decb352..e81beef 100644
--- a/tests/spec/glx_oml_sync_control/timing.c
+++ b/tests/spec/glx_oml_sync_control/timing.c
@@ -57,6 +57,11 @@ static double get_stddev(struct stats *stats) {
 	return sqrt(stats->M2 / (stats->n - 1));
 }
 
+static double max(double a, double b)
+{
+	return a > b ? a : b;
+}
+
 static enum piglit_result
 draw(Display *dpy)
 {
@@ -67,6 +72,7 @@ draw(Display *dpy)
 	double expected_msc_wallclock_duration = 0.0;
 	int32_t rate_num, rate_den;
 	unsigned int i;
+	double timeout;
 
 	if (!glXGetSyncValuesOML(dpy, win, &last_ust, &last_msc, &last_sbc)) {
 		fprintf(stderr, "Initial glXGetSyncValuesOML failed\n");
@@ -80,10 +86,16 @@ draw(Display *dpy)
 
 	if (!glXGetMscRateOML(dpy, win, &rate_num, &rate_den)) {
 		fprintf(stderr, "glXGetMscRateOML failed, can't test MSC duration\n");
+		timeout = 1.0 / 10; /* Assume MSC rate is at least 10Hz */
 	} else {
 		expected_msc_wallclock_duration = 1e6 * rate_den / rate_num;
+		timeout = expected_msc_wallclock_duration / 1e6;
 	}
 
+	timeout *= loops * max(1, max(target_msc_delta, divisor));
+	piglit_set_timeout(timeout * 2, PIGLIT_FAIL); /* Safety factor 2 */
+
+
 	for (i = 0; i < loops; i++) {
 		int64_t swapped_ust = 0xd0, swapped_msc = 0xd0, swapped_sbc = 0xd0;
 		int64_t new_ust = 0xd0, new_msc = 0xd0, new_sbc = 0xd0, new_timestamp;
-- 
1.8.5.3



More information about the Piglit mailing list