Commit 1a71cf2f authored by Chris Wilson's avatar Chris Wilson

drm/i915: Allow execbuffer to use the first object as the batch

Currently, the last object in the execlist is the always the batch.
However, when building the batch buffer we often know the batch object
first and if we can use the first slot in the execlist we can emit
relocation instructions relative to it immediately and avoid a separate
pass to adjust the relocations to point to the last execlist slot.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 8a2421bd
...@@ -367,6 +367,7 @@ static int i915_getparam(struct drm_device *dev, void *data, ...@@ -367,6 +367,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
case I915_PARAM_HAS_EXEC_ASYNC: case I915_PARAM_HAS_EXEC_ASYNC:
case I915_PARAM_HAS_EXEC_FENCE: case I915_PARAM_HAS_EXEC_FENCE:
case I915_PARAM_HAS_EXEC_CAPTURE: case I915_PARAM_HAS_EXEC_CAPTURE:
case I915_PARAM_HAS_EXEC_BATCH_FIRST:
/* For the time being all of these are always true; /* For the time being all of these are always true;
* if some supported hardware does not have one of these * if some supported hardware does not have one of these
* features this value needs to be provided from * features this value needs to be provided from
......
...@@ -645,6 +645,9 @@ ht_needs_resize(const struct i915_gem_context_vma_lut *lut) ...@@ -645,6 +645,9 @@ ht_needs_resize(const struct i915_gem_context_vma_lut *lut)
static unsigned int eb_batch_index(const struct i915_execbuffer *eb) static unsigned int eb_batch_index(const struct i915_execbuffer *eb)
{ {
if (eb->args->flags & I915_EXEC_BATCH_FIRST)
return 0;
else
return eb->buffer_count - 1; return eb->buffer_count - 1;
} }
......
...@@ -418,7 +418,6 @@ typedef struct drm_i915_irq_wait { ...@@ -418,7 +418,6 @@ typedef struct drm_i915_irq_wait {
*/ */
#define I915_PARAM_HAS_EXEC_CAPTURE 45 #define I915_PARAM_HAS_EXEC_CAPTURE 45
/* Query the mask of slices available for this system */
#define I915_PARAM_SLICE_MASK 46 #define I915_PARAM_SLICE_MASK 46
/* Assuming it's uniform for each slice, this queries the mask of subslices /* Assuming it's uniform for each slice, this queries the mask of subslices
...@@ -426,6 +425,12 @@ typedef struct drm_i915_irq_wait { ...@@ -426,6 +425,12 @@ typedef struct drm_i915_irq_wait {
*/ */
#define I915_PARAM_SUBSLICE_MASK 47 #define I915_PARAM_SUBSLICE_MASK 47
/*
* Query whether DRM_I915_GEM_EXECBUFFER2 supports supplying the batch buffer
* as the first execobject as opposed to the last. See I915_EXEC_BATCH_FIRST.
*/
#define I915_PARAM_HAS_EXEC_BATCH_FIRST 48
typedef struct drm_i915_getparam { typedef struct drm_i915_getparam {
__s32 param; __s32 param;
/* /*
...@@ -912,7 +917,17 @@ struct drm_i915_gem_execbuffer2 { ...@@ -912,7 +917,17 @@ struct drm_i915_gem_execbuffer2 {
*/ */
#define I915_EXEC_FENCE_OUT (1<<17) #define I915_EXEC_FENCE_OUT (1<<17)
#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_OUT<<1)) /*
* Traditionally the execbuf ioctl has only considered the final element in
* the execobject[] to be the executable batch. Often though, the client
* will known the batch object prior to construction and being able to place
* it into the execobject[] array first can simplify the relocation tracking.
* Setting I915_EXEC_BATCH_FIRST tells execbuf to use element 0 of the
* execobject[] as the * batch instead (the default is to use the last
* element).
*/
#define I915_EXEC_BATCH_FIRST (1<<18)
#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_BATCH_FIRST<<1))
#define I915_EXEC_CONTEXT_ID_MASK (0xffffffff) #define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
#define i915_execbuffer2_set_context_id(eb2, context) \ #define i915_execbuffer2_set_context_id(eb2, context) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment