[PATCH i-g-t v1 2/2] tests/kms_vrr: Add DRRS verification in seamless RR test

Naladala Ramanaidu ramanaidu.naladala at intel.com
Thu Jan 30 23:52:46 UTC 2025


Add a check to see if DRRS has switched to a lower refresh rate
when the display is idle.

Signed-off-by: Naladala Ramanaidu <ramanaidu.naladala at intel.com>
---
 tests/kms_vrr.c | 43 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 37 insertions(+), 6 deletions(-)

diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
index fac7cb4f7..731f0c77a 100644
--- a/tests/kms_vrr.c
+++ b/tests/kms_vrr.c
@@ -707,6 +707,12 @@ test_seamless_rr_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint3
 	vtest_ns_t vtest_ns;
 	uint64_t rate[] = {0};
 	bool vrr = !!(flags & TEST_SEAMLESS_VRR);
+	uint64_t last_vb_event_us, vb_event_us;
+	uint64_t diff_us[5];
+	uint64_t result_us, min_rate_us;
+	uint64_t threshold = 1000;
+	bool drrs_flag;
+	int i;
 
 	igt_info("Use HIGH_RR Mode as default (VRR: %s): ", vrr ? "ON" : "OFF");
 	kmstest_dump_mode(&data->switch_modes[HIGH_RR_MODE]);
@@ -717,6 +723,7 @@ test_seamless_rr_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint3
 	if (vrr)
 		set_vrr_on_pipe(data, pipe, false, true);
 	else {
+		set_vrr_on_pipe(data, pipe, false, false);
 		/*
 		 * Sink with DRRS and VRR can be in downclock mode.
 		 * so switch to High clock mode as test preparation
@@ -749,12 +756,36 @@ test_seamless_rr_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint3
 	igt_output_override_mode(output, &data->switch_modes[HIGH_RR_MODE]);
 	igt_assert(igt_display_try_commit_atomic(&data->display, 0, NULL) == 0);
 
-	rate[0] = vtest_ns.rate_ns;
-	result = flip_and_measure(data, output, pipe, rate, 1, data->duration_ns);
-	igt_assert_f(vrr ? (result > 75) : (result < 10),
-		     "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR %s threshold %s, result was %u%%\n",
-		     ((data->range.max + data->range.min) / 2), rate[0],
-		     vrr ? "on" : "off", vrr ? "not reached" : "exceeded", result);
+	if (vrr) {
+		rate[0] = vtest_ns.rate_ns;
+		result = flip_and_measure(data, output, pipe, rate, 1, data->duration_ns);
+		igt_assert_f(vrr ? (result > 75) : (result < 10),
+			     "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR %s threshold %s, result was %u%%\n",
+			     ((data->range.max + data->range.min) / 2), rate[0],
+			     vrr ? "on" : "off", vrr ? "not reached" : "exceeded", result);
+	} else {
+		min_rate_us = (vtest_ns.min/1000);
+
+		sleep(5);
+
+		last_vb_event_us = vb_event_us = wait_for_vblank(data, pipe);
+
+		for (i = 0; i < 5; i++) {
+			vb_event_us = wait_for_vblank(data, pipe);
+			diff_us[i] = vb_event_us - last_vb_event_us;
+			last_vb_event_us = vb_event_us;
+		}
+
+		for (i = 0; i < 5; i++)
+			result_us += diff_us[i];
+
+		result_us = (result_us/5);
+
+		drrs_flag = (llabs((long long)(result_us - min_rate_us)) <= threshold);
+
+		igt_assert_f(drrs_flag, "DRRS not switch to lower RR\n");
+		igt_info("DRRS switch to lower RR\n");
+	}
 }
 
 static void
-- 
2.25.1



More information about the igt-dev mailing list