[Intel-gfx] [PATCH i-g-t v2] benchmark/: fix gem_exec_nop complie error on android

Morton, Derek J derek.j.morton at intel.com
Fri Jul 24 08:53:18 PDT 2015


>
>
>-----Original Message-----
>From: Thomas Wood [mailto:thomas.wood at 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 at 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 at 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 at 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 at 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 at 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 at 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
>>
>


More information about the Intel-gfx mailing list