Re: [igt-dev] [PATCH i-g-t] tests/kms_vrr: Extend to cover full VRR range
From: Navare, Manasi <hidden>
Date: 2021-02-26 21:12:50
On Mon, Feb 22, 2021 at 07:06:29PM +0530, Bhanuprakash Modem wrote:
quoted hunk ↗ jump to hunk
As we are restricting the vrr max to current mode vrefresh, we are not covering the full vrr range with default mode. So, instead of running tests on default mode, loop through the all connector modes and find the mode with max refresh rate to exercise full vrr range. Cc: Ville Syrjälä <redacted> Cc: Nicholas Kazlauskas <redacted> Suggested-by: Manasi Navare <redacted> Signed-off-by: Bhanuprakash Modem <redacted> --- tests/kms_vrr.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-)diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c index e4ea74c17..e9071c220 100644 --- a/tests/kms_vrr.c +++ b/tests/kms_vrr.c@@ -33,6 +33,13 @@ */ #define TEST_DURATION_NS (5000000000ull) +#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x" +#define DRM_MODE_ARG(m) \ + (m)->name, (m)->vrefresh, (m)->clock, \ + (m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \ + (m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \ + (m)->type, (m)->flags + enum { TEST_NONE = 0, TEST_DPMS = 1 << 0,@@ -111,6 +118,26 @@ static uint64_t rate_from_refresh(uint64_t refresh) return NSECS_PER_SEC / refresh; } +/* Instead of running on default mode, loop through the connector modes + * and find the mode with max refresh rate to exercise full vrr range. + */ +static drmModeModeInfo output_mode_with_maxrate(igt_output_t *output) +{ + int i; + drmModeConnectorPtr connector = output->config.connector; + drmModeModeInfo mode = *igt_output_get_mode(output); + + igt_debug("Default Mode " DRM_MODE_FMT "\n", DRM_MODE_ARG(&mode)); + + for (i = 0; i < connector->count_modes; i++) + if (connector->modes[i].vrefresh > mode.vrefresh)
We should also make sure we only use the mode whose refresh rate lies between vrr min and max so check if vrr vmax >= connector->modes[i].vrefresh and only then use it to override I have seen some panels have modes with 75Hz but max vrr refresh is only 60Hz. Makes sense? Manasi
quoted hunk ↗ jump to hunk
+ mode = connector->modes[i]; + + igt_debug("Override Mode " DRM_MODE_FMT "\n", DRM_MODE_ARG(&mode)); + + return mode; +} + /* Read min and max vrr range from the connector debugfs. * - min range should be less than the current mode vfreq * - if max range is grater than the current mode vfreq, consider@@ -176,7 +203,7 @@ static void set_vrr_on_pipe(data_t *data, enum pipe pipe, bool enabled) /* Prepare the display for testing on the given pipe. */ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe) { - drmModeModeInfo mode = *igt_output_get_mode(output); + drmModeModeInfo mode = output_mode_with_maxrate(output); cairo_t *cr; /* Reset output */@@ -202,6 +229,7 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe) /* Take care of any required modesetting before the test begins. */ data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY); igt_plane_set_fb(data->primary, &data->fb0); + igt_output_override_mode(output, &mode); /* Clear vrr_enabled state before enabling it, because * it might be left enabled if the previous test fails.@@ -269,6 +297,9 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe, */ event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE); + igt_debug("event_ns - last_event_ns: %"PRIu64"\n", + (event_ns - last_event_ns)); + /* * Check if the difference between the two flip timestamps * was within the required threshold from the expected rate.@@ -316,15 +347,19 @@ static void test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags) { uint32_t result; - vtest_ns_t vtest_ns = get_test_rate_ns(data, output); - range_t range = get_vrr_range(data, output); - uint64_t rate = vtest_ns.mid; + vtest_ns_t vtest_ns; + range_t range; + uint64_t rate; + + prepare_test(data, output, pipe); + + vtest_ns = get_test_rate_ns(data, output); + range = get_vrr_range(data, output); + rate = vtest_ns.mid; igt_info("VRR Test execution on %s, PIPE_%s with VRR range: (%u-%u) Hz\n", output->name, kmstest_pipe_name(pipe), range.min, range.max); - prepare_test(data, output, pipe); - set_vrr_on_pipe(data, pipe, 1); /*@@ -394,6 +429,7 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags) /* Clean-up */ igt_plane_set_fb(data->primary, NULL); igt_output_set_pipe(output, PIPE_NONE); + igt_output_override_mode(output, NULL); igt_display_commit2(&data->display, COMMIT_ATOMIC); igt_remove_fb(data->drm_fd, &data->fb1);-- 2.20.1
_______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev