From 02153f109bd422d93cfce7f5aa9d7b0e22fab13c Mon Sep 17 00:00:00 2001 From: Swati Sharma Date: Mon, 20 Jun 2022 21:29:57 +0530 Subject: tests/kms_panel_fitting: Convert test to dynamic Convert the existing subtests to dynamic subtests at pipe/output level. v2: -Fixed if-else block -Removed redundant check Signed-off-by: Swati Sharma Reviewed-by: Bhanuprakash Modem --- tests/kms_panel_fitting.c | 204 +++++++++++++++++++++++----------------------- 1 file changed, 101 insertions(+), 103 deletions(-) diff --git a/tests/kms_panel_fitting.c b/tests/kms_panel_fitting.c index 9f607376..478c16bd 100644 --- a/tests/kms_panel_fitting.c +++ b/tests/kms_panel_fitting.c @@ -28,6 +28,11 @@ IGT_TEST_DESCRIPTION("Test display panel fitting"); +enum test_type { + TEST_LEGACY, + TEST_ATOMIC, +}; + typedef struct { int drm_fd; igt_display_t display; @@ -80,109 +85,95 @@ static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe, igt_display_commit2(display, s); } -static void test_panel_fitting(data_t *d) +static void +test_panel_fitting_legacy(data_t *d, igt_display_t *display, + const enum pipe pipe, igt_output_t *output) { - igt_display_t *display = &d->display; - igt_output_t *output; - enum pipe pipe; - int valid_tests = 0; + drmModeModeInfo *mode, native_mode; + bool is_plane_scaling_active = true; - for_each_pipe_with_valid_output(display, pipe, output) { - drmModeModeInfo *mode, native_mode; - bool is_plane_scaling_active = true; - - /* Check that the "scaling mode" property has been set. */ - if (!igt_output_has_prop(output, IGT_CONNECTOR_SCALING_MODE)) - continue; + igt_output_set_pipe(output, pipe); - cleanup_crtc(d); - igt_output_set_pipe(output, pipe); + mode = igt_output_get_mode(output); + native_mode = *mode; - mode = igt_output_get_mode(output); - native_mode = *mode; + /* allocate fb2 with image */ + igt_create_pattern_fb(d->drm_fd, mode->hdisplay / 2, mode->vdisplay / 2, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_MOD_LINEAR, &d->fb2); - /* allocate fb2 with image */ - igt_create_pattern_fb(d->drm_fd, mode->hdisplay / 2, mode->vdisplay / 2, - DRM_FORMAT_XRGB8888, - DRM_FORMAT_MOD_LINEAR, &d->fb2); + /* set up display to enable panel fitting */ + if (is_amdgpu_device(display->drm_fd)) { + mode->hdisplay = 800; + mode->vdisplay = 600; + } else { + mode->hdisplay = 640; + mode->vdisplay = 480; + } + d->plane1 = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY); + prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); - /* Set up display to enable panel fitting */ - if (is_amdgpu_device(display->drm_fd)) { - mode->hdisplay = 800; - mode->vdisplay = 600; - } else { - mode->hdisplay = 640; - mode->vdisplay = 480; - } - d->plane1 = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY); - prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); + /* disable panel fitting */ + prepare_crtc(d, output, pipe, d->plane1, &native_mode, COMMIT_LEGACY); - /* disable panel fitting */ - prepare_crtc(d, output, pipe, d->plane1, &native_mode, COMMIT_LEGACY); + /* enable panel fitting */ + mode->hdisplay = 800; + mode->vdisplay = 600; + prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); - /* enable panel fitting */ - mode->hdisplay = 800; - mode->vdisplay = 600; - prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); - - /* disable panel fitting */ - prepare_crtc(d, output, pipe, d->plane1, &native_mode, COMMIT_LEGACY); - - /* Set up fb2->plane2 mapping. */ - d->plane2 = igt_output_get_plane_type(output, DRM_PLANE_TYPE_OVERLAY); - igt_plane_set_fb(d->plane2, &d->fb2); - - /* enable sprite plane */ - igt_fb_set_position(&d->fb2, d->plane2, 100, 100); - igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width-200, d->fb2.height-200); - igt_plane_set_position(d->plane2, 100, 100); - - if (is_i915_device(display->drm_fd)) { - uint32_t devid = intel_get_drm_devid(display->drm_fd); - /* - * Most of gen7 and all of gen8 doesn't support plane scaling - * at all. - * - * gen9 pipe C has only 1 scaler shared with the crtc, which - * means pipe scaling can't work simultaneously with panel - * fitting. - * - * Since this is the legacy path, userspace has to know about - * the HW limitations, whereas atomic can ask. - */ - if (IS_GEN8(devid) || - (IS_GEN7(devid) && !IS_IVYBRIDGE(devid)) || - (IS_GEN9(devid) && pipe == PIPE_C)) { - is_plane_scaling_active = false; - } - } - if (is_plane_scaling_active) { - /* - * different than visible area of fb => plane scaling - * active - */ - igt_plane_set_size(d->plane2, - mode->hdisplay-200, - mode->vdisplay-200); - } - else { - /* same as visible area of fb => no scaling */ - igt_plane_set_size(d->plane2, - d->fb2.width - 200, - d->fb2.height - 200); - } + /* disable panel fitting */ + prepare_crtc(d, output, pipe, d->plane1, &native_mode, COMMIT_LEGACY); - /* Plane scaling active (if possible), pfit off */ - igt_display_commit2(display, COMMIT_UNIVERSAL); + /* set up fb2->plane2 mapping. */ + d->plane2 = igt_output_get_plane_type(output, DRM_PLANE_TYPE_OVERLAY); + igt_plane_set_fb(d->plane2, &d->fb2); - /* enable panel fitting along with sprite scaling */ - mode->hdisplay = 1024; - mode->vdisplay = 768; - prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); + /* enable sprite plane */ + igt_fb_set_position(&d->fb2, d->plane2, 100, 100); + igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width-200, d->fb2.height-200); + igt_plane_set_position(d->plane2, 100, 100); - valid_tests++; + if (is_i915_device(display->drm_fd)) { + uint32_t devid = intel_get_drm_devid(display->drm_fd); + /* + * Most of gen7 and all of gen8 doesn't support plane scaling + * at all. + * + * gen9 pipe C has only 1 scaler shared with the crtc, which + * means pipe scaling can't work simultaneously with panel + * fitting. + * + * Since this is the legacy path, userspace has to know about + * the HW limitations, whereas atomic can ask. + */ + if (IS_GEN8(devid) || + (IS_GEN7(devid) && !IS_IVYBRIDGE(devid)) || + (IS_GEN9(devid) && pipe == PIPE_C)) { + is_plane_scaling_active = false; + } } - igt_require_f(valid_tests, "no valid crtc/connector combinations found\n"); + if (is_plane_scaling_active) { + /* + * different than visible area of fb => plane scaling + * active + */ + igt_plane_set_size(d->plane2, + mode->hdisplay-200, + mode->vdisplay-200); + } else { + /* same as visible area of fb => no scaling */ + igt_plane_set_size(d->plane2, + d->fb2.width - 200, + d->fb2.height - 200); + } + + /* Plane scaling active (if possible), pfit off */ + igt_display_commit2(display, COMMIT_UNIVERSAL); + + /* enable panel fitting along with sprite scaling */ + mode->hdisplay = 1024; + mode->vdisplay = 768; + prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_LEGACY); } static void @@ -234,34 +225,38 @@ test_panel_fitting_fastset(igt_display_t *display, const enum pipe pipe, igt_out igt_display_commit_atomic(display, 0, NULL); } -static void test_atomic_fastset(data_t *data) +static void test_panel_fitting(data_t *data, enum test_type type) { igt_display_t *display = &data->display; igt_output_t *output; enum pipe pipe; - int valid_tests = 0; struct stat sb; - igt_require_f(is_i915_device(display->drm_fd), "not valid for non-i915 devices\n"); + if (type == TEST_ATOMIC) { + igt_require_f(is_i915_device(display->drm_fd), "not valid for non-i915 devices\n"); - if (is_i915_device(display->drm_fd)) { /* Until this is force enabled, force modeset evasion. */ if (stat("/sys/module/i915/parameters/fastboot", &sb) == 0) igt_set_module_param_int(data->drm_fd, "fastboot", 1); igt_require(intel_display_ver(intel_get_drm_devid(display->drm_fd)) >= 5); + } - igt_require(display->is_atomic); for_each_pipe_with_valid_output(display, pipe, output) { + /* Check that the "scaling mode" property has been set. */ if (!igt_output_has_prop(output, IGT_CONNECTOR_SCALING_MODE)) continue; cleanup_crtc(data); - test_panel_fitting_fastset(display, pipe, output); - valid_tests++; + + igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), output->name) { + if (type == TEST_ATOMIC) + test_panel_fitting_fastset(display, pipe, output); + if (type == TEST_LEGACY) + test_panel_fitting_legacy(data, display, pipe, output); + } } - igt_require_f(valid_tests, "no valid crtc/connector combinations found\n"); } igt_main @@ -275,12 +270,15 @@ igt_main } igt_describe("Tests panel fitting usages with legacy style commit."); - igt_subtest("legacy") - test_panel_fitting(&data); + igt_subtest_with_dynamic("legacy") + test_panel_fitting(&data, TEST_LEGACY); + + igt_fixture + igt_require(&data.display.is_atomic); igt_describe("Tests panel fitting usages with atomic fastset."); - igt_subtest("atomic-fastset") - test_atomic_fastset(&data); + igt_subtest_with_dynamic("atomic-fastset") + test_panel_fitting(&data, TEST_ATOMIC); igt_fixture igt_display_fini(&data.display); -- cgit v1.2.3