diff options
-rw-r--r-- | lib/intel_batchbuffer.c | 15 | ||||
-rw-r--r-- | lib/intel_batchbuffer.h | 5 | ||||
-rw-r--r-- | tests/gem_ppgtt.c | 37 |
3 files changed, 51 insertions, 6 deletions
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c index 9408ad9e..952b86af 100644 --- a/lib/intel_batchbuffer.c +++ b/lib/intel_batchbuffer.c @@ -79,6 +79,7 @@ intel_batchbuffer_reset(struct intel_batchbuffer *batch) BATCH_SZ, 4096); memset(batch->buffer, 0, sizeof(batch->buffer)); + batch->ctx = NULL; batch->ptr = batch->buffer; batch->end = NULL; @@ -163,6 +164,7 @@ void intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) { unsigned int used = flush_on_ring_common(batch, ring); + drm_intel_context *ctx; if (used == 0) return; @@ -171,11 +173,22 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) batch->ptr = NULL; - do_or_die(drm_intel_bo_mrb_exec(batch->bo, used, NULL, 0, 0, ring)); + /* XXX bad kernel API */ + ctx = batch->ctx; + if (ring != I915_EXEC_RENDER) + ctx = NULL; + do_or_die(drm_intel_gem_bo_context_exec(batch->bo, ctx, used, ring)); intel_batchbuffer_reset(batch); } +void +intel_batchbuffer_set_context(struct intel_batchbuffer *batch, + drm_intel_context *context) +{ + batch->ctx = context; +} + /** * intel_batchbuffer_flush_with_context: * @batch: batchbuffer object diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h index 77a63347..0ec66015 100644 --- a/lib/intel_batchbuffer.h +++ b/lib/intel_batchbuffer.h @@ -14,6 +14,7 @@ struct intel_batchbuffer { uint32_t devid; int gen; + drm_intel_context *ctx; drm_intel_bo *bo; uint8_t buffer[BATCH_SZ]; @@ -24,6 +25,10 @@ struct intel_batchbuffer { struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr, uint32_t devid); +void intel_batchbuffer_set_context(struct intel_batchbuffer *batch, + drm_intel_context *ctx); + + void intel_batchbuffer_free(struct intel_batchbuffer *batch); diff --git a/tests/gem_ppgtt.c b/tests/gem_ppgtt.c index c11f5550..8c560f26 100644 --- a/tests/gem_ppgtt.c +++ b/tests/gem_ppgtt.c @@ -82,7 +82,8 @@ static void scratch_buf_fini(struct igt_buf *buf) memset(buf, 0, sizeof(*buf)); } -static void fork_rcs_copy(int target, dri_bo **dst, int count) +static void fork_rcs_copy(int target, dri_bo **dst, int count, unsigned flags) +#define CREATE_CONTEXT 0x1 { igt_render_copyfunc_t render_copy; int devid; @@ -98,6 +99,13 @@ static void fork_rcs_copy(int target, dri_bo **dst, int count) dst[child] = create_bo(bufmgr, ~0); + if (flags & CREATE_CONTEXT) { + drm_intel_context *ctx; + + ctx = drm_intel_gem_context_create(dst[child]->bufmgr); + igt_require(ctx); + } + render_copy = igt_get_render_copyfunc(devid); igt_require_f(render_copy, "no render-copy function\n"); @@ -111,6 +119,13 @@ static void fork_rcs_copy(int target, dri_bo **dst, int count) devid); igt_assert(batch); + if (flags & CREATE_CONTEXT) { + drm_intel_context *ctx; + + ctx = drm_intel_gem_context_create(dst[child]->bufmgr); + intel_batchbuffer_set_context(batch, ctx); + } + buf.bo = dst[child]; buf.stride = STRIDE; buf.tiling = I915_TILING_NONE; @@ -185,21 +200,33 @@ static void surfaces_check(dri_bo **bo, int count, uint32_t expected) } } +#define N_CHILD 8 int main(int argc, char **argv) { igt_subtest_init(argc, argv); - igt_subtest("bcs-vs-rcs") { -#define N_CHILD 8 + igt_subtest("bcs-vs-rcs-ctx0") { + dri_bo *bcs[1], *rcs[N_CHILD]; + + fork_bcs_copy(0x4000, bcs, 1); + fork_rcs_copy(0x8000 / N_CHILD, rcs, N_CHILD, 0); + + igt_waitchildren(); + + surfaces_check(bcs, 1, 0x4000); + surfaces_check(rcs, N_CHILD, 0x8000 / N_CHILD); + } + + igt_subtest("bcs-vs-rcs-ctxN") { dri_bo *bcs[1], *rcs[N_CHILD]; fork_bcs_copy(0x4000, bcs, 1); - fork_rcs_copy(0x4000 / N_CHILD, rcs, N_CHILD); + fork_rcs_copy(0x8000 / N_CHILD, rcs, N_CHILD, CREATE_CONTEXT); igt_waitchildren(); surfaces_check(bcs, 1, 0x4000); - surfaces_check(rcs, N_CHILD, 0x4000 / N_CHILD); + surfaces_check(rcs, N_CHILD, 0x8000 / N_CHILD); } igt_exit(); |