summaryrefslogtreecommitdiff
path: root/tests/prime_vgem.c
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 /tests/prime_vgem.c
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>
Diffstat (limited to 'tests/prime_vgem.c')
-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",