diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-03-19 15:24:52 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2015-03-19 15:33:51 +0000 |
commit | e7d26df4198af40c92292cb4209fd803fa02062f (patch) | |
tree | ccfaa443978f3c3af946397846fe1966340a0164 | |
parent | a72d4056291efd2571105cbb0a254a9cde13c6c6 (diff) |
igt/kms_vblank: Simple harness for measuring speed of drmWaitVBlank
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.sources | 2 | ||||
-rw-r--r-- | tests/kms_vblank.c | 123 |
3 files changed, 126 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index d2918a56..402e062d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -140,6 +140,7 @@ kms_rotation_crc kms_setmode kms_sink_crc_basic kms_universal_plane +kms_vblank multi-tests.txt pm_lpsp pm_rc6_residency diff --git a/tests/Makefile.sources b/tests/Makefile.sources index c32c37aa..a1659788 100644 --- a/tests/Makefile.sources +++ b/tests/Makefile.sources @@ -72,6 +72,7 @@ TESTS_progs_M = \ kms_flip \ kms_flip_event_leak \ kms_flip_tiling \ + kms_flip_event_leak \ kms_mmio_vs_cs_flip \ kms_pipe_crc_basic \ kms_plane \ @@ -80,6 +81,7 @@ TESTS_progs_M = \ kms_rotation_crc \ kms_setmode \ kms_universal_plane \ + kms_vblank \ pm_lpsp \ pm_rpm \ pm_rps \ diff --git a/tests/kms_vblank.c b/tests/kms_vblank.c new file mode 100644 index 00000000..569390e9 --- /dev/null +++ b/tests/kms_vblank.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2015 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file kms_vblank.c + * + * This is a test of performance of drmWaitVblank. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <inttypes.h> +#include <errno.h> +#include <time.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/wait.h> + +#include <drm.h> + +#include "ioctl_wrappers.h" +#include "drmtest.h" +#include "igt_aux.h" +#include "igt_core.h" +#include "igt_gt.h" +#include "intel_bufmgr.h" +#include "intel_batchbuffer.h" +#include "intel_io.h" +#include "intel_chipset.h" + +IGT_TEST_DESCRIPTION("Test speed of WaitVblank."); + +static double elapsed(const struct timespec *start, + const struct timespec *end, + int loop) +{ + return (1e6*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec)/1000)/loop; +} + +static bool crtc0_active(int fd) +{ + union drm_wait_vblank vbl; + + memset(&vbl, 0, sizeof(vbl)); + vbl.request.type = DRM_VBLANK_RELATIVE; + return drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, &vbl) == 0; +} + +static void query(int fd, bool busy) +{ + union drm_wait_vblank vbl; + struct timespec start, end; + unsigned long sq, count = 0; + char buf[4096]; + + memset(&vbl, 0, sizeof(vbl)); + + if (busy) { + vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT; + vbl.request.sequence = 72; + do_or_die(drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, &vbl)); + } + + vbl.request.type = DRM_VBLANK_RELATIVE; + vbl.request.sequence = 0; + do_or_die(drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, &vbl)); + + sq = vbl.reply.sequence; + + clock_gettime(CLOCK_MONOTONIC, &start); + do { + vbl.request.type = DRM_VBLANK_RELATIVE; + vbl.request.sequence = 0; + do_or_die(drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, &vbl)); + count++; + } while ((vbl.reply.sequence - sq) <= 60); + clock_gettime(CLOCK_MONOTONIC, &end); + + igt_info("Time to query current counter (%s): %7.3fµs\n", + busy ? "busy" : "idle", elapsed(&start, &end, count)); + + if (busy) + read(fd, buf, sizeof(buf)); +} + +igt_main +{ + int fd; + + igt_skip_on_simulation(); + + igt_fixture { + fd = drm_open_any(); + igt_require(crtc0_active(fd)); + } + + igt_subtest("query-idle") + query(fd, false); + + igt_subtest("query-busy") + query(fd, true); +} |