summaryrefslogtreecommitdiff
path: root/tests/gem_streaming_writes.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-05-12 15:25:03 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-05-12 15:35:32 +0100
commit2ce298cf13f023d50132658e1ff7569e7507c5c6 (patch)
tree624a63ee60e431c2db39b1220c1c17359aecc29f /tests/gem_streaming_writes.c
parent27cf5847dc9f14417b4a51a0b21213ba8ff04ebd (diff)
igt/gem_stream_writes: Use execbuf LUT to shave a few cycles off dispatch
Since our goal is to have concurrent read/writes of GPU buffers, we want to spend as little time in between as possible. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/gem_streaming_writes.c')
-rw-r--r--tests/gem_streaming_writes.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/tests/gem_streaming_writes.c b/tests/gem_streaming_writes.c
index d42a184a..d1a1b42f 100644
--- a/tests/gem_streaming_writes.c
+++ b/tests/gem_streaming_writes.c
@@ -51,8 +51,15 @@
#define BLT_WRITE_RGB (1<<20)
#define BLT_WRITE_ARGB (BLT_WRITE_ALPHA | BLT_WRITE_RGB)
+#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
+
IGT_TEST_DESCRIPTION("Test of streaming writes into active GPU sources");
+static bool __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *eb)
+{
+ return drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, eb) == 0;
+}
+
static void test_streaming(int fd, int mode)
{
const int has_64bit_reloc = intel_gen(intel_get_drm_devid(fd)) >= 8;
@@ -98,7 +105,11 @@ static void test_streaming(int fd, int mode)
memset(&execbuf, 0, sizeof(execbuf));
execbuf.buffers_ptr = (uintptr_t)exec;
execbuf.buffer_count = 2;
- gem_execbuf(fd, &execbuf);
+ execbuf.flags = LOCAL_I915_EXEC_HANDLE_LUT;
+ if (!__gem_execbuf(fd, &execbuf)) {
+ execbuf.flags = 0;
+ gem_execbuf(fd, &execbuf);
+ }
/* We assume that the active objects are fixed to avoid relocations */
__src_offset = src_offset;
__dst_offset = dst_offset;
@@ -107,7 +118,7 @@ static void test_streaming(int fd, int mode)
for (i = 0; i < 64; i++) {
reloc[2*i+0].offset = 64*i + 4 * sizeof(uint32_t);
reloc[2*i+0].delta = 0;
- reloc[2*i+0].target_handle = dst;
+ reloc[2*i+0].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 0 : dst;
reloc[2*i+0].presumed_offset = dst_offset;
reloc[2*i+0].read_domains = I915_GEM_DOMAIN_RENDER;
reloc[2*i+0].write_domain = I915_GEM_DOMAIN_RENDER;
@@ -116,7 +127,7 @@ static void test_streaming(int fd, int mode)
if (has_64bit_reloc)
reloc[2*i+1].offset += sizeof(uint32_t);
reloc[2*i+1].delta = 0;
- reloc[2*i+1].target_handle = src;
+ reloc[2*i+1].target_handle = execbuf.flags & LOCAL_I915_EXEC_HANDLE_LUT ? 1 : src;
reloc[2*i+1].presumed_offset = src_offset;
reloc[2*i+1].read_domains = I915_GEM_DOMAIN_RENDER;
reloc[2*i+1].write_domain = 0;
@@ -124,7 +135,7 @@ static void test_streaming(int fd, int mode)
exec[2].relocation_count = 2;
execbuf.buffer_count = 3;
- execbuf.flags = I915_EXEC_NO_RELOC;
+ execbuf.flags |= I915_EXEC_NO_RELOC;
if (gem_has_blt(fd))
execbuf.flags |= I915_EXEC_BLT;