diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2012-01-15 14:52:33 -0800 |
---|---|---|
committer | Ben Widawsky <ben@bwidawsk.net> | 2012-06-14 11:04:34 -0700 |
commit | c665e6a7319a67a1e43c204537b64bdcfda1da27 (patch) | |
tree | 970cb4fa04c321e8dcde2a5d35b6c7ab7be2cbdc | |
parent | 93e8e0313482482f690ca9bbe0f2662e7d376e83 (diff) |
context: libdrm wrappers
This wraps libdrm functionality to exec with contexts. This patch
shouldn't be applied until libdrm for contexts is updated.
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
-rw-r--r-- | lib/intel_batchbuffer.c | 40 | ||||
-rw-r--r-- | lib/intel_batchbuffer.h | 2 |
2 files changed, 38 insertions, 4 deletions
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c index 3fcc5787..bcbdf618 100644 --- a/lib/intel_batchbuffer.c +++ b/lib/intel_batchbuffer.c @@ -75,13 +75,13 @@ intel_batchbuffer_free(struct intel_batchbuffer *batch) #define CMD_POLY_STIPPLE_OFFSET 0x7906 -void -intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) +static unsigned int +flush_on_ring_common(struct intel_batchbuffer *batch, int ring) { unsigned int used = batch->ptr - batch->buffer; if (used == 0) - return; + return 0; if (IS_GEN5(batch->devid)) { /* emit gen5 w/a without batch space checks - we reserve that @@ -100,7 +100,17 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) /* Mark the end of the buffer. */ *(uint32_t *)(batch->ptr) = MI_BATCH_BUFFER_END; /* noop */ batch->ptr += 4; - used = batch->ptr - batch->buffer; + return batch->ptr - batch->buffer; +} + +void +intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) +{ + int ret; + unsigned int used = flush_on_ring_common(batch, ring); + + if (used == 0) + return; do_or_die(drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer)); @@ -112,6 +122,28 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring) } void +intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch, + drm_intel_context *context) +{ + int ret; + unsigned int used = flush_on_ring_common(batch, I915_EXEC_RENDER); + + if (used == 0) + return; + + ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer); + assert(ret == 0); + + batch->ptr = NULL; + + ret = drm_intel_gem_bo_context_exec(batch->bo, context, used, + I915_EXEC_RENDER); + assert(ret == 0); + + intel_batchbuffer_reset(batch); +} + +void intel_batchbuffer_flush(struct intel_batchbuffer *batch) { int ring = 0; diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h index 7ea13684..ba0934cb 100644 --- a/lib/intel_batchbuffer.h +++ b/lib/intel_batchbuffer.h @@ -25,6 +25,8 @@ void intel_batchbuffer_free(struct intel_batchbuffer *batch); void intel_batchbuffer_flush(struct intel_batchbuffer *batch); void intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring); +void intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch, + drm_intel_context *context); void intel_batchbuffer_reset(struct intel_batchbuffer *batch); |