Pass along the context priority provided through eglCreateContext to the kernel, where it will be used for priority sorting of batches.
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> --- src/mesa/drivers/dri/i965/brw_batch.c | 43 ++++++++++++++++++++++++++++++++- src/mesa/drivers/dri/i965/brw_batch.h | 3 ++- src/mesa/drivers/dri/i965/brw_context.c | 2 +- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_batch.c b/src/mesa/drivers/dri/i965/brw_batch.c index 40e3ec4..4c95c57 100644 --- a/src/mesa/drivers/dri/i965/brw_batch.c +++ b/src/mesa/drivers/dri/i965/brw_batch.c @@ -620,6 +620,44 @@ static uint64_t get_max_aperture(int fd, int gen) return max_aperture; } +static unsigned batch_set_priority(struct brw_batch *batch, unsigned priority) +{ + struct drm_i915_gem_context_param param; + + if (!batch->hw_ctx) + return __DRI_CTX_PRIORITY_MEDIUM; + +#ifndef I915_CONTEXT_PARAM_PRIORITY +#define I915_CONTEXT_PARAM_PRIORITY 0x5 +#endif + + memset(¶m, 0, sizeof(param)); + param.ctx_id = batch->hw_ctx; + param.param = I915_CONTEXT_PARAM_PRIORITY; + switch (priority) { + case __DRI_CTX_PRIORITY_HIGH: + param.value = 1023; + break; + + case __DRI_CTX_PRIORITY_LOW: + param.value = -1023; + break; + + case __DRI_CTX_PRIORITY_MEDIUM: + return __DRI_CTX_PRIORITY_MEDIUM; + } + drmIoctl(batch->fd, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, ¶m); + + drmIoctl(batch->fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, ¶m); + if ((int)param.value < 0) + priority = __DRI_CTX_PRIORITY_LOW; + else if ((int)param.value > 0) + priority = __DRI_CTX_PRIORITY_HIGH; + else + priority = __DRI_CTX_PRIORITY_MEDIUM; + return priority; +} + /* * Initialise the batch-manager for the context. * @@ -629,7 +667,8 @@ static uint64_t get_max_aperture(int fd, int gen) * all contexts.) */ int brw_batch_init(struct brw_batch *batch, - struct intel_screen *screen) + struct intel_screen *screen, + unsigned *priority) { const struct gen_device_info *devinfo = &screen->devinfo; struct drm_i915_gem_context_create create; @@ -704,6 +743,8 @@ int brw_batch_init(struct brw_batch *batch, } } + *priority = batch_set_priority(batch, *priority); + ret = __brw_batch_reset(batch); if (ret) goto err; diff --git a/src/mesa/drivers/dri/i965/brw_batch.h b/src/mesa/drivers/dri/i965/brw_batch.h index ffc9d91..4a188cf 100644 --- a/src/mesa/drivers/dri/i965/brw_batch.h +++ b/src/mesa/drivers/dri/i965/brw_batch.h @@ -191,7 +191,8 @@ typedef struct brw_batch { } brw_batch; int brw_batch_init(struct brw_batch *batch, - struct intel_screen *screen); + struct intel_screen *screen, + unsigned *priority); inline static uint64_t __brw_reloc_address(brw_bo *bo, uint64_t offset) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 1d3ee1d..0382000 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -957,7 +957,7 @@ brwCreateContext(gl_api api, brw->driContext = driContextPriv; brw->screen = screen; - if (brw_batch_init(&brw->batch, screen)) { + if (brw_batch_init(&brw->batch, screen, &priority)) { fprintf(stderr, "%s: failed to alloc batch\n", __func__); *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY; return false; -- 2.10.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev