[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