From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9C5A6C36010 for ; Wed, 2 Apr 2025 02:29:42 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4EE3310E07E; Wed, 2 Apr 2025 02:29:42 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="auUpVvZ8"; dkim-atps=neutral Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 03CF610E6A8 for ; Wed, 2 Apr 2025 02:29:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=FdzQWB4u6SZgSYIW4Ozg6sUx2egUa/FrudRjavQ7Pn0=; b=auUpVvZ8fy14CzD6afMhvnPcHT mIF6ZuKRQhKV1dhv6sPCNCOmQa0PizXJ4klCA0DMQ0k2Rjj9rO33xPKEQwMx1CZ+AGM1Jz3jlIZG6 vloyWEjsDAZWZdBRgWnqNhJyN/f5T67CrMMhhfxrFI+9vvEqqr/7UERx/ulVXRWV6mszIbmLmLr89 kOpPmQfYK7Ze9PrzZ4qafM1B1lrgCjBqroy6qwHY+3EmiQMArsUe7/+VDf4vpsKndyTyAvFwl6Uv+ kGHTjXAEJCBjzfdBZRuw6eczMeu47mdyCBKcoBdbQvHHRCpRO2tKncas4BeyVtpR3g01gltg/g1Mh WI3DrjMQ==; Received: from [187.57.129.172] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1tznrG-00AAa9-T9; Wed, 02 Apr 2025 04:29:39 +0200 From: =?UTF-8?q?Andr=C3=A9=20Almeida?= To: igt-dev@lists.freedesktop.org, Jeevan B , Kamil Konieczny Cc: kernel-dev@igalia.com, Vitaly Prosyak , Alex Hung , Melissa Wen , Rodrigo Siqueira , =?UTF-8?q?Andr=C3=A9=20Almeida?= Subject: [PATCH v5 4/4] tests/kms_async_flips: Create subtest for overlay planes Date: Tue, 1 Apr 2025 23:29:22 -0300 Message-ID: <20250402022922.210495-5-andrealmeid@igalia.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250402022922.210495-1-andrealmeid@igalia.com> References: <20250402022922.210495-1-andrealmeid@igalia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: igt-dev@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development mailing list for IGT GPU Tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" amdgpu can perform async flips in overlay planes as well, so create a test for that. Signed-off-by: André Almeida --- tests/kms_async_flips.c | 73 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c index 6986278d7..98000fc92 100644 --- a/tests/kms_async_flips.c +++ b/tests/kms_async_flips.c @@ -85,6 +85,9 @@ * * SUBTEST: async-flip-suspend-resume * Description: Verify the async flip functionality with suspend and resume cycle + * + * SUBTEST: overlay-atomic + * Description: Verify overlay planes with async flips in atomic API */ #define CURSOR_POS 128 @@ -105,12 +108,14 @@ typedef struct { uint32_t crtc_id; uint32_t refresh_rate; struct igt_fb bufs[NUM_FBS]; + struct igt_fb bufs_overlay[NUM_FBS]; igt_display_t display; igt_output_t *output; unsigned long flip_timestamp_us; double flip_interval; uint64_t modifier; igt_plane_t *plane; + igt_plane_t *plane_overlay; igt_pipe_crc_t *pipe_crc; igt_crc_t ref_crc; int flip_count; @@ -122,6 +127,7 @@ typedef struct { bool allow_fail; struct buf_ops *bops; bool atomic_path; + bool overlay_path; } data_t; static void flip_handler(int fd_, unsigned int sequence, unsigned int tv_sec, @@ -213,6 +219,25 @@ static void require_atomic_async_cap(data_t *data) "Atomic flip async flip not supported\n"); } +static void require_overlay_flip_support(data_t *data) +{ + struct igt_fb *bufs = data->bufs_overlay; + igt_plane_t *plane = data->plane_overlay; + int flags = DRM_MODE_PAGE_FLIP_EVENT; + + igt_plane_set_fb(plane, &bufs[0]); + + igt_require_f(!igt_display_try_commit_atomic(&data->display, flags, data), + "Overlay planes not supported\n"); + + flags |= DRM_MODE_PAGE_FLIP_ASYNC; + + igt_plane_set_fb(plane, &bufs[1]); + + igt_require_f(!igt_display_try_commit_atomic(&data->display, flags, data), + "Async flip for overlay planes not supported\n"); +} + static void test_init(data_t *data) { drmModeModeInfo *mode; @@ -228,12 +253,15 @@ static void test_init(data_t *data) igt_output_set_pipe(data->output, data->pipe); data->plane = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY); + if (data->overlay_path) + data->plane_overlay = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_OVERLAY); } static void test_init_ops(data_t *data) { data->alternate_sync_async = false; data->atomic_path = false; + data->overlay_path = false; } static void test_init_fbs(data_t *data) @@ -242,6 +270,7 @@ static void test_init_fbs(data_t *data) uint32_t width, height; static uint32_t prev_output_id; static uint64_t prev_modifier; + static bool prev_overlay; drmModeModeInfo *mode; mode = igt_output_get_mode(data->output); @@ -249,21 +278,35 @@ static void test_init_fbs(data_t *data) height = mode->vdisplay; if (prev_output_id != data->output->id || - prev_modifier != data->modifier) { + prev_modifier != data->modifier || + prev_overlay != data->overlay_path) { prev_output_id = data->output->id; prev_modifier = data->modifier; + prev_overlay = data->overlay_path; if (data->bufs[0].fb_id) { - for (i = 0; i < NUM_FBS; i++) + for (i = 0; i < NUM_FBS; i++) { igt_remove_fb(data->drm_fd, &data->bufs[i]); + if (data->overlay_path) + igt_remove_fb(data->drm_fd, &data->bufs_overlay[i]); + } } - for (i = 0; i < NUM_FBS; i++) + for (i = 0; i < NUM_FBS; i++) { make_fb(data, &data->bufs[i], width, height, i); + if (data->overlay_path) { + make_fb(data, &data->bufs_overlay[i], width, height, i); + } + } } igt_plane_set_fb(data->plane, &data->bufs[0]); igt_plane_set_size(data->plane, width, height); + + if (data->overlay_path) { + igt_plane_set_fb(data->plane_overlay, &data->bufs_overlay[0]); + igt_plane_set_size(data->plane_overlay, width, height); + } } static bool async_flip_needs_extra_frame(data_t *data) @@ -291,12 +334,17 @@ static bool async_flip_needs_extra_frame(data_t *data) static int perform_flip(data_t *data, int frame, int flags) { int ret; + igt_plane_t *plane; + struct igt_fb *bufs; + + plane = data->overlay_path ? data->plane_overlay : data->plane; + bufs = data->overlay_path ? data->bufs_overlay : data->bufs; if (!data->atomic_path) { ret = drmModePageFlip(data->drm_fd, data->crtc_id, - data->bufs[frame % NUM_FBS].fb_id, flags, data); + bufs[frame % NUM_FBS].fb_id, flags, data); } else { - igt_plane_set_fb(data->plane, &data->bufs[frame % NUM_FBS]); + igt_plane_set_fb(plane, &bufs[frame % NUM_FBS]); ret = igt_display_try_commit_atomic(&data->display, flags, data); } @@ -312,6 +360,9 @@ static void test_async_flip(data_t *data) igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY); + if (data->overlay_path) + require_overlay_flip_support(data); + gettimeofday(&start, NULL); frame = 1; do { @@ -817,6 +868,14 @@ igt_main run_test(&data, test_async_flip); } + igt_describe("Verify overlay planes with async flips in atomic API"); + igt_subtest_with_dynamic("overlay-atomic") { + igt_require(is_amdgpu_device(data.drm_fd)); + data.atomic_path = true; + data.overlay_path = 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_with_dynamic("test-time-stamp") { @@ -920,8 +979,10 @@ igt_main } igt_fixture { - for (i = 0; i < NUM_FBS; i++) + for (i = 0; i < NUM_FBS; i++) { igt_remove_fb(data.drm_fd, &data.bufs[i]); + igt_remove_fb(data.drm_fd, &data.bufs_overlay[i]); + } if (is_intel_device(data.drm_fd)) buf_ops_destroy(data.bops); -- 2.49.0