From efca2504a53f86c93e727a055cc52a2ff5653d55 Mon Sep 17 00:00:00 2001 From: Karthik B S Date: Tue, 31 May 2022 14:19:28 +0530 Subject: tests/kms_async_flips: Convert tests to dynamic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert test to dynamic subtests at pipe-output level. Also, restrict the test to run with one output by default. Add support to run on all outputs using the extended flag. v2: -Get the mode after igt_display_reset() (Bhanu) v3: -Move patch to start of series to avoid code duplication (Bhanu) -Use for_each_pipe() instead of for_each_pipe_static() (Bhanu) v4: -Add helper to avoid code duplication (Andre) v5: -Add more details in the commit message (Kamil) Signed-off-by: Karthik B S Reviewed-by: Bhanuprakash Modem Reviewed-by: André Almeida --- tests/kms_async_flips.c | 80 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c index 1701883b..c9129bb0 100644 --- a/tests/kms_async_flips.c +++ b/tests/kms_async_flips.c @@ -51,6 +51,7 @@ typedef struct { struct igt_fb bufs[4]; igt_display_t display; drmModeConnectorPtr connector; + igt_output_t *output; unsigned long flip_timestamp_us; double flip_interval; igt_pipe_crc_t *pipe_crc; @@ -58,6 +59,9 @@ typedef struct { int flip_count; int frame_count; bool flip_pending; + bool extended; + enum pipe pipe; + bool alternate_sync_async; } data_t; static drmModeConnectorPtr find_connector_for_modeset(data_t *data) @@ -159,7 +163,7 @@ static void require_monotonic_timestamp(int fd) "Monotonic timestamps not supported\n"); } -static void test_async_flip(data_t *data, bool alternate_sync_async) +static void test_async_flip(data_t *data) { int ret, frame; long long int fps; @@ -172,7 +176,7 @@ static void test_async_flip(data_t *data, bool alternate_sync_async) do { int flags = DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_PAGE_FLIP_EVENT; - if (alternate_sync_async) { + if (data->alternate_sync_async) { flags &= ~DRM_MODE_PAGE_FLIP_ASYNC; ret = drmModePageFlip(data->drm_fd, data->crtc_id, @@ -216,7 +220,7 @@ static void test_async_flip(data_t *data, bool alternate_sync_async) gettimeofday(&end, NULL); timersub(&end, &start, &diff); - if (alternate_sync_async) { + if (data->alternate_sync_async) { igt_assert_f(data->flip_interval < 1000.0 / (data->refresh_rate * MIN_FLIPS_PER_FRAME), "Flip interval not significantly smaller than vblank interval\n" "Flip interval: %lfms, Refresh Rate = %dHz, Threshold = %d\n", @@ -226,7 +230,7 @@ static void test_async_flip(data_t *data, bool alternate_sync_async) frame++; } while (diff.tv_sec < RUN_TIME); - if (!alternate_sync_async) { + if (!data->alternate_sync_async) { fps = frame * 1000 / RUN_TIME; igt_assert_f((fps / 1000) > (data->refresh_rate * MIN_FLIPS_PER_FRAME), "FPS should be significantly higher than the refresh rate\n"); @@ -540,9 +544,45 @@ static void test_crc(data_t *data) igt_assert_lt(data->frame_count * 2, data->flip_count); } -igt_main +static void run_test(data_t *data, void (*test)(data_t *)) +{ + igt_output_t *output; + enum pipe pipe; + + for_each_pipe(&data->display, pipe) { + for_each_valid_output_on_pipe(&data->display, pipe, output) { + igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), output->name) { + data->output = output; + data->pipe = pipe; + test(data); + } + + if (!data->extended) + break; + } + } +} + +static int opt_handler(int opt, int opt_index, void *_data) +{ + data_t *data = _data; + + switch (opt) { + case 'e': + data->extended = true; + break; + } + + return IGT_OPT_HANDLER_SUCCESS; +} + +static const char help_str[] = + " --e \t\tRun the extended tests\n"; + +static data_t data; + +igt_main_args("e", NULL, help_str, opt_handler, &data) { - static data_t data; int i; igt_fixture { @@ -561,28 +601,32 @@ igt_main test_init(&data); igt_describe("Wait for page flip events in between successive asynchronous flips"); - igt_subtest("async-flip-with-page-flip-events") - test_async_flip(&data, false); + igt_subtest_with_dynamic("async-flip-with-page-flip-events") { + data.alternate_sync_async = false; + run_test(&data, test_async_flip); + } igt_describe("Alternate between sync and async flips"); - igt_subtest("alternate-sync-async-flip") - test_async_flip(&data, true); + igt_subtest_with_dynamic("alternate-sync-async-flip") { + data.alternate_sync_async = true; + run_test(&data, test_async_flip); + } igt_describe("Verify that the async flip timestamp does not coincide with either previous or next vblank"); - igt_subtest("test-time-stamp") - test_timestamp(&data); + igt_subtest_with_dynamic("test-time-stamp") + run_test(&data, test_timestamp); igt_describe("Verify that the DRM_IOCTL_MODE_CURSOR passes after async flip"); - igt_subtest("test-cursor") - test_cursor(&data); + igt_subtest_with_dynamic("test-cursor") + run_test(&data, test_cursor); igt_describe("Negative case to verify if changes in fb are rejected from kernel as expected"); - igt_subtest("invalid-async-flip") - test_invalid(&data); + igt_subtest_with_dynamic("invalid-async-flip") + run_test(&data, test_invalid); igt_describe("Use CRC to verify async flip scans out the correct framebuffer"); - igt_subtest("crc") - test_crc(&data); + igt_subtest_with_dynamic("crc") + run_test(&data, test_crc); igt_fixture { for (i = 0; i < ARRAY_SIZE(data.bufs); i++) -- cgit v1.2.3