[i-g-t,v2] benchmark/: fix gem_exec_nop complie error on android
diff mbox

Message ID 1437744929-1823-1-git-send-email-derek.j.morton@intel.com
State New
Headers show

Commit Message

Derek Morton July 24, 2015, 1:35 p.m. UTC
There are two versions of gem_exec_nop.c in benchmarks and tests
which causes the build system to have two build modules with
the same name.
This patch renames benchmarks/gem_exec_nop.c to
benchmarks/gem_exec_nop_benchmark.c using the existing
gem_userptr_benchmark.c as a naming convention.

v2: Also rename gem_mmap to gem_mmap_benchmark. Another file
which breaks android which was added after this patch was 1st
submitted.

Signed-off-by: Derek Morton <derek.j.morton@intel.com>
---
 benchmarks/Makefile.sources         |   9 +-
 benchmarks/gem_exec_nop.c           | 153 ---------------------------------
 benchmarks/gem_exec_nop_benchmark.c | 153 +++++++++++++++++++++++++++++++++
 benchmarks/gem_mmap.c               | 165 ------------------------------------
 benchmarks/gem_mmap_benchmark.c     | 165 ++++++++++++++++++++++++++++++++++++
 5 files changed, 325 insertions(+), 320 deletions(-)
 delete mode 100644 benchmarks/gem_exec_nop.c
 create mode 100644 benchmarks/gem_exec_nop_benchmark.c
 delete mode 100644 benchmarks/gem_mmap.c
 create mode 100644 benchmarks/gem_mmap_benchmark.c

Comments

Chris Wilson July 24, 2015, 1:43 p.m. UTC | #1
On Fri, Jul 24, 2015 at 02:35:29PM +0100, Derek Morton wrote:
> There are two versions of gem_exec_nop.c in benchmarks and tests
> which causes the build system to have two build modules with
> the same name.
> This patch renames benchmarks/gem_exec_nop.c to
> benchmarks/gem_exec_nop_benchmark.c using the existing
> gem_userptr_benchmark.c as a naming convention.

Surely a simpler fix than breaking external tools would be to fix the
Makefile?
-Chris
Thomas Wood July 24, 2015, 2:50 p.m. UTC | #2
On 24 July 2015 at 14:43, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> On Fri, Jul 24, 2015 at 02:35:29PM +0100, Derek Morton wrote:
>> There are two versions of gem_exec_nop.c in benchmarks and tests
>> which causes the build system to have two build modules with
>> the same name.
>> This patch renames benchmarks/gem_exec_nop.c to
>> benchmarks/gem_exec_nop_benchmark.c using the existing
>> gem_userptr_benchmark.c as a naming convention.
>
> Surely a simpler fix than breaking external tools would be to fix the
> Makefile?

If the binaries do have to be renamed, the .gitignore files will also
need updating.


> -Chris
>
> --
> Chris Wilson, Intel Open Source Technology Centre
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Thomas Wood July 24, 2015, 3:33 p.m. UTC | #3
On 24 July 2015 at 14:35, Derek Morton <derek.j.morton@intel.com> wrote:
> There are two versions of gem_exec_nop.c in benchmarks and tests
> which causes the build system to have two build modules with
> the same name.
> This patch renames benchmarks/gem_exec_nop.c to
> benchmarks/gem_exec_nop_benchmark.c using the existing
> gem_userptr_benchmark.c as a naming convention.

Would using LOCAL_MODULE_FILENAME help here, allowing an alternative
output name for Android?
https://developer.android.com/ndk/guides/android_mk.html#mdv


