Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode
@ 2024-03-19 16:33 Manasi Navare
  2024-03-19 18:46 ` ✓ CI.xeBAT: success for tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode (rev3) Patchwork
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Manasi Navare @ 2024-03-19 16:33 UTC (permalink / raw)
  To: igt-dev
  Cc: Manasi Navare, Drew Davenport, Bhanuprakash Modem,
	Ville Syrjälä, Sean Paul

This subtest validates LRR fastset functionality by testing seamless switching
without full modeset to any of the virtual LRR mode within VRR range.
Here we start from highest refresh rate mode and then switch to virtual LRR
modes in the steps of 10Hz within the VRR range.

This is used to test the LRR fastset functionality of the driver.

v3:
- Fix build error due to rebase (Manasi)

Cc: Drew Davenport <ddavenport@chromium.org>
Cc: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Manasi Navare <navaremanasi@chromium.org>
---
 tests/kms_vrr.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
index 15c62b34b..316b626c3 100644
--- a/tests/kms_vrr.c
+++ b/tests/kms_vrr.c
@@ -70,6 +70,11 @@
  * Description: Oscillates between highest and lowest refresh each frame for
  *              manual flicker profiling
  *
+ * SUBTEST: seamless-virtual-rr-switch
+ * Description: Test to create a Virtual Mode in VRR range and switch to it
+ * 		without a full modeset.
+ * Functionality: LRR
+ *
  * SUBTEST: negative-basic
  * Description: Make sure that VRR should not be enabled on the Non-VRR panel.
  */
@@ -92,11 +97,13 @@ enum {
 	TEST_FASTSET = 1 << 6,
 	TEST_MAXMIN = 1 << 7,
 	TEST_NEGATIVE = 1 << 8,
+	TEST_SEAMLESS_VIRTUAL_RR = 1 << 9,
 };
 
 enum {
 	HIGH_RR_MODE,
 	LOW_RR_MODE,
+	VIRTUAL_RR_MODE,
 	RR_MODES_COUNT,
 };
 
@@ -214,6 +221,19 @@ low_rr_mode_with_same_res(igt_output_t *output, unsigned int vrr_min)
 	return mode;
 }
 
+static drmModeModeInfo
+virtual_rr_vrr_range_mode(igt_output_t *output, unsigned int virtual_refresh_rate)
+{
+	int i;
+	drmModeConnectorPtr connector = output->config.connector;
+	drmModeModeInfo mode = *igt_output_get_mode(output);
+	uint64_t clock_hz = mode.clock * 1000;
+
+	mode.vtotal = clock_hz / (mode.htotal * virtual_refresh_rate);
+	mode.vrefresh = virtual_refresh_rate;
+	return mode;
+}
+
 /* Read min and max vrr range from the connector debugfs. */
 static range_t
 get_vrr_range(data_t *data, igt_output_t *output)
@@ -641,6 +661,48 @@ test_seamless_rr_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint3
 		     vrr ? "on" : "off", vrr ? "not reached" : "exceeded", result);
 }
 
+static void
+test_seamless_virtual_rr_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
+{
+	uint32_t result;
+	uint64_t rate;
+	unsigned int vrefresh;
+
+	igt_info("Use HIGH_RR Mode as default\n");
+	kmstest_dump_mode(&data->switch_modes[HIGH_RR_MODE]);
+
+	prepare_test(data, output, pipe);
+	rate = rate_from_refresh(data->switch_modes[HIGH_RR_MODE].vrefresh);
+
+	/*
+	 * Sink with DRR and VRR can be in downclock mode so
+	 * switch to highest refresh rate mode.
+	 */
+	igt_output_override_mode(output, &data->switch_modes[HIGH_RR_MODE]);
+	igt_assert(igt_display_try_commit_atomic(&data->display, DRM_MODE_PAGE_FLIP_EVENT, NULL) == 0);
+
+	result = flip_and_measure(data, output, pipe, rate, 1, TEST_DURATION_NS);
+	igt_assert_f(result > 75,
+		     "Refresh rate (%u Hz) %"PRIu64"ns: Target threshold not reached, result was %u%%\n",
+		     data->switch_modes[HIGH_RR_MODE].vrefresh, rate, result);
+
+	/* Switch to Virtual RR */
+	for (vrefresh = data->range.min + 10; vrefresh < data->range.max; vrefresh += 10) {
+
+		data->switch_modes[VIRTUAL_RR_MODE] = virtual_rr_vrr_range_mode(output, vrefresh);
+		igt_info("Requesting Virtual Mode with Refresh Rate (%u Hz): \n", vrefresh);
+		kmstest_dump_mode(&data->switch_modes[VIRTUAL_RR_MODE]);
+		igt_output_override_mode(output, &data->switch_modes[VIRTUAL_RR_MODE]);
+		igt_assert(igt_display_try_commit_atomic(&data->display, 0, NULL) == 0);
+
+		rate = rate_from_refresh(vrefresh);
+		result = flip_and_measure(data, output, pipe, rate, 1, TEST_DURATION_NS);
+		igt_assert_f(result > 75,
+			     "Refresh rate (%u Hz) %"PRIu64"ns: Target threshold not reached, result was %u%%\n",
+			     vrefresh, rate, result);
+	}
+}
+
 static void test_cleanup(data_t *data, enum pipe pipe, igt_output_t *output)
 {
 	if (vrr_capable(output))
@@ -686,7 +748,7 @@ static bool output_constraint(data_t *data, igt_output_t *output, uint32_t flags
 	igt_output_override_mode(output, &data->switch_modes[HIGH_RR_MODE]);
 
 	/* Search for a low refresh rate mode. */
-	if (!(flags & (TEST_SEAMLESS_VRR | TEST_SEAMLESS_DRRS)))
+	if (!(flags & (TEST_SEAMLESS_VRR | TEST_SEAMLESS_DRRS | TEST_SEAMLESS_VIRTUAL_RR)))
 		return true;
 
 	data->switch_modes[LOW_RR_MODE] = low_rr_mode_with_same_res(output, data->range.min);
@@ -841,6 +903,10 @@ igt_main_args("drs:", long_opts, help_str, opt_handler, &data)
 			     "between flip timestamps converges to the requested rate");
 		igt_subtest_with_dynamic("flip-basic-fastset")
 			run_vrr_test(&data, test_basic, TEST_FASTSET);
+
+		igt_describe("Test to switch to any custom virtual mode in VRR range without modeset.");
+		igt_subtest_with_dynamic("seamless-virtual-rr-switch")
+			run_vrr_test(&data, test_seamless_virtual_rr_basic, TEST_SEAMLESS_VIRTUAL_RR);
 	}
 
 	igt_fixture {
-- 
2.44.0.291.gc1ea87d7ee-goog


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2024-03-25 22:51 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-19 16:33 [PATCH v3] tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode Manasi Navare
2024-03-19 18:46 ` ✓ CI.xeBAT: success for tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode (rev3) Patchwork
2024-03-19 18:47 ` ✓ Fi.CI.BAT: " Patchwork
2024-03-20 15:13 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-03-21  8:04 ` [PATCH v3] tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode Modem, Bhanuprakash
2024-03-21 21:15   ` Manasi Navare
2024-03-22  5:20 ` Modem, Bhanuprakash
2024-03-25 22:51   ` Manasi Navare
2024-03-22 11:53 ` ✓ CI.xeBAT: success for tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode (rev4) Patchwork
2024-03-22 12:06 ` ✓ Fi.CI.BAT: " Patchwork
2024-03-23  8:24 ` ✗ Fi.CI.IGT: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox