summaryrefslogtreecommitdiff
path: root/benchmarks/gem_exec_nop.c
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/gem_exec_nop.c')
-rw-r--r--benchmarks/gem_exec_nop.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/benchmarks/gem_exec_nop.c b/benchmarks/gem_exec_nop.c
index 2c39b9c3..07162a99 100644
--- a/benchmarks/gem_exec_nop.c
+++ b/benchmarks/gem_exec_nop.c
@@ -47,6 +47,11 @@
#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
+#define LOCAL_I915_EXEC_BSD_SHIFT (13)
+#define LOCAL_I915_EXEC_BSD_MASK (3 << LOCAL_I915_EXEC_BSD_SHIFT)
+
+#define ENGINE_FLAGS (I915_EXEC_RING_MASK | LOCAL_I915_EXEC_BSD_MASK)
+
#define SYNC 0x1
static double elapsed(const struct timespec *start,
@@ -67,6 +72,8 @@ static int loop(unsigned ring, int reps, unsigned flags)
{
struct drm_i915_gem_execbuffer2 execbuf;
struct drm_i915_gem_exec_object2 gem_exec;
+ unsigned engines[16];
+ unsigned nengine;
int fd;
fd = drm_open_driver(DRIVER_INTEL);
@@ -77,15 +84,26 @@ static int loop(unsigned ring, int reps, unsigned flags)
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;
+ execbuf.flags = 0;
if (__gem_execbuf(fd, &execbuf))
return 77;
}
+ nengine = 0;
+ if (ring == -1) {
+ for (ring = 1; ring < 16; ring++) {
+ execbuf.flags &= ~ENGINE_FLAGS;
+ execbuf.flags |= ring;
+ if (__gem_execbuf(fd, &execbuf) == 0)
+ engines[nengine++] = ring;
+ }
+ } else
+ engines[nengine++] = ring;
+
+
while (reps--) {
struct timespec start, end;
unsigned count = 0;
@@ -95,10 +113,14 @@ static int loop(unsigned ring, int reps, unsigned flags)
clock_gettime(CLOCK_MONOTONIC, &start);
do {
- do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
- count++;
- if (flags & SYNC)
- gem_sync(fd, gem_exec.handle);
+ for (int inner = 0; inner < 1024; inner++) {
+ execbuf.flags &= ~ENGINE_FLAGS;
+ execbuf.flags |= engines[count++ % nengine];
+ gem_execbuf(fd, &execbuf);
+ if (flags & SYNC)
+ gem_sync(fd, gem_exec.handle);
+ }
+
clock_gettime(CLOCK_MONOTONIC, &end);
} while (elapsed(&start, &end) < 2.);
@@ -128,6 +150,8 @@ int main(int argc, char **argv)
ring = I915_EXEC_BLT;
else if (strcmp(optarg, "vecs") == 0)
ring = I915_EXEC_VEBOX;
+ else if (strcmp(optarg, "all") == 0)
+ ring = -1;
else
ring = atoi(optarg);
break;