mirror of
				https://github.com/tiagovignatti/intel-gpu-tools.git
				synced 2025-11-04 03:58:27 +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