>
> v2: Also rename gem_mmap to gem_mmap_benchmark. Another file
> which breaks android which was added after this patch was 1st
> submitted.
>
> Signed-off-by: Derek Morton <derek.j.morton@intel.com>
> ---
>  benchmarks/Makefile.sources         |   9 +-
>  benchmarks/gem_exec_nop.c           | 153 ---------------------------------
>  benchmarks/gem_exec_nop_benchmark.c | 153 +++++++++++++++++++++++++++++++++
>  benchmarks/gem_mmap.c               | 165 ------------------------------------
>  benchmarks/gem_mmap_benchmark.c     | 165 ++++++++++++++++++++++++++++++++++++
>  5 files changed, 325 insertions(+), 320 deletions(-)
>  delete mode 100644 benchmarks/gem_exec_nop.c
>  create mode 100644 benchmarks/gem_exec_nop_benchmark.c
>  delete mode 100644 benchmarks/gem_mmap.c
>  create mode 100644 benchmarks/gem_mmap_benchmark.c
>
> diff --git a/benchmarks/Makefile.sources b/benchmarks/Makefile.sources
> index 7ad95a5..35722b5 100644
> --- a/benchmarks/Makefile.sources
> +++ b/benchmarks/Makefile.sources
> @@ -1,11 +1,16 @@
> +# If you copy a test to benckmarks, rename it _benchmark
> +# The andriod build will fail when trying to build multiple binaries with
> +# the same name.
> +
>  bin_PROGRAMS =                          \
>         intel_upload_blit_large         \
>         intel_upload_blit_large_gtt     \
>         intel_upload_blit_large_map     \
>         intel_upload_blit_small         \
> -       gem_exec_nop                    \
> -       gem_mmap                        \
> +       gem_exec_nop_benchmark          \
> +       gem_mmap_benchmark              \
>         gem_prw                         \
>         gem_userptr_benchmark           \
>         kms_vblank                      \
>         $(NULL)
> +
> diff --git a/benchmarks/gem_exec_nop.c b/benchmarks/gem_exec_nop.c
> deleted file mode 100644
> index 2a3abd2..0000000
> --- a/benchmarks/gem_exec_nop.c
> +++ /dev/null
> @@ -1,153 +0,0 @@
> -/*
> - * Copyright © 2011 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.
> - *
> - * Authors:
> - *    Chris Wilson <chris@chris-wilson.co.uk>
> - *
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <stdint.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <fcntl.h>
> -#include <inttypes.h>
> -#include <errno.h>
> -#include <sys/stat.h>
> -#include <sys/ioctl.h>
> -#include <sys/time.h>
> -#include <time.h>
> -
> -#include "drm.h"
> -#include "ioctl_wrappers.h"
> -#include "drmtest.h"
> -#include "intel_io.h"
> -#include "igt_stats.h"
> -
> -#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
> -#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
> -
> -static uint64_t elapsed(const struct timespec *start,
> -               const struct timespec *end,
> -               int loop)
> -{
> -       return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;
> -}
> -
> -static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
> -{
> -       int err = 0;
> -       if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))
> -               err = -errno;
> -       return err;
> -}
> -
> -static uint32_t batch(int fd)
> -{
> -       const uint32_t buf[] = {MI_BATCH_BUFFER_END};
> -       uint32_t handle = gem_create(fd, 4096);
> -       gem_write(fd, handle, 0, buf, sizeof(buf));
> -       return handle;
> -}
> -
> -static int loop(unsigned ring, int reps)
> -{
> -       struct drm_i915_gem_execbuffer2 execbuf;
> -       struct drm_i915_gem_exec_object2 gem_exec;
> -       int count, fd;
> -
> -       fd = drm_open_any();
> -
> -       memset(&gem_exec, 0, sizeof(gem_exec));
> -       gem_exec.handle = batch(fd);
> -
> -       memset(&execbuf, 0, sizeof(execbuf));
> -       execbuf.buffers_ptr = (uintptr_t)&gem_exec;
> -       execbuf.buffer_count = 1;
> -       execbuf.flags = ring;
> -       execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;
> -       execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;
> -       if (__gem_execbuf(fd, &execbuf)) {
> -               execbuf.flags = ring;
> -               if (__gem_execbuf(fd, &execbuf))
> -                       return 77;
> -       }
> -
> -       for (count = 1; count <= 1<<16; count <<= 1) {
> -               igt_stats_t stats;
> -               int n;
> -
> -               igt_stats_init_with_size(&stats, reps);
> -
> -               for (n = 0; n < reps; n++) {
> -                       struct timespec start, end;
> -                       int loops = count;
> -                       sleep(1); /* wait for the hw to go back to sleep */
> -                       clock_gettime(CLOCK_MONOTONIC, &start);
> -                       while (loops--)
> -                               do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
> -                       gem_sync(fd, gem_exec.handle);
> -                       clock_gettime(CLOCK_MONOTONIC, &end);
> -                       igt_stats_push(&stats, elapsed(&start, &end, count));
> -               }
> -
> -               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
> -               igt_stats_fini(&stats);
> -       }
> -       return 0;
> -}
> -
> -int main(int argc, char **argv)
> -{
> -       unsigned ring = I915_EXEC_RENDER;
> -       int reps = 13;
> -       int c;
> -
> -       while ((c = getopt (argc, argv, "e:r:")) != -1) {
> -               switch (c) {
> -               case 'e':
> -                       if (strcmp(optarg, "rcs") == 0)
> -                               ring = I915_EXEC_RENDER;
> -                       else if (strcmp(optarg, "vcs") == 0)
> -                               ring = I915_EXEC_BSD;
> -                       else if (strcmp(optarg, "bcs") == 0)
> -                               ring = I915_EXEC_BLT;
> -                       else if (strcmp(optarg, "vecs") == 0)
> -                               ring = I915_EXEC_VEBOX;
> -                       else
> -                               ring = atoi(optarg);
> -                       break;
> -
> -               case 'r':
> -                       reps = atoi(optarg);
> -                       if (reps < 1)
> -                               reps = 1;
> -                       break;
> -
> -               default:
> -                       break;
> -               }
> -       }
> -
> -       return loop(ring, reps);
> -}
> diff --git a/benchmarks/gem_exec_nop_benchmark.c b/benchmarks/gem_exec_nop_benchmark.c
> new file mode 100644
> index 0000000..2a3abd2
> --- /dev/null
> +++ b/benchmarks/gem_exec_nop_benchmark.c
> @@ -0,0 +1,153 @@
> +/*
> + * Copyright © 2011 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.
> + *
> + * Authors:
> + *    Chris Wilson <chris@chris-wilson.co.uk>
> + *
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <inttypes.h>
> +#include <errno.h>
> +#include <sys/stat.h>
> +#include <sys/ioctl.h>
> +#include <sys/time.h>
> +#include <time.h>
> +
> +#include "drm.h"
> +#include "ioctl_wrappers.h"
> +#include "drmtest.h"
> +#include "intel_io.h"
> +#include "igt_stats.h"
> +
> +#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
> +#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
> +
> +static uint64_t elapsed(const struct timespec *start,
> +               const struct timespec *end,
> +               int loop)
> +{
> +       return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;
> +}
> +
> +static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
> +{
> +       int err = 0;
> +       if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))
> +               err = -errno;
> +       return err;
> +}
> +
> +static uint32_t batch(int fd)
> +{
> +       const uint32_t buf[] = {MI_BATCH_BUFFER_END};
> +       uint32_t handle = gem_create(fd, 4096);
> +       gem_write(fd, handle, 0, buf, sizeof(buf));
> +       return handle;
> +}
> +
> +static int loop(unsigned ring, int reps)
> +{
> +       struct drm_i915_gem_execbuffer2 execbuf;
> +       struct drm_i915_gem_exec_object2 gem_exec;
> +       int count, fd;
> +
> +       fd = drm_open_any();
> +
> +       memset(&gem_exec, 0, sizeof(gem_exec));
> +       gem_exec.handle = batch(fd);
> +
> +       memset(&execbuf, 0, sizeof(execbuf));
> +       execbuf.buffers_ptr = (uintptr_t)&gem_exec;
> +       execbuf.buffer_count = 1;
> +       execbuf.flags = ring;
> +       execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;
> +       execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;
> +       if (__gem_execbuf(fd, &execbuf)) {
> +               execbuf.flags = ring;
> +               if (__gem_execbuf(fd, &execbuf))
> +                       return 77;
> +       }
> +
> +       for (count = 1; count <= 1<<16; count <<= 1) {
> +               igt_stats_t stats;
> +               int n;
> +
> +               igt_stats_init_with_size(&stats, reps);
> +
> +               for (n = 0; n < reps; n++) {
> +                       struct timespec start, end;
> +                       int loops = count;
> +                       sleep(1); /* wait for the hw to go back to sleep */
> +                       clock_gettime(CLOCK_MONOTONIC, &start);
> +                       while (loops--)
> +                               do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
> +                       gem_sync(fd, gem_exec.handle);
> +                       clock_gettime(CLOCK_MONOTONIC, &end);
> +                       igt_stats_push(&stats, elapsed(&start, &end, count));
> +               }
> +
> +               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
> +               igt_stats_fini(&stats);
> +       }
> +       return 0;
> +}
> +
> +int main(int argc, char **argv)
> +{
> +       unsigned ring = I915_EXEC_RENDER;
> +       int reps = 13;
> +       int c;
> +
> +       while ((c = getopt (argc, argv, "e:r:")) != -1) {
> +               switch (c) {
> +               case 'e':
> +                       if (strcmp(optarg, "rcs") == 0)
> +                               ring = I915_EXEC_RENDER;
> +                       else if (strcmp(optarg, "vcs") == 0)
> +                               ring = I915_EXEC_BSD;
> +                       else if (strcmp(optarg, "bcs") == 0)
> +                               ring = I915_EXEC_BLT;
> +                       else if (strcmp(optarg, "vecs") == 0)
> +                               ring = I915_EXEC_VEBOX;
> +                       else
> +                               ring = atoi(optarg);
> +                       break;
> +
> +               case 'r':
> +                       reps = atoi(optarg);
> +                       if (reps < 1)
> +                               reps = 1;
> +                       break;
> +
> +               default:
> +                       break;
> +               }
> +       }
> +
> +       return loop(ring, reps);
> +}
> diff --git a/benchmarks/gem_mmap.c b/benchmarks/gem_mmap.c
> deleted file mode 100644
> index 7593e12..0000000
> --- a/benchmarks/gem_mmap.c
> +++ /dev/null
> @@ -1,165 +0,0 @@
> -/*
> - * Copyright © 2011-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.
> - *
> - * Authors:
> - *    Chris Wilson <chris@chris-wilson.co.uk>
> - *
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <stdint.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <fcntl.h>
> -#include <inttypes.h>
> -#include <errno.h>
> -#include <sys/stat.h>
> -#include <sys/ioctl.h>
> -#include <sys/time.h>
> -#include <time.h>
> -
> -#include "drm.h"
> -#include "ioctl_wrappers.h"
> -#include "drmtest.h"
> -#include "igt_aux.h"
> -#include "igt_stats.h"
> -
> -#define OBJECT_SIZE (1<<23)
> -
> -static uint64_t elapsed(const struct timespec *start,
> -                       const struct timespec *end)
> -{
> -       return 1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec);
> -}
> -
> -int main(int argc, char **argv)
> -{
> -       int fd = drm_open_any();
> -       enum map {CPU, GTT, WC} map = CPU;
> -       enum dir {READ, WRITE, CLEAR} dir = READ;
> -       int tiling = I915_TILING_NONE;
> -       void *buf = malloc(OBJECT_SIZE);
> -       uint32_t handle;
> -       void *ptr, *src, *dst;
> -       int reps = 13;
> -       int c, size;
> -
> -       while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {
> -               switch (c) {
> -               case 'm':
> -                       if (strcmp(optarg, "cpu") == 0)
> -                               map = CPU;
> -                       else if (strcmp(optarg, "gtt") == 0)
> -                               map = GTT;
> -                       else if (strcmp(optarg, "wc") == 0)
> -                               map = WC;
> -                       else
> -                               abort();
> -                       break;
> -
> -               case 'd':
> -                       if (strcmp(optarg, "read") == 0)
> -                               dir = READ;
> -                       else if (strcmp(optarg, "write") == 0)
> -                               dir = WRITE;
> -                       else if (strcmp(optarg, "clear") == 0)
> -                               dir = CLEAR;
> -                       else
> -                               abort();
> -                       break;
> -
> -               case 't':
> -                       if (strcmp(optarg, "x") == 0)
> -                               tiling = I915_TILING_X;
> -                       else if (strcmp(optarg, "y") == 0)
> -                               tiling = I915_TILING_Y;
> -                       else if (strcmp(optarg, "none") == 0)
> -                               tiling = I915_TILING_NONE;
> -                       else
> -                               abort();
> -                       break;
> -
> -               case 'r':
> -                       reps = atoi(optarg);
> -                       if (reps < 1)
> -                               reps = 1;
> -                       break;
> -
> -               default:
> -                       break;
> -               }
> -       }
> -
> -       handle = gem_create(fd, OBJECT_SIZE);
> -       switch (map) {
> -       case CPU:
> -               ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
> -               break;
> -       case GTT:
> -               ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);
> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> -               break;
> -       case WC:
> -               ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> -               break;
> -       default:
> -               abort();
> -       }
> -
> -       gem_set_tiling(fd, handle, tiling, 512);
> -
> -       if (dir == READ) {
> -               src = ptr;
> -               dst = buf;
> -       } else {
> -               src = buf;
> -               dst = ptr;
> -       }
> -
> -       for (size = 1; size <= OBJECT_SIZE; size <<= 1) {
> -               igt_stats_t stats;
> -               int n;
> -
> -               igt_stats_init_with_size(&stats, reps);
> -
> -               for (n = 0; n < reps; n++) {
> -                       struct timespec start, end;
> -
> -                       clock_gettime(CLOCK_MONOTONIC, &start);
> -                       if (dir == CLEAR)
> -                               memset(dst, 0, size);
> -                       else
> -                               memcpy(dst, src, size);
> -                       clock_gettime(CLOCK_MONOTONIC, &end);
> -
> -                       igt_stats_push(&stats, elapsed(&start, &end));
> -               }
> -
> -               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
> -               igt_stats_fini(&stats);
> -       }
> -
> -       return 0;
> -}
> diff --git a/benchmarks/gem_mmap_benchmark.c b/benchmarks/gem_mmap_benchmark.c
> new file mode 100644
> index 0000000..7593e12
> --- /dev/null
> +++ b/benchmarks/gem_mmap_benchmark.c
> @@ -0,0 +1,165 @@
> +/*
> + * Copyright © 2011-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.
> + *
> + * Authors:
> + *    Chris Wilson <chris@chris-wilson.co.uk>
> + *
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <inttypes.h>
> +#include <errno.h>
> +#include <sys/stat.h>
> +#include <sys/ioctl.h>
> +#include <sys/time.h>
> +#include <time.h>
> +
> +#include "drm.h"
> +#include "ioctl_wrappers.h"
> +#include "drmtest.h"
> +#include "igt_aux.h"
> +#include "igt_stats.h"
> +
> +#define OBJECT_SIZE (1<<23)
> +
> +static uint64_t elapsed(const struct timespec *start,
> +                       const struct timespec *end)
> +{
> +       return 1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +       int fd = drm_open_any();
> +       enum map {CPU, GTT, WC} map = CPU;
> +       enum dir {READ, WRITE, CLEAR} dir = READ;
> +       int tiling = I915_TILING_NONE;
> +       void *buf = malloc(OBJECT_SIZE);
> +       uint32_t handle;
> +       void *ptr, *src, *dst;
> +       int reps = 13;
> +       int c, size;
> +
> +       while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {
> +               switch (c) {
> +               case 'm':
> +                       if (strcmp(optarg, "cpu") == 0)
> +                               map = CPU;
> +                       else if (strcmp(optarg, "gtt") == 0)
> +                               map = GTT;
> +                       else if (strcmp(optarg, "wc") == 0)
> +                               map = WC;
> +                       else
> +                               abort();
> +                       break;
> +
> +               case 'd':
> +                       if (strcmp(optarg, "read") == 0)
> +                               dir = READ;
> +                       else if (strcmp(optarg, "write") == 0)
> +                               dir = WRITE;
> +                       else if (strcmp(optarg, "clear") == 0)
> +                               dir = CLEAR;
> +                       else
> +                               abort();
> +                       break;
> +
> +               case 't':
> +                       if (strcmp(optarg, "x") == 0)
> +                               tiling = I915_TILING_X;
> +                       else if (strcmp(optarg, "y") == 0)
> +                               tiling = I915_TILING_Y;
> +                       else if (strcmp(optarg, "none") == 0)
> +                               tiling = I915_TILING_NONE;
> +                       else
> +                               abort();
> +                       break;
> +
> +               case 'r':
> +                       reps = atoi(optarg);
> +                       if (reps < 1)
> +                               reps = 1;
> +                       break;
> +
> +               default:
> +                       break;
> +               }
> +       }
> +
> +       handle = gem_create(fd, OBJECT_SIZE);
> +       switch (map) {
> +       case CPU:
> +               ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
> +               break;
> +       case GTT:
> +               ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);
> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> +               break;
> +       case WC:
> +               ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> +               break;
> +       default:
> +               abort();
> +       }
> +
> +       gem_set_tiling(fd, handle, tiling, 512);
> +
> +       if (dir == READ) {
> +               src = ptr;
> +               dst = buf;
> +       } else {
> +               src = buf;
> +               dst = ptr;
> +       }
> +
> +       for (size = 1; size <= OBJECT_SIZE; size <<= 1) {
> +               igt_stats_t stats;
> +               int n;
> +
> +               igt_stats_init_with_size(&stats, reps);
> +
> +               for (n = 0; n < reps; n++) {
> +                       struct timespec start, end;
> +
> +                       clock_gettime(CLOCK_MONOTONIC, &start);
> +                       if (dir == CLEAR)
> +                               memset(dst, 0, size);
> +                       else
> +                               memcpy(dst, src, size);
> +                       clock_gettime(CLOCK_MONOTONIC, &end);
> +
> +                       igt_stats_push(&stats, elapsed(&start, &end));
> +               }
> +
> +               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
> +               igt_stats_fini(&stats);
> +       }
> +
> +       return 0;
> +}
> --
> 1.9.1
>
Derek Morton July 24, 2015, 3:53 p.m. UTC | #4
>

>

>-----Original Message-----

>From: Thomas Wood [mailto:thomas.wood@intel.com] 

>Sent: Friday, July 24, 2015 4:33 PM

>To: Morton, Derek J

>Cc: Intel Graphics Development; Gore, Tim

>Subject: Re: [PATCH i-g-t v2] benchmark/: fix gem_exec_nop complie error on android

>

>On 24 July 2015 at 14:35, Derek Morton <derek.j.morton@intel.com> wrote:

>> There are two versions of gem_exec_nop.c in benchmarks and tests which 

>> causes the build system to have two build modules with the same name.

>> This patch renames benchmarks/gem_exec_nop.c to 

>> benchmarks/gem_exec_nop_benchmark.c using the existing 

>> gem_userptr_benchmark.c as a naming convention.

>

>Would using LOCAL_MODULE_FILENAME help here, allowing an alternative output name for Android?

>https://developer.android.com/ndk/guides/android_mk.html#mdv


Not really, but changing LOCAL_MODULE to be $1_benchmarks instead of $1 to 'namespace' the directory does, and will prevent the same problem reoccuring when more files are added in the future.

I will prepare a new patch.

>

>

>>

>> v2: Also rename gem_mmap to gem_mmap_benchmark. Another file which 

>> breaks android which was added after this patch was 1st submitted.

>>

>> Signed-off-by: Derek Morton <derek.j.morton@intel.com>

>> ---

>>  benchmarks/Makefile.sources         |   9 +-

>>  benchmarks/gem_exec_nop.c           | 153 ---------------------------------

>>  benchmarks/gem_exec_nop_benchmark.c | 153 +++++++++++++++++++++++++++++++++

>>  benchmarks/gem_mmap.c               | 165 ------------------------------------

>>  benchmarks/gem_mmap_benchmark.c     | 165 ++++++++++++++++++++++++++++++++++++

>>  5 files changed, 325 insertions(+), 320 deletions(-)  delete mode 

>> 100644 benchmarks/gem_exec_nop.c  create mode 100644 

>> benchmarks/gem_exec_nop_benchmark.c

>>  delete mode 100644 benchmarks/gem_mmap.c  create mode 100644 

>> benchmarks/gem_mmap_benchmark.c

>>

>> diff --git a/benchmarks/Makefile.sources b/benchmarks/Makefile.sources 

>> index 7ad95a5..35722b5 100644

>> --- a/benchmarks/Makefile.sources

>> +++ b/benchmarks/Makefile.sources

>> @@ -1,11 +1,16 @@

>> +# If you copy a test to benckmarks, rename it _benchmark # The 

>> +andriod build will fail when trying to build multiple binaries with # 

>> +the same name.

>> +

>>  bin_PROGRAMS =                          \

>>         intel_upload_blit_large         \

>>         intel_upload_blit_large_gtt     \

>>         intel_upload_blit_large_map     \

>>         intel_upload_blit_small         \

>> -       gem_exec_nop                    \

>> -       gem_mmap                        \

>> +       gem_exec_nop_benchmark          \

>> +       gem_mmap_benchmark              \

>>         gem_prw                         \

>>         gem_userptr_benchmark           \

>>         kms_vblank                      \

>>         $(NULL)

>> +

>> diff --git a/benchmarks/gem_exec_nop.c b/benchmarks/gem_exec_nop.c 

>> deleted file mode 100644 index 2a3abd2..0000000

>> --- a/benchmarks/gem_exec_nop.c

>> +++ /dev/null

>> @@ -1,153 +0,0 @@

>> -/*

>> - * Copyright © 2011 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.

>> - *

>> - * Authors:

>> - *    Chris Wilson <chris@chris-wilson.co.uk>

>> - *

>> - */

