[PATCH v3] tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode
Modem, Bhanuprakash
bhanuprakash.modem at intel.com
Thu Mar 21 08:04:02 UTC 2024
Hi Manasi,
Thanks for the patch.
I don't have much exposure on this virtual LRR modes. From this patch,
atleast I understood that you are trying to switch different refresh
rates (without modeset) within the VRR range. And we are pretty much
doing the same with the subtest 'igt at kms_vrr@flip-basic-fastset' with 3
different rates.
Is there anything else we are going to achieve with this patch? Please
throw some knowledge on this.
- Bhanu
On 19-03-2024 10:03 pm, Manasi Navare wrote:
> 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 at chromium.org>
> Cc: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Sean Paul <seanpaul at chromium.org>
> Signed-off-by: Manasi Navare <navaremanasi at 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 {
More information about the igt-dev
mailing list