tests/gem_ctx_exec: Add eviction test
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 5 Dec 2013 14:49:58 +0000 (15:49 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 5 Dec 2013 14:50:43 +0000 (15:50 +0100)
It didn't pan out at all since atm we don't evict context objects. But
maybe it's useful for when that happens.

v2: Actually test eviction. Took a while to figure that one out.

And indeed the testcase now fails because we don't evict the previous
context as we should.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
tests/Makefile.sources
tests/gem_ctx_exec.c

index 9e0aefe..aa34aeb 100644 (file)
@@ -21,6 +21,7 @@ TESTS_progs_M = \
        gem_concurrent_blit \
        gem_cs_tlb \
        gem_ctx_bad_exec \
+       gem_ctx_exec \
        gem_dummy_reloc_loop \
        gem_evict_alignment \
        gem_evict_everything \
@@ -75,7 +76,6 @@ TESTS_progs = \
        gem_ctx_bad_destroy \
        gem_ctx_basic \
        gem_ctx_create \
-       gem_ctx_exec \
        gem_double_irq_loop \
        gem_exec_big \
        gem_exec_blt \
index 620a944..a2153db 100644 (file)
@@ -93,29 +93,105 @@ static int exec(int fd, uint32_t handle, int ring, int ctx_id)
        return ret;
 }
 
-int main(int argc, char *argv[])
+static void big_exec(int fd, uint32_t handle, int ring)
 {
-       uint32_t handle;
-       uint32_t batch[2] = {0, MI_BATCH_BUFFER_END};
-       uint32_t ctx_id;
-       int fd;
+       struct drm_i915_gem_execbuffer2 execbuf;
+       struct drm_i915_gem_exec_object2 *gem_exec;
+       uint32_t ctx_id1, ctx_id2;
+       int num_buffers = gem_available_aperture_size(fd) / 4096;
+       int i;
+
+       igt_require(intel_get_total_ram_mb() * 2 * 1024 > num_buffers * 4);
+
+       gem_exec = calloc(num_buffers + 1, sizeof(*gem_exec));
+       igt_assert(gem_exec);
+       memset(gem_exec, 0, (num_buffers + 1) * sizeof(*gem_exec));
+
+
+       ctx_id1 = gem_context_create(fd);
+       ctx_id2 = gem_context_create(fd);
+
+       gem_exec[0].handle = handle;
+
+
+       execbuf.buffers_ptr = (uintptr_t)gem_exec;
+       execbuf.buffer_count = num_buffers + 1;
+       execbuf.batch_start_offset = 0;
+       execbuf.batch_len = 8;
+       execbuf.cliprects_ptr = 0;
+       execbuf.num_cliprects = 0;
+       execbuf.DR1 = 0;
+       execbuf.DR4 = 0;
+       execbuf.flags = ring;
+       execbuf.rsvd2 = 0;
 
+       execbuf.buffer_count = 1;
+       i915_execbuffer2_set_context_id(execbuf, ctx_id1);
+       igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2,
+                           &execbuf) == 0);
+
+       for (i = 0; i < num_buffers; i++) {
+               uint32_t tmp_handle = gem_create(fd, 4096);
+
+               gem_exec[i].handle = tmp_handle;
+       }
+       gem_exec[i].handle = handle;
+       execbuf.buffer_count = i + 1;
+
+       /* figure out how many buffers we can exactly fit */
+       while (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2,
+                       &execbuf) != 0) {
+               i--;
+               gem_close(fd, gem_exec[i].handle);
+               gem_exec[i].handle = handle;
+               execbuf.buffer_count--;
+               printf("trying buffer count %i\n", i - 1);
+       }
+
+       printf("reduced buffer count to %i from %i\n",
+              i - 1, num_buffers);
+
+       /* double check that it works */
+       igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2,
+                           &execbuf) == 0);
+
+       i915_execbuffer2_set_context_id(execbuf, ctx_id2);
+       igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2,
+                           &execbuf) == 0);
+       gem_sync(fd, handle);
+}
+
+uint32_t handle;
+uint32_t batch[2] = {0, MI_BATCH_BUFFER_END};
+uint32_t ctx_id;
+int fd;
+
+igt_main
+{
        igt_skip_on_simulation();
+               igt_fixture {
+               fd = drm_open_any_render();
 
-       fd = drm_open_any_render();
+               handle = gem_create(fd, 4096);
 
-       ctx_id = gem_context_create(fd);
-       handle = gem_create(fd, 4096);
+               /* check that we can create contexts. */
+               ctx_id = gem_context_create(fd);
+               context_destroy(fd, ctx_id);
+               gem_write(fd, handle, 0, batch, sizeof(batch));
+       }
 
-       gem_write(fd, handle, 0, batch, sizeof(batch));
-       igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
-       context_destroy(fd, ctx_id);
+       igt_subtest("basic") {
+               ctx_id = gem_context_create(fd);
+               igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
+               context_destroy(fd, ctx_id);
 
-       ctx_id = gem_context_create(fd);
-       igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
-       context_destroy(fd, ctx_id);
+               ctx_id = gem_context_create(fd);
+               igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
+               context_destroy(fd, ctx_id);
 
-       igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) < 0);
+               igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) < 0);
+       }
 
-       igt_success();
+       igt_subtest("eviction")
+               big_exec(fd, handle, I915_EXEC_RENDER);
 }