>> -

>> -#include <unistd.h>

>> -#include <stdlib.h>

>> -#include <stdint.h>

>> -#include <stdio.h>

>> -#include <string.h>

>> -#include <fcntl.h>

>> -#include <inttypes.h>

>> -#include <errno.h>

>> -#include <sys/stat.h>

>> -#include <sys/ioctl.h>

>> -#include <sys/time.h>

>> -#include <time.h>

>> -

>> -#include "drm.h"

>> -#include "ioctl_wrappers.h"

>> -#include "drmtest.h"

>> -#include "intel_io.h"

>> -#include "igt_stats.h"

>> -

>> -#define LOCAL_I915_EXEC_NO_RELOC (1<<11) -#define 

>> LOCAL_I915_EXEC_HANDLE_LUT (1<<12)

>> -

>> -static uint64_t elapsed(const struct timespec *start,

>> -               const struct timespec *end,

>> -               int loop)

>> -{

>> -       return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;

>> -}

>> -

>> -static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 

>> *execbuf) -{

>> -       int err = 0;

>> -       if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))

>> -               err = -errno;

>> -       return err;

>> -}

>> -

>> -static uint32_t batch(int fd)

>> -{

>> -       const uint32_t buf[] = {MI_BATCH_BUFFER_END};

>> -       uint32_t handle = gem_create(fd, 4096);

>> -       gem_write(fd, handle, 0, buf, sizeof(buf));

>> -       return handle;

>> -}

