summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-07-19 10:50:51 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2016-07-19 10:51:55 +0100
commit2cc78a986bb818307b4c5484769adaa13d5e21e8 (patch)
treedb5957f33b96380f629a13249b3b903f4f701ac9
parentec194975e46821c5a6198d9486d3aa9be9a83aec (diff)
igt/prime_vgem: Replace arbitray delay with backchat from child
Wait until the child tells us they are running (and have verified the initial buffer state) before modifing the vgem buffer and then signaling the child. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--tests/prime_vgem.c76
1 files changed, 73 insertions, 3 deletions
diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c
index 2effcfa7..bfd096e9 100644
--- a/tests/prime_vgem.c
+++ b/tests/prime_vgem.c
@@ -65,6 +65,10 @@ static void test_fence_read(int i915, int vgem)
uint32_t *ptr;
uint32_t fence;
int dmabuf, i;
+ int master[2], slave[2];
+
+ igt_assert(pipe(master) == 0);
+ igt_assert(pipe(slave) == 0);
scratch.width = 1024;
scratch.height = 1024;
@@ -75,18 +79,78 @@ static void test_fence_read(int i915, int vgem)
handle = prime_fd_to_handle(i915, dmabuf);
close(dmabuf);
- fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
-
igt_fork(child, 1) {
for (i = 0; i < 1024; i++) {
uint32_t tmp;
gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
+ igt_assert_eq(tmp, 0);
+ }
+ write(master[1], &child, sizeof(child));
+ read(slave[0], &child, sizeof(child));
+ for (i = 0; i < 1024; i++) {
+ uint32_t tmp;
+ gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
igt_assert_eq(tmp, i);
}
gem_close(i915, handle);
}
- sleep(1);
+ read(master[0], &i, sizeof(i));
+ fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
+ write(slave[1], &i, sizeof(i));
+
+ ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
+ for (i = 0; i < 1024; i++)
+ ptr[1024*i] = i;
+ munmap(ptr, scratch.size);
+ vgem_fence_signal(vgem, fence);
+ gem_close(vgem, scratch.handle);
+
+ igt_waitchildren();
+ close(master[0]);
+ close(master[1]);
+ close(slave[0]);
+ close(slave[1]);
+}
+
+static void test_fence_mmap(int i915, int vgem)
+{
+ struct vgem_bo scratch;
+ uint32_t handle;
+ uint32_t *ptr;
+ uint32_t fence;
+ int dmabuf, i;
+ int master[2], slave[2];
+
+ igt_assert(pipe(master) == 0);
+ igt_assert(pipe(slave) == 0);
+
+ scratch.width = 1024;
+ scratch.height = 1024;
+ scratch.bpp = 32;
+ vgem_create(vgem, &scratch);
+
+ dmabuf = prime_handle_to_fd(vgem, scratch.handle);
+ handle = prime_fd_to_handle(i915, dmabuf);
+ close(dmabuf);
+
+ igt_fork(child, 1) {
+ ptr = gem_mmap__gtt(i915, handle, 4096*1024, PROT_READ);
+ gem_close(i915, handle);
+
+ for (i = 0; i < 1024; i++)
+ igt_assert_eq(ptr[1024*i], 0);
+
+ write(master[1], &child, sizeof(child));
+ read(slave[0], &child, sizeof(child));
+
+ for (i = 0; i < 1024; i++)
+ igt_assert_eq(ptr[1024*i], i);
+ }
+
+ read(master[0], &i, sizeof(i));
+ fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
+ write(slave[1], &i, sizeof(i));
ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
for (i = 0; i < 1024; i++)
@@ -96,6 +160,10 @@ static void test_fence_read(int i915, int vgem)
gem_close(vgem, scratch.handle);
igt_waitchildren();
+ close(master[0]);
+ close(master[1]);
+ close(slave[0]);
+ close(slave[1]);
}
static void test_write(int vgem, int i915)
@@ -667,6 +735,8 @@ igt_main
igt_subtest("basic-fence-read")
test_fence_read(i915, vgem);
+ igt_subtest("basic-fence-mmap")
+ test_fence_mmap(i915, vgem);
for (e = intel_execution_engines; e->name; e++) {
igt_subtest_f("%sfence-wait-%s",