Based on a patch by Chris Wilson (who also wrote this commit message).
Passing the index of the target buffer via the reloc.target_handle is
marginally more efficient for the kernel (it can avoid some allocations,
and can use a direct lookup rather than a hash or search). It is also
useful for ourselves as we can use the index into our exec_bos for other
tasks.
v2: Only enable HANDLE_LUT if we can use BATCH_FIRST and thereby avoid
a post-processing loop to fixup the relocations.
v3: Move kernel probing from context creation to screen init.
Use batch->use_exec_lut as it more descriptive of what's going on (Daniel)
v4: Kernel features already exists, use it for BATCH_FIRST
Rename locals to preserve current flavouring
v5: Squash in "always insert batch bo first"
v6: (by Ken) Split out BATCH_FIRST from HANDLE_LUT.
entry->relocs_ptr = (uintptr_t) batch->relocs;
if (batch->use_batch_first) {
- flags |= I915_EXEC_BATCH_FIRST;
+ flags |= I915_EXEC_BATCH_FIRST | I915_EXEC_HANDLE_LUT;
} else {
/* Move the batch to the end of the validation list */
struct drm_i915_gem_exec_object2 tmp;
(struct drm_i915_gem_relocation_entry) {
.offset = batch_offset,
.delta = target_offset,
- .target_handle = target->gem_handle,
+ .target_handle = batch->use_batch_first ? index : target->gem_handle,
.presumed_offset = entry->offset,
};