>> -

>> -static int loop(unsigned ring, int reps) -{

>> -       struct drm_i915_gem_execbuffer2 execbuf;

>> -       struct drm_i915_gem_exec_object2 gem_exec;

>> -       int count, fd;

>> -

>> -       fd = drm_open_any();

>> -

>> -       memset(&gem_exec, 0, sizeof(gem_exec));

>> -       gem_exec.handle = batch(fd);

>> -

>> -       memset(&execbuf, 0, sizeof(execbuf));

>> -       execbuf.buffers_ptr = (uintptr_t)&gem_exec;

>> -       execbuf.buffer_count = 1;

>> -       execbuf.flags = ring;

>> -       execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;

>> -       execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;

>> -       if (__gem_execbuf(fd, &execbuf)) {

>> -               execbuf.flags = ring;

>> -               if (__gem_execbuf(fd, &execbuf))

>> -                       return 77;

>> -       }

>> -

>> -       for (count = 1; count <= 1<<16; count <<= 1) {

>> -               igt_stats_t stats;

>> -               int n;

>> -

>> -               igt_stats_init_with_size(&stats, reps);

>> -

>> -               for (n = 0; n < reps; n++) {

>> -                       struct timespec start, end;

>> -                       int loops = count;

>> -                       sleep(1); /* wait for the hw to go back to sleep */

>> -                       clock_gettime(CLOCK_MONOTONIC, &start);

>> -                       while (loops--)

>> -                               do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);

>> -                       gem_sync(fd, gem_exec.handle);

>> -                       clock_gettime(CLOCK_MONOTONIC, &end);

>> -                       igt_stats_push(&stats, elapsed(&start, &end, count));

>> -               }

>> -

>> -               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);

>> -               igt_stats_fini(&stats);

>> -       }

>> -       return 0;

>> -}

>> -

>> -int main(int argc, char **argv)

>> -{

>> -       unsigned ring = I915_EXEC_RENDER;

>> -       int reps = 13;

>> -       int c;

>> -

>> -       while ((c = getopt (argc, argv, "e:r:")) != -1) {

>> -               switch (c) {

>> -               case 'e':

>> -                       if (strcmp(optarg, "rcs") == 0)

>> -                               ring = I915_EXEC_RENDER;

>> -                       else if (strcmp(optarg, "vcs") == 0)

>> -                               ring = I915_EXEC_BSD;

>> -                       else if (strcmp(optarg, "bcs") == 0)

>> -                               ring = I915_EXEC_BLT;

>> -                       else if (strcmp(optarg, "vecs") == 0)

>> -                               ring = I915_EXEC_VEBOX;

>> -                       else

>> -                               ring = atoi(optarg);

>> -                       break;

>> -

>> -               case 'r':

>> -                       reps = atoi(optarg);

>> -                       if (reps < 1)

>> -                               reps = 1;

>> -                       break;

>> -

>> -               default:

>> -                       break;

>> -               }

>> -       }

>> -

>> -       return loop(ring, reps);

>> -}

