[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