igt/gem_ppgtt: Create secondary contexts and mm

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2014-09-09 16:27:57 +01:00
parent 961578f471
commit 107151ce9f
3 changed files with 51 additions and 6 deletions

View File

@ -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

View File

@ -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);

View File

@ -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(0x4000 / N_CHILD, rcs, N_CHILD);
fork_rcs_copy(0x8000 / N_CHILD, rcs, N_CHILD, 0);
igt_waitchildren();
surfaces_check(bcs, 1, 0x4000);
surfaces_check(rcs, N_CHILD, 0x4000 / N_CHILD);
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(0x8000 / N_CHILD, rcs, N_CHILD, CREATE_CONTEXT);
igt_waitchildren();
surfaces_check(bcs, 1, 0x4000);
surfaces_check(rcs, N_CHILD, 0x8000 / N_CHILD);
}
igt_exit();