>> diff --git a/benchmarks/gem_exec_nop_benchmark.c 

>> b/benchmarks/gem_exec_nop_benchmark.c

>> new file mode 100644

>> index 0000000..2a3abd2

>> --- /dev/null

>> +++ b/benchmarks/gem_exec_nop_benchmark.c

>> @@ -0,0 +1,153 @@

>> +/*

>> + * Copyright © 2011 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.

>> + *

>> + * Authors:

>> + *    Chris Wilson <chris@chris-wilson.co.uk>

>> + *

>> + */

>> +

>> +#include <unistd.h>

>> +#include <stdlib.h>

>> +#include <stdint.h>

>> +#include <stdio.h>

>> +#include <string.h>

>> +#include <fcntl.h>

>> +#include <inttypes.h>

>> +#include <errno.h>

>> +#include <sys/stat.h>

>> +#include <sys/ioctl.h>

>> +#include <sys/time.h>

>> +#include <time.h>

>> +

>> +#include "drm.h"

>> +#include "ioctl_wrappers.h"

>> +#include "drmtest.h"

>> +#include "intel_io.h"

>> +#include "igt_stats.h"

>> +

>> +#define LOCAL_I915_EXEC_NO_RELOC (1<<11) #define 

>> +LOCAL_I915_EXEC_HANDLE_LUT (1<<12)

>> +

>> +static uint64_t elapsed(const struct timespec *start,

>> +               const struct timespec *end,

>> +               int loop)

>> +{

>> +       return (1000000000ULL*(end->tv_sec - start->tv_sec) + 

>> +(end->tv_nsec - start->tv_nsec))/loop; }

>> +

>> +static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 

>> +*execbuf) {

>> +       int err = 0;

>> +       if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))

>> +               err = -errno;

>> +       return err;

>> +}

>> +

>> +static uint32_t batch(int fd)

>> +{

>> +       const uint32_t buf[] = {MI_BATCH_BUFFER_END};

>> +       uint32_t handle = gem_create(fd, 4096);

>> +       gem_write(fd, handle, 0, buf, sizeof(buf));

>> +       return handle;

>> +}

>> +

>> +static int loop(unsigned ring, int reps) {

>> +       struct drm_i915_gem_execbuffer2 execbuf;

>> +       struct drm_i915_gem_exec_object2 gem_exec;

>> +       int count, fd;

>> +

>> +       fd = drm_open_any();

>> +

>> +       memset(&gem_exec, 0, sizeof(gem_exec));

>> +       gem_exec.handle = batch(fd);

>> +

>> +       memset(&execbuf, 0, sizeof(execbuf));

>> +       execbuf.buffers_ptr = (uintptr_t)&gem_exec;

>> +       execbuf.buffer_count = 1;

>> +       execbuf.flags = ring;

>> +       execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;

>> +       execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;

>> +       if (__gem_execbuf(fd, &execbuf)) {

>> +               execbuf.flags = ring;

>> +               if (__gem_execbuf(fd, &execbuf))

>> +                       return 77;

>> +       }

>> +

>> +       for (count = 1; count <= 1<<16; count <<= 1) {

>> +               igt_stats_t stats;

>> +               int n;

>> +

>> +               igt_stats_init_with_size(&stats, reps);

>> +

>> +               for (n = 0; n < reps; n++) {

>> +                       struct timespec start, end;

>> +                       int loops = count;

>> +                       sleep(1); /* wait for the hw to go back to sleep */

>> +                       clock_gettime(CLOCK_MONOTONIC, &start);

>> +                       while (loops--)

>> +                               do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);

>> +                       gem_sync(fd, gem_exec.handle);

>> +                       clock_gettime(CLOCK_MONOTONIC, &end);

>> +                       igt_stats_push(&stats, elapsed(&start, &end, count));

>> +               }

>> +

>> +               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);

>> +               igt_stats_fini(&stats);

>> +       }

>> +       return 0;

>> +}

>> +

>> +int main(int argc, char **argv)

>> +{

>> +       unsigned ring = I915_EXEC_RENDER;

>> +       int reps = 13;

>> +       int c;

>> +

>> +       while ((c = getopt (argc, argv, "e:r:")) != -1) {

>> +               switch (c) {

>> +               case 'e':

>> +                       if (strcmp(optarg, "rcs") == 0)

>> +                               ring = I915_EXEC_RENDER;

>> +                       else if (strcmp(optarg, "vcs") == 0)

>> +                               ring = I915_EXEC_BSD;

>> +                       else if (strcmp(optarg, "bcs") == 0)

>> +                               ring = I915_EXEC_BLT;

>> +                       else if (strcmp(optarg, "vecs") == 0)

>> +                               ring = I915_EXEC_VEBOX;

>> +                       else

>> +                               ring = atoi(optarg);

>> +                       break;

>> +

>> +               case 'r':

>> +                       reps = atoi(optarg);

>> +                       if (reps < 1)

>> +                               reps = 1;

>> +                       break;

>> +

>> +               default:

>> +                       break;

>> +               }

>> +       }

>> +

>> +       return loop(ring, reps);

>> +}

>> diff --git a/benchmarks/gem_mmap.c b/benchmarks/gem_mmap.c deleted 

>> file mode 100644 index 7593e12..0000000

>> --- a/benchmarks/gem_mmap.c

>> +++ /dev/null

>> @@ -1,165 +0,0 @@

>> -/*

>> - * Copyright © 2011-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.

>> - *

>> - * Authors:

>> - *    Chris Wilson <chris@chris-wilson.co.uk>

>> - *

>> - */

>> -

>> -#include <unistd.h>

>> -#include <stdlib.h>

>> -#include <stdint.h>

>> -#include <stdio.h>

>> -#include <string.h>

>> -#include <fcntl.h>

>> -#include <inttypes.h>

>> -#include <errno.h>

>> -#include <sys/stat.h>

>> -#include <sys/ioctl.h>

>> -#include <sys/time.h>

>> -#include <time.h>

>> -

>> -#include "drm.h"

>> -#include "ioctl_wrappers.h"

>> -#include "drmtest.h"

>> -#include "igt_aux.h"

>> -#include "igt_stats.h"

>> -

>> -#define OBJECT_SIZE (1<<23)

>> -

>> -static uint64_t elapsed(const struct timespec *start,

>> -                       const struct timespec *end)

>> -{

>> -       return 1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec);

>> -}

>> -

>> -int main(int argc, char **argv)

>> -{

>> -       int fd = drm_open_any();

>> -       enum map {CPU, GTT, WC} map = CPU;

>> -       enum dir {READ, WRITE, CLEAR} dir = READ;

>> -       int tiling = I915_TILING_NONE;

>> -       void *buf = malloc(OBJECT_SIZE);

>> -       uint32_t handle;

>> -       void *ptr, *src, *dst;

>> -       int reps = 13;

>> -       int c, size;

>> -

>> -       while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {

>> -               switch (c) {

>> -               case 'm':

>> -                       if (strcmp(optarg, "cpu") == 0)

>> -                               map = CPU;

>> -                       else if (strcmp(optarg, "gtt") == 0)

>> -                               map = GTT;

>> -                       else if (strcmp(optarg, "wc") == 0)

>> -                               map = WC;

>> -                       else

>> -                               abort();

>> -                       break;

>> -

>> -               case 'd':

>> -                       if (strcmp(optarg, "read") == 0)

>> -                               dir = READ;

>> -                       else if (strcmp(optarg, "write") == 0)

>> -                               dir = WRITE;

>> -                       else if (strcmp(optarg, "clear") == 0)

>> -                               dir = CLEAR;

>> -                       else

>> -                               abort();

>> -                       break;

>> -

>> -               case 't':

>> -                       if (strcmp(optarg, "x") == 0)

>> -                               tiling = I915_TILING_X;

>> -                       else if (strcmp(optarg, "y") == 0)

>> -                               tiling = I915_TILING_Y;

>> -                       else if (strcmp(optarg, "none") == 0)

>> -                               tiling = I915_TILING_NONE;

>> -                       else

>> -                               abort();

>> -                       break;

>> -

>> -               case 'r':

>> -                       reps = atoi(optarg);

>> -                       if (reps < 1)

>> -                               reps = 1;

>> -                       break;

>> -

>> -               default:

>> -                       break;

>> -               }

>> -       }

>> -

>> -       handle = gem_create(fd, OBJECT_SIZE);

>> -       switch (map) {

>> -       case CPU:

>> -               ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);

>> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);

