From patchwork Tue Oct 16 14:34:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Imre Deak X-Patchwork-Id: 1601001 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork1.kernel.org (Postfix) with ESMTP id B8D6940ABA for ; Tue, 16 Oct 2012 14:45:25 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D50919F616 for ; Tue, 16 Oct 2012 07:45:25 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by gabe.freedesktop.org (Postfix) with ESMTP id 3813C9F081 for ; Tue, 16 Oct 2012 07:35:20 -0700 (PDT) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 16 Oct 2012 07:35:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.80,593,1344236400"; d="scan'208";a="205092221" Received: from ideak-desk.fi.intel.com (HELO localhost) ([10.237.72.98]) by azsmga001.ch.intel.com with ESMTP; 16 Oct 2012 07:35:18 -0700 From: Imre Deak To: intel-gfx@lists.freedesktop.org Date: Tue, 16 Oct 2012 17:34:43 +0300 Message-Id: <1350398096-3649-10-git-send-email-imre.deak@intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1350398096-3649-1-git-send-email-imre.deak@intel.com> References: <1350398096-3649-1-git-send-email-imre.deak@intel.com> Subject: [Intel-gfx] [PATCH 09/22] flip_test: factor out the event loop/wait for event logic X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Needed by an upcoming patch where we want to wait for an event without starting a new round of test run. No functional change. Signed-off-by: Imre Deak --- tests/flip_test.c | 126 +++++++++++++++++++++++++++++------------------------ 1 file changed, 70 insertions(+), 56 deletions(-) diff --git a/tests/flip_test.c b/tests/flip_test.c index 0825cda..8f925d0 100644 --- a/tests/flip_test.c +++ b/tests/flip_test.c @@ -404,12 +404,77 @@ fb_is_bound(struct test_output *o, int fb) return mode.mode_valid && mode.fb_id == fb; } +static void wait_for_events(struct test_output *o) +{ + drmEventContext evctx; + struct timeval timeout = { .tv_sec = 3, .tv_usec = 0 }; + fd_set fds; + int ret; + + memset(&evctx, 0, sizeof evctx); + evctx.version = DRM_EVENT_CONTEXT_VERSION; + evctx.vblank_handler = NULL; + evctx.page_flip_handler = page_flip_handler; + + /* make timeout lax with the dummy load */ + if (o->flags & TEST_WITH_DUMMY_LOAD) + timeout.tv_sec *= 10; + + FD_ZERO(&fds); + FD_SET(0, &fds); + FD_SET(drm_fd, &fds); + ret = select(drm_fd + 1, &fds, NULL, NULL, &timeout); + + if (ret <= 0) { + fprintf(stderr, "select timed out or error (ret %d)\n", + ret); + exit(1); + } else if (FD_ISSET(0, &fds)) { + fprintf(stderr, "no fds active, breaking\n"); + exit(2); + } + + drmHandleEvent(drm_fd, &evctx); +} + +/* Returned the ellapsed time in us */ +static unsigned event_loop(struct test_output *o, unsigned duration_sec) +{ + drmEventContext evctx; + int ret; + struct timeval start, end; + struct timeval tv_dur; + + gettimeofday(&start, NULL); + end.tv_sec = start.tv_sec + duration_sec; + end.tv_usec = start.tv_usec; + + while (1) { + struct timeval now; + + wait_for_events(o); + + gettimeofday(&now, NULL); + if (!timercmp(&now, &end, <)) + break; + } + + gettimeofday(&end, NULL); + timersub(&end, &start, &tv_dur); + + /* and drain the event queue */ + memset(&evctx, 0, sizeof evctx); + evctx.page_flip_handler = NULL; + ret = drmHandleEvent(drm_fd, &evctx); + assert(ret == 0); + + return tv_dur.tv_sec * 1000 * 1000 + tv_dur.tv_usec; +} + static void flip_mode(struct test_output *o, int crtc, int duration) { - int ret; int bpp = 32, depth = 24; - drmEventContext evctx; - struct timeval end; + unsigned ellapsed; connector_find_preferred_mode(o, crtc); if (!o->mode_valid) @@ -459,65 +524,14 @@ static void flip_mode(struct test_output *o, int crtc, int duration) o->current_fb_id = 1; o->count = 1; /* for the uncounted tail */ - memset(&evctx, 0, sizeof evctx); - evctx.version = DRM_EVENT_CONTEXT_VERSION; - evctx.vblank_handler = NULL; - evctx.page_flip_handler = page_flip_handler; - - gettimeofday(&end, NULL); - end.tv_sec += duration; - - while (1) { - struct timeval now, timeout = { .tv_sec = 3, .tv_usec = 0 }; - fd_set fds; - - /* make timeout lax with the dummy load */ - if (o->flags & TEST_WITH_DUMMY_LOAD) - timeout.tv_sec *= 10; - - FD_ZERO(&fds); - FD_SET(0, &fds); - FD_SET(drm_fd, &fds); - ret = select(drm_fd + 1, &fds, NULL, NULL, &timeout); - - if (ret <= 0) { - fprintf(stderr, "select timed out or error (ret %d)\n", - ret); - exit(1); - } else if (FD_ISSET(0, &fds)) { - fprintf(stderr, "no fds active, breaking\n"); - exit(2); - } - - gettimeofday(&now, NULL); - if (now.tv_sec > end.tv_sec || - (now.tv_sec == end.tv_sec && now.tv_usec >= end.tv_usec)) { - break; - } - - ret = drmHandleEvent(drm_fd, &evctx); - assert(ret == 0); - } - - /* and drain the event queue */ - evctx.page_flip_handler = NULL; - ret = drmHandleEvent(drm_fd, &evctx); - assert(ret == 0); + ellapsed = event_loop(o, duration); /* Verify we drop no frames, but only if it's not a TV encoder, since * those use some funny fake timings behind userspace's back. */ if (o->flags & TEST_CHECK_TS && !analog_tv_connector(o)) { - struct timeval now; - long us; int expected; - gettimeofday(&now, NULL); - - us = duration * 1000 * 1000; - us += (now.tv_sec - end.tv_sec) * 1000 * 1000; - us += now.tv_usec - end.tv_usec; - - expected = us * o->mode.vrefresh / (1000 * 1000); + expected = ellapsed * o->mode.vrefresh / (1000 * 1000); if (o->count < expected * 99/100) { fprintf(stderr, "dropped frames, expected %d, counted %d, encoder type %d\n", expected, o->count, o->encoder->encoder_type);