summaryrefslogtreecommitdiff
path: root/tests/gem_exec_big.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gem_exec_big.c')
-rw-r--r--tests/gem_exec_big.c59
1 files changed, 56 insertions, 3 deletions
diff --git a/tests/gem_exec_big.c b/tests/gem_exec_big.c
index cb2d0724..6872f364 100644
--- a/tests/gem_exec_big.c
+++ b/tests/gem_exec_big.c
@@ -51,7 +51,7 @@
IGT_TEST_DESCRIPTION("Run a large nop batch to stress test the error capture"
" code.");
-static void exec(int fd, uint32_t handle, uint32_t reloc_ofs, unsigned flags)
+static void exec1(int fd, uint32_t handle, uint32_t reloc_ofs, unsigned flags)
{
struct drm_i915_gem_execbuffer2 execbuf;
struct drm_i915_gem_exec_object2 gem_exec[1];
@@ -99,6 +99,54 @@ static void exec(int fd, uint32_t handle, uint32_t reloc_ofs, unsigned flags)
igt_assert_eq(tmp, gem_reloc[0].presumed_offset);
}
+static void execN(int fd, uint32_t handle, uint32_t batch_size, unsigned flags)
+{
+#define reloc_ofs(N, T) ((((N)+1) << 12) - 4*(1 + ((N) == ((T)-1))))
+ struct drm_i915_gem_execbuffer2 execbuf;
+ struct drm_i915_gem_exec_object2 gem_exec[1];
+ struct drm_i915_gem_relocation_entry *gem_reloc;
+ int n, nreloc = batch_size >> 12;
+ uint32_t tmp;
+
+ gem_reloc = calloc(nreloc, sizeof(*gem_reloc));
+ igt_assert(gem_reloc);
+
+ for (n = 0; n < nreloc; n++) {
+ gem_reloc[n].offset = reloc_ofs(n, nreloc);
+ gem_reloc[n].target_handle = handle;
+ gem_reloc[n].read_domains = I915_GEM_DOMAIN_RENDER;
+ }
+
+ memset(gem_exec, 0, sizeof(gem_exec));
+ gem_exec[0].handle = handle;
+ gem_exec[0].relocation_count = nreloc;
+ gem_exec[0].relocs_ptr = (uintptr_t)gem_reloc;
+
+ memset(&execbuf, 0, sizeof(execbuf));
+ execbuf.buffers_ptr = (uintptr_t)gem_exec;
+ execbuf.buffer_count = 1;
+ execbuf.batch_start_offset = 0;
+ execbuf.batch_len = 8;
+ execbuf.flags = flags;
+
+ /* Avoid hitting slowpaths in the reloc processing which might yield a
+ * presumed_offset of -1. Happens when the batch is still busy from the
+ * last round. */
+ gem_sync(fd, handle);
+
+ gem_execbuf(fd, &execbuf);
+ for (n = 0; n < nreloc; n++)
+ igt_warn_on(gem_reloc[n].presumed_offset == -1);
+
+ for (n = 0; n < nreloc; n++) {
+ gem_read(fd, handle, reloc_ofs(n, nreloc), &tmp, 4);
+ igt_assert_eq(tmp, gem_reloc[n].presumed_offset);
+ }
+
+ free(gem_reloc);
+#undef reloc_ofs
+}
+
igt_simple_main
{
uint32_t batch[2] = {MI_BATCH_BUFFER_END};
@@ -119,10 +167,15 @@ igt_simple_main
for (reloc_ofs = 4096; reloc_ofs < batch_size; reloc_ofs += 4096) {
igt_debug("batch_size %u, reloc_ofs %u\n",
batch_size, reloc_ofs);
- exec(fd, handle, reloc_ofs, 0);
- exec(fd, handle, reloc_ofs, I915_EXEC_SECURE);
+ exec1(fd, handle, reloc_ofs, 0);
+ exec1(fd, handle, reloc_ofs, I915_EXEC_SECURE);
}
+ igt_debug("batch_size %u, all %d relocs\n",
+ batch_size, batch_size >> 12);
+ execN(fd, handle, batch_size, 0);
+ execN(fd, handle, batch_size, I915_EXEC_SECURE);
+
gem_madvise(fd, handle, I915_MADV_DONTNEED);
if (batch_size < max && 2*batch_size > max)