>> -               break;

>> -       case GTT:

>> -               ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);

>> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);

>> -               break;

>> -       case WC:

>> -               ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);

>> -               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);

>> -               break;

>> -       default:

>> -               abort();

>> -       }

>> -

>> -       gem_set_tiling(fd, handle, tiling, 512);

>> -

>> -       if (dir == READ) {

>> -               src = ptr;

>> -               dst = buf;

>> -       } else {

>> -               src = buf;

>> -               dst = ptr;

>> -       }

>> -

>> -       for (size = 1; size <= OBJECT_SIZE; size <<= 1) {

>> -               igt_stats_t stats;

>> -               int n;

>> -

>> -               igt_stats_init_with_size(&stats, reps);

>> -

>> -               for (n = 0; n < reps; n++) {

>> -                       struct timespec start, end;

>> -

>> -                       clock_gettime(CLOCK_MONOTONIC, &start);

>> -                       if (dir == CLEAR)

>> -                               memset(dst, 0, size);

>> -                       else

>> -                               memcpy(dst, src, size);

>> -                       clock_gettime(CLOCK_MONOTONIC, &end);

>> -

>> -                       igt_stats_push(&stats, elapsed(&start, &end));

>> -               }

>> -

>> -               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);

>> -               igt_stats_fini(&stats);

>> -       }

>> -

>> -       return 0;

>> -}

>> diff --git a/benchmarks/gem_mmap_benchmark.c 

>> b/benchmarks/gem_mmap_benchmark.c new file mode 100644 index 

>> 0000000..7593e12

>> --- /dev/null

>> +++ b/benchmarks/gem_mmap_benchmark.c

>> @@ -0,0 +1,165 @@

>> +/*

>> + * Copyright © 2011-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.

>> + *

>> + * Authors:

>> + *    Chris Wilson <chris@chris-wilson.co.uk>

>> + *

>> + */

>> +

>> +#include <unistd.h>

>> +#include <stdlib.h>

>> +#include <stdint.h>

>> +#include <stdio.h>

>> +#include <string.h>

>> +#include <fcntl.h>

>> +#include <inttypes.h>

>> +#include <errno.h>

>> +#include <sys/stat.h>

>> +#include <sys/ioctl.h>

>> +#include <sys/time.h>

>> +#include <time.h>

>> +

>> +#include "drm.h"

>> +#include "ioctl_wrappers.h"

>> +#include "drmtest.h"

>> +#include "igt_aux.h"

>> +#include "igt_stats.h"

>> +

>> +#define OBJECT_SIZE (1<<23)

>> +

>> +static uint64_t elapsed(const struct timespec *start,

>> +                       const struct timespec *end) {

>> +       return 1000000000ULL*(end->tv_sec - start->tv_sec) + 

>> +(end->tv_nsec - start->tv_nsec); }

>> +

>> +int main(int argc, char **argv)

>> +{

>> +       int fd = drm_open_any();

>> +       enum map {CPU, GTT, WC} map = CPU;

>> +       enum dir {READ, WRITE, CLEAR} dir = READ;

>> +       int tiling = I915_TILING_NONE;

>> +       void *buf = malloc(OBJECT_SIZE);

>> +       uint32_t handle;

>> +       void *ptr, *src, *dst;

>> +       int reps = 13;

>> +       int c, size;

>> +

>> +       while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {

>> +               switch (c) {

>> +               case 'm':

>> +                       if (strcmp(optarg, "cpu") == 0)

>> +                               map = CPU;

>> +                       else if (strcmp(optarg, "gtt") == 0)

>> +                               map = GTT;

>> +                       else if (strcmp(optarg, "wc") == 0)

>> +                               map = WC;

>> +                       else

>> +                               abort();

>> +                       break;

>> +

>> +               case 'd':

>> +                       if (strcmp(optarg, "read") == 0)

>> +                               dir = READ;

>> +                       else if (strcmp(optarg, "write") == 0)

>> +                               dir = WRITE;

>> +                       else if (strcmp(optarg, "clear") == 0)

>> +                               dir = CLEAR;

>> +                       else

>> +                               abort();

>> +                       break;

>> +

>> +               case 't':

>> +                       if (strcmp(optarg, "x") == 0)

>> +                               tiling = I915_TILING_X;

>> +                       else if (strcmp(optarg, "y") == 0)

>> +                               tiling = I915_TILING_Y;

>> +                       else if (strcmp(optarg, "none") == 0)

>> +                               tiling = I915_TILING_NONE;

>> +                       else

>> +                               abort();

>> +                       break;

>> +

>> +               case 'r':

>> +                       reps = atoi(optarg);

>> +                       if (reps < 1)

>> +                               reps = 1;

>> +                       break;

>> +

>> +               default:

>> +                       break;

>> +               }

>> +       }

>> +

>> +       handle = gem_create(fd, OBJECT_SIZE);

>> +       switch (map) {

>> +       case CPU:

>> +               ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);

>> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);

>> +               break;

>> +       case GTT:

>> +               ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);

>> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);

>> +               break;

>> +       case WC:

>> +               ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);

>> +               gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);

>> +               break;

>> +       default:

>> +               abort();

>> +       }

>> +

>> +       gem_set_tiling(fd, handle, tiling, 512);

>> +

>> +       if (dir == READ) {

>> +               src = ptr;

>> +               dst = buf;

>> +       } else {

>> +               src = buf;

>> +               dst = ptr;

>> +       }

>> +

>> +       for (size = 1; size <= OBJECT_SIZE; size <<= 1) {

>> +               igt_stats_t stats;

>> +               int n;

>> +

>> +               igt_stats_init_with_size(&stats, reps);

>> +

>> +               for (n = 0; n < reps; n++) {

>> +                       struct timespec start, end;

>> +

>> +                       clock_gettime(CLOCK_MONOTONIC, &start);

>> +                       if (dir == CLEAR)

>> +                               memset(dst, 0, size);

>> +                       else

>> +                               memcpy(dst, src, size);

>> +                       clock_gettime(CLOCK_MONOTONIC, &end);

>> +

>> +                       igt_stats_push(&stats, elapsed(&start, &end));

>> +               }

>> +

>> +               printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);

>> +               igt_stats_fini(&stats);

>> +       }

>> +

>> +       return 0;

>> +}

>> --

>> 1.9.1

>>

>

Patch
diff mbox

diff --git a/benchmarks/Makefile.sources b/benchmarks/Makefile.sources
index 7ad95a5..35722b5 100644
--- a/benchmarks/Makefile.sources
+++ b/benchmarks/Makefile.sources
@@ -1,11 +1,16 @@ 
+# If you copy a test to benckmarks, rename it _benchmark
+# The andriod build will fail when trying to build multiple binaries with
+# the same name.
+
 bin_PROGRAMS =                          \
 	intel_upload_blit_large         \
 	intel_upload_blit_large_gtt     \
 	intel_upload_blit_large_map     \
 	intel_upload_blit_small		\
-	gem_exec_nop			\
-	gem_mmap			\
+	gem_exec_nop_benchmark		\
+	gem_mmap_benchmark		\
 	gem_prw				\
 	gem_userptr_benchmark		\
 	kms_vblank			\
 	$(NULL)
+
diff --git a/benchmarks/gem_exec_nop.c b/benchmarks/gem_exec_nop.c
deleted file mode 100644
index 2a3abd2..0000000
--- a/benchmarks/gem_exec_nop.c
+++ /dev/null
@@ -1,153 +0,0 @@ 
-/*
- * Copyright © 2011 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.
- *
- * Authors:
- *    Chris Wilson <chris@chris-wilson.co.uk>
- *
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include "drm.h"
-#include "ioctl_wrappers.h"
-#include "drmtest.h"
-#include "intel_io.h"
-#include "igt_stats.h"
-
-#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
-#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
-
-static uint64_t elapsed(const struct timespec *start,
-		const struct timespec *end,
-		int loop)
-{
-	return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;
-}
-
-static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
-{
-	int err = 0;
-	if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))
-		err = -errno;
-	return err;
-}
-
-static uint32_t batch(int fd)
-{
-	const uint32_t buf[] = {MI_BATCH_BUFFER_END};
-	uint32_t handle = gem_create(fd, 4096);
-	gem_write(fd, handle, 0, buf, sizeof(buf));
-	return handle;
-}
-
-static int loop(unsigned ring, int reps)
-{
-	struct drm_i915_gem_execbuffer2 execbuf;
-	struct drm_i915_gem_exec_object2 gem_exec;
-	int count, fd;
-
-	fd = drm_open_any();
-
-	memset(&gem_exec, 0, sizeof(gem_exec));
-	gem_exec.handle = batch(fd);
-
-	memset(&execbuf, 0, sizeof(execbuf));
-	execbuf.buffers_ptr = (uintptr_t)&gem_exec;
-	execbuf.buffer_count = 1;
-	execbuf.flags = ring;
-	execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;
-	execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;
-	if (__gem_execbuf(fd, &execbuf)) {
-		execbuf.flags = ring;
-		if (__gem_execbuf(fd, &execbuf))
-			return 77;
-	}
-
-	for (count = 1; count <= 1<<16; count <<= 1) {
-		igt_stats_t stats;
-		int n;
-
-		igt_stats_init_with_size(&stats, reps);
-
-		for (n = 0; n < reps; n++) {
-			struct timespec start, end;
-			int loops = count;
-			sleep(1); /* wait for the hw to go back to sleep */
-			clock_gettime(CLOCK_MONOTONIC, &start);
-			while (loops--)
-				do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
-			gem_sync(fd, gem_exec.handle);
-			clock_gettime(CLOCK_MONOTONIC, &end);
-			igt_stats_push(&stats, elapsed(&start, &end, count));
-		}
-
-		printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
-		igt_stats_fini(&stats);
-	}
-	return 0;
-}
-
-int main(int argc, char **argv)
-{
-	unsigned ring = I915_EXEC_RENDER;
-	int reps = 13;
-	int c;
-
-	while ((c = getopt (argc, argv, "e:r:")) != -1) {
-		switch (c) {
-		case 'e':
-			if (strcmp(optarg, "rcs") == 0)
-				ring = I915_EXEC_RENDER;
-			else if (strcmp(optarg, "vcs") == 0)
-				ring = I915_EXEC_BSD;
-			else if (strcmp(optarg, "bcs") == 0)
-				ring = I915_EXEC_BLT;
-			else if (strcmp(optarg, "vecs") == 0)
-				ring = I915_EXEC_VEBOX;
-			else
-				ring = atoi(optarg);
-			break;
-
-		case 'r':
-			reps = atoi(optarg);
-			if (reps < 1)
-				reps = 1;
-			break;
-
-		default:
-			break;
-		}
-	}
-
-	return loop(ring, reps);
-}
diff --git a/benchmarks/gem_exec_nop_benchmark.c b/benchmarks/gem_exec_nop_benchmark.c
new file mode 100644
index 0000000..2a3abd2
--- /dev/null
+++ b/benchmarks/gem_exec_nop_benchmark.c
@@ -0,0 +1,153 @@ 
+/*
+ * Copyright © 2011 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.
+ *
+ * Authors:
+ *    Chris Wilson <chris@chris-wilson.co.uk>
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <time.h>
+
+#include "drm.h"
+#include "ioctl_wrappers.h"
+#include "drmtest.h"
+#include "intel_io.h"
+#include "igt_stats.h"
+
+#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
+#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
+
+static uint64_t elapsed(const struct timespec *start,
+		const struct timespec *end,
+		int loop)
+{
+	return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;
+}
+
+static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
+{
+	int err = 0;
+	if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf))
+		err = -errno;
+	return err;
+}
+
+static uint32_t batch(int fd)
+{
+	const uint32_t buf[] = {MI_BATCH_BUFFER_END};
+	uint32_t handle = gem_create(fd, 4096);
+	gem_write(fd, handle, 0, buf, sizeof(buf));
+	return handle;
+}
+
+static int loop(unsigned ring, int reps)
+{
+	struct drm_i915_gem_execbuffer2 execbuf;
+	struct drm_i915_gem_exec_object2 gem_exec;
+	int count, fd;
+
+	fd = drm_open_any();
+
+	memset(&gem_exec, 0, sizeof(gem_exec));
+	gem_exec.handle = batch(fd);
+
+	memset(&execbuf, 0, sizeof(execbuf));
+	execbuf.buffers_ptr = (uintptr_t)&gem_exec;
+	execbuf.buffer_count = 1;
+	execbuf.flags = ring;
+	execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT;
+	execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;
+	if (__gem_execbuf(fd, &execbuf)) {
+		execbuf.flags = ring;
+		if (__gem_execbuf(fd, &execbuf))
+			return 77;
+	}
+
+	for (count = 1; count <= 1<<16; count <<= 1) {
+		igt_stats_t stats;
+		int n;
+
+		igt_stats_init_with_size(&stats, reps);
+
+		for (n = 0; n < reps; n++) {
+			struct timespec start, end;
+			int loops = count;
+			sleep(1); /* wait for the hw to go back to sleep */
+			clock_gettime(CLOCK_MONOTONIC, &start);
+			while (loops--)
+				do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
+			gem_sync(fd, gem_exec.handle);
+			clock_gettime(CLOCK_MONOTONIC, &end);
+			igt_stats_push(&stats, elapsed(&start, &end, count));
+		}
+
+		printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
+		igt_stats_fini(&stats);
+	}
+	return 0;
+}
+
+int main(int argc, char **argv)
+{
+	unsigned ring = I915_EXEC_RENDER;
+	int reps = 13;
+	int c;
+
+	while ((c = getopt (argc, argv, "e:r:")) != -1) {
+		switch (c) {
+		case 'e':
+			if (strcmp(optarg, "rcs") == 0)
+				ring = I915_EXEC_RENDER;
+			else if (strcmp(optarg, "vcs") == 0)
+				ring = I915_EXEC_BSD;
+			else if (strcmp(optarg, "bcs") == 0)
+				ring = I915_EXEC_BLT;
+			else if (strcmp(optarg, "vecs") == 0)
+				ring = I915_EXEC_VEBOX;
+			else
+				ring = atoi(optarg);
+			break;
+
+		case 'r':
+			reps = atoi(optarg);
+			if (reps < 1)
+				reps = 1;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	return loop(ring, reps);
+}
diff --git a/benchmarks/gem_mmap.c b/benchmarks/gem_mmap.c
deleted file mode 100644
index 7593e12..0000000
--- a/benchmarks/gem_mmap.c
+++ /dev/null
@@ -1,165 +0,0 @@ 
-/*
- * Copyright © 2011-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.
- *
- * Authors:
- *    Chris Wilson <chris@chris-wilson.co.uk>
- *
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include "drm.h"
-#include "ioctl_wrappers.h"
-#include "drmtest.h"
-#include "igt_aux.h"
-#include "igt_stats.h"
-
-#define OBJECT_SIZE (1<<23)
-
-static uint64_t elapsed(const struct timespec *start,
-			const struct timespec *end)
-{
-	return 1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec);
-}
-
-int main(int argc, char **argv)
-{
-	int fd = drm_open_any();
-	enum map {CPU, GTT, WC} map = CPU;
-	enum dir {READ, WRITE, CLEAR} dir = READ;
-	int tiling = I915_TILING_NONE;
-	void *buf = malloc(OBJECT_SIZE);
-	uint32_t handle;
-	void *ptr, *src, *dst;
-	int reps = 13;
-	int c, size;
-
-	while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {
-		switch (c) {
-		case 'm':
-			if (strcmp(optarg, "cpu") == 0)
-				map = CPU;
-			else if (strcmp(optarg, "gtt") == 0)
-				map = GTT;
-			else if (strcmp(optarg, "wc") == 0)
-				map = WC;
-			else
-				abort();
-			break;
-
-		case 'd':
-			if (strcmp(optarg, "read") == 0)
-				dir = READ;
-			else if (strcmp(optarg, "write") == 0)
-				dir = WRITE;
-			else if (strcmp(optarg, "clear") == 0)
-				dir = CLEAR;
-			else
-				abort();
-			break;
-
-		case 't':
-			if (strcmp(optarg, "x") == 0)
-				tiling = I915_TILING_X;
-			else if (strcmp(optarg, "y") == 0)
-				tiling = I915_TILING_Y;
-			else if (strcmp(optarg, "none") == 0)
-				tiling = I915_TILING_NONE;
-			else
-				abort();
-			break;
-
-		case 'r':
-			reps = atoi(optarg);
-			if (reps < 1)
-				reps = 1;
-			break;
-
-		default:
-			break;
-		}
-	}
-
-	handle = gem_create(fd, OBJECT_SIZE);
-	switch (map) {
-	case CPU:
-		ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
-		gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
-		break;
-	case GTT:
-		ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);
-		gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
-		break;
-	case WC:
-		ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
-		gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
-		break;
-	default:
-		abort();
-	}
-
-	gem_set_tiling(fd, handle, tiling, 512);
-
-	if (dir == READ) {
-		src = ptr;
-		dst = buf;
-	} else {
-		src = buf;
-		dst = ptr;
-	}
-
-	for (size = 1; size <= OBJECT_SIZE; size <<= 1) {
-		igt_stats_t stats;
-		int n;
-
-		igt_stats_init_with_size(&stats, reps);
-
-		for (n = 0; n < reps; n++) {
-			struct timespec start, end;
-
-			clock_gettime(CLOCK_MONOTONIC, &start);
-			if (dir == CLEAR)
-				memset(dst, 0, size);
-			else
-				memcpy(dst, src, size);
-			clock_gettime(CLOCK_MONOTONIC, &end);
-
-			igt_stats_push(&stats, elapsed(&start, &end));
-		}
-
-		printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
-		igt_stats_fini(&stats);
-	}
-
-	return 0;
-}
diff --git a/benchmarks/gem_mmap_benchmark.c b/benchmarks/gem_mmap_benchmark.c
new file mode 100644
index 0000000..7593e12
--- /dev/null
+++ b/benchmarks/gem_mmap_benchmark.c
@@ -0,0 +1,165 @@ 
+/*
+ * Copyright © 2011-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.
+ *
+ * Authors:
+ *    Chris Wilson <chris@chris-wilson.co.uk>
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <time.h>
+
+#include "drm.h"
+#include "ioctl_wrappers.h"
+#include "drmtest.h"
+#include "igt_aux.h"
+#include "igt_stats.h"
+
+#define OBJECT_SIZE (1<<23)
+
+static uint64_t elapsed(const struct timespec *start,
+			const struct timespec *end)
+{
+	return 1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec);
+}
+
+int main(int argc, char **argv)
+{
+	int fd = drm_open_any();
+	enum map {CPU, GTT, WC} map = CPU;
+	enum dir {READ, WRITE, CLEAR} dir = READ;
+	int tiling = I915_TILING_NONE;
+	void *buf = malloc(OBJECT_SIZE);
+	uint32_t handle;
+	void *ptr, *src, *dst;
+	int reps = 13;
+	int c, size;
+
+	while ((c = getopt (argc, argv, "m:d:r:t:")) != -1) {
+		switch (c) {
+		case 'm':
+			if (strcmp(optarg, "cpu") == 0)
+				map = CPU;
+			else if (strcmp(optarg, "gtt") == 0)
+				map = GTT;
+			else if (strcmp(optarg, "wc") == 0)
+				map = WC;
+			else
+				abort();
+			break;
+
+		case 'd':
+			if (strcmp(optarg, "read") == 0)
+				dir = READ;
+			else if (strcmp(optarg, "write") == 0)
+				dir = WRITE;
+			else if (strcmp(optarg, "clear") == 0)
+				dir = CLEAR;
+			else
+				abort();
+			break;
+
+		case 't':
+			if (strcmp(optarg, "x") == 0)
+				tiling = I915_TILING_X;
+			else if (strcmp(optarg, "y") == 0)
+				tiling = I915_TILING_Y;
+			else if (strcmp(optarg, "none") == 0)
+				tiling = I915_TILING_NONE;
+			else
+				abort();
+			break;
+
+		case 'r':
+			reps = atoi(optarg);
+			if (reps < 1)
+				reps = 1;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	handle = gem_create(fd, OBJECT_SIZE);
+	switch (map) {
+	case CPU:
+		ptr = gem_mmap__cpu(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
+		gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
+		break;
+	case GTT:
+		ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_WRITE);
+		gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+		break;
+	case WC:
+		ptr = gem_mmap__wc(fd, handle, 0, OBJECT_SIZE, PROT_WRITE);
+		gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+		break;
+	default:
+		abort();
+	}
+
+	gem_set_tiling(fd, handle, tiling, 512);
+
+	if (dir == READ) {
+		src = ptr;
+		dst = buf;
+	} else {
+		src = buf;
+		dst = ptr;
+	}
+
+	for (size = 1; size <= OBJECT_SIZE; size <<= 1) {
+		igt_stats_t stats;
+		int n;
+
+		igt_stats_init_with_size(&stats, reps);
+
+		for (n = 0; n < reps; n++) {
+			struct timespec start, end;
+
+			clock_gettime(CLOCK_MONOTONIC, &start);
+			if (dir == CLEAR)
+				memset(dst, 0, size);
+			else
+				memcpy(dst, src, size);
+			clock_gettime(CLOCK_MONOTONIC, &end);
+
+			igt_stats_push(&stats, elapsed(&start, &end));
+		}
+
+		printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
+		igt_stats_fini(&stats);
+	}
+
+	return 0;
+}