[PATCH v3] tests/kms_vrr: Add a subtest for seamless modeset to a virtual LRR mode

Manasi Navare navaremanasi at chromium.org
Thu Mar 21 21:15:35 UTC 2024


Hi Bhanu,

Thanks for the review.
With the Seamless Virtual RR test case that I have added, we are
essentially testing creating a Virtual Mode explicitly defined and
that switch to such a mode can happen seamlessly using the VRR
fastset/LRR functionality.
Here we also cover the entire VRR range by defining the virtual mode
in the 10Hz refresh rate steps across the entire VRR range.

So this is different than just flip-basic-fastset test. Could you
please review this?

Manasi

On Thu, Mar 21, 2024 at 1:04 AM Modem, Bhanuprakash
<bhanuprakash.modem at intel.com> wrote:
>
> 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