mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-10 17:36:11 +00:00
igt/gem_ppgtt: Create secondary contexts and mm
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
961578f471
commit
107151ce9f
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user