[igt-dev] [v2] tests/kms_panel_fitting: Convert test to dynamic
Modem, Bhanuprakash
bhanuprakash.modem at intel.com
Wed Jun 22 08:01:54 UTC 2022
On Mon-20-06-2022 09:29 pm, Swati Sharma wrote:
> Convert the existing subtests to dynamic subtests at pipe/output level.
>
> v2: -Fixed if-else block
> -Removed redundant check
>
> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
Reviewed-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
- Bhanu
> ---
> 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);
More information about the igt-dev
mailing list