summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/intel_batchbuffer.c15
-rw-r--r--lib/intel_batchbuffer.h5
-rw-r--r--tests/gem_ppgtt.c37
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();