diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-03-18 14:15:22 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2015-03-19 10:14:34 +0000 |
commit | a72d4056291efd2571105cbb0a254a9cde13c6c6 (patch) | |
tree | c954a69743cc0f87dbdb650ac9ba7487c39bd9b1 /tests/gem_concurrent_blit.c | |
parent | ea4aa70f3c83a942ee34868ade1eba126b15d879 (diff) |
igt/gem_concurrent_blit: Test copying over itself
Suggested by Lionel Landwerlin as a means to emulate video decode
workloads.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/gem_concurrent_blit.c')
-rw-r--r-- | tests/gem_concurrent_blit.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/gem_concurrent_blit.c b/tests/gem_concurrent_blit.c index 248aba54..e6214640 100644 --- a/tests/gem_concurrent_blit.c +++ b/tests/gem_concurrent_blit.c @@ -652,6 +652,62 @@ static void do_overwrite_source__one(struct buffers *buffers, igt_post_hang_ring(fd, hang); } +static void do_intermix(struct buffers *buffers, + do_copy do_copy_func, + do_hang do_hang_func, + int do_rcs) +{ + const int half = buffers->count/2; + struct igt_hang_ring hang; + int i; + + gem_quiescent_gpu(fd); + for (i = 0; i < buffers->count; i++) { + buffers->mode->set_bo(buffers->src[i], 0xdeadbeef^~i, width, height); + buffers->mode->set_bo(buffers->dst[i], i, width, height); + } + for (i = 0; i < half; i++) { + if (do_rcs == 1 || (do_rcs == -1 && i & 1)) + render_copy_bo(buffers->dst[i], buffers->src[i]); + else + blt_copy_bo(buffers->dst[i], buffers->src[i]); + + do_copy_func(buffers->dst[i+half], buffers->src[i]); + + if (do_rcs == 1 || (do_rcs == -1 && (i & 1) == 0)) + render_copy_bo(buffers->dst[i], buffers->dst[i+half]); + else + blt_copy_bo(buffers->dst[i], buffers->dst[i+half]); + + do_copy_func(buffers->dst[i+half], buffers->src[i+half]); + } + hang = do_hang_func(); + for (i = 0; i < 2*half; i++) + buffers->mode->cmp_bo(buffers->dst[i], 0xdeadbeef^~i, width, height, buffers->dummy); + igt_post_hang_ring(fd, hang); +} + +static void do_intermix_rcs(struct buffers *buffers, + do_copy do_copy_func, + do_hang do_hang_func) +{ + do_intermix(buffers, do_copy_func, do_hang_func, 1); +} + +static void do_intermix_bcs(struct buffers *buffers, + do_copy do_copy_func, + do_hang do_hang_func) +{ + do_intermix(buffers, do_copy_func, do_hang_func, 0); +} + +static void do_intermix_both(struct buffers *buffers, + do_copy do_copy_func, + do_hang do_hang_func) +{ + do_intermix(buffers, do_copy_func, do_hang_func, -1); +} + static void do_early_read(struct buffers *buffers, do_copy do_copy_func, do_hang do_hang_func) @@ -918,6 +974,35 @@ run_basic_modes(const struct access_mode *mode, p->copy, h->hang); } + /* try to intermix copies with GPU copies*/ + igt_subtest_f("%s-%s-intermix-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) { + h->require(); + p->require(); + igt_require(rendercopy); + buffers_create(&buffers, num_buffers); + run_wrap_func(&buffers, + do_intermix_rcs, + p->copy, h->hang); + } + igt_subtest_f("%s-%s-intermix-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) { + h->require(); + p->require(); + igt_require(rendercopy); + buffers_create(&buffers, num_buffers); + run_wrap_func(&buffers, + do_intermix_bcs, + p->copy, h->hang); + } + igt_subtest_f("%s-%s-intermix-both%s%s", mode->name, p->prefix, suffix, h->suffix) { + h->require(); + p->require(); + igt_require(rendercopy); + buffers_create(&buffers, num_buffers); + run_wrap_func(&buffers, + do_intermix_both, + p->copy, h->hang); + } + /* try to read the results before the copy completes */ igt_subtest_f("%s-%s-early-read%s%s", mode->name, p->prefix, suffix, h->suffix) { h->require(); |