mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-12 02:16:17 +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);
|
BATCH_SZ, 4096);
|
||||||
|
|
||||||
memset(batch->buffer, 0, sizeof(batch->buffer));
|
memset(batch->buffer, 0, sizeof(batch->buffer));
|
||||||
|
batch->ctx = NULL;
|
||||||
|
|
||||||
batch->ptr = batch->buffer;
|
batch->ptr = batch->buffer;
|
||||||
batch->end = NULL;
|
batch->end = NULL;
|
||||||
@ -163,6 +164,7 @@ void
|
|||||||
intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
|
intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
|
||||||
{
|
{
|
||||||
unsigned int used = flush_on_ring_common(batch, ring);
|
unsigned int used = flush_on_ring_common(batch, ring);
|
||||||
|
drm_intel_context *ctx;
|
||||||
|
|
||||||
if (used == 0)
|
if (used == 0)
|
||||||
return;
|
return;
|
||||||
@ -171,11 +173,22 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
|
|||||||
|
|
||||||
batch->ptr = NULL;
|
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);
|
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:
|
* intel_batchbuffer_flush_with_context:
|
||||||
* @batch: batchbuffer object
|
* @batch: batchbuffer object
|
||||||
|
@ -14,6 +14,7 @@ struct intel_batchbuffer {
|
|||||||
uint32_t devid;
|
uint32_t devid;
|
||||||
int gen;
|
int gen;
|
||||||
|
|
||||||
|
drm_intel_context *ctx;
|
||||||
drm_intel_bo *bo;
|
drm_intel_bo *bo;
|
||||||
|
|
||||||
uint8_t buffer[BATCH_SZ];
|
uint8_t buffer[BATCH_SZ];
|
||||||
@ -24,6 +25,10 @@ struct intel_batchbuffer {
|
|||||||
struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr,
|
struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr,
|
||||||
uint32_t devid);
|
uint32_t devid);
|
||||||
|
|
||||||
|
void intel_batchbuffer_set_context(struct intel_batchbuffer *batch,
|
||||||
|
drm_intel_context *ctx);
|
||||||
|
|
||||||
|
|
||||||
void intel_batchbuffer_free(struct intel_batchbuffer *batch);
|
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));
|
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;
|
igt_render_copyfunc_t render_copy;
|
||||||
int devid;
|
int devid;
|
||||||
@ -98,6 +99,13 @@ static void fork_rcs_copy(int target, dri_bo **dst, int count)
|
|||||||
|
|
||||||
dst[child] = create_bo(bufmgr, ~0);
|
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);
|
render_copy = igt_get_render_copyfunc(devid);
|
||||||
igt_require_f(render_copy,
|
igt_require_f(render_copy,
|
||||||
"no render-copy function\n");
|
"no render-copy function\n");
|
||||||
@ -111,6 +119,13 @@ static void fork_rcs_copy(int target, dri_bo **dst, int count)
|
|||||||
devid);
|
devid);
|
||||||
igt_assert(batch);
|
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.bo = dst[child];
|
||||||
buf.stride = STRIDE;
|
buf.stride = STRIDE;
|
||||||
buf.tiling = I915_TILING_NONE;
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
igt_subtest_init(argc, argv);
|
igt_subtest_init(argc, argv);
|
||||||
|
|
||||||
igt_subtest("bcs-vs-rcs") {
|
igt_subtest("bcs-vs-rcs-ctx0") {
|
||||||
#define N_CHILD 8
|
|
||||||
dri_bo *bcs[1], *rcs[N_CHILD];
|
dri_bo *bcs[1], *rcs[N_CHILD];
|
||||||
|
|
||||||
fork_bcs_copy(0x4000, bcs, 1);
|
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();
|
igt_waitchildren();
|
||||||
|
|
||||||
surfaces_check(bcs, 1, 0x4000);
|
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();
|
igt_exit();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user