i965: Fix batch-last mode to properly swap BOs.
On pre-4.13 kernels, which don't support I915_EXEC_BATCH_FIRST, we move
the validation list entry to the end...but incorrectly left the exec_bo
array alone, causing a mismatch where exec_bos[0] no longer corresponded
with validation_list[0] (and similarly for the last entry).
One example of resulting breakage is that we'd update bo->gtt_offset
based on the wrong buffer. This wreaked total havoc when trying to use
softpin, and likely caused unnecessary relocations in the normal case.
Fixes: 29ba502a4e
(i965: Use I915_EXEC_BATCH_FIRST when available.)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
@@ -780,11 +780,16 @@ submit_batch(struct brw_context *brw, int in_fence_fd, int *out_fence_fd)
|
|||||||
} else {
|
} else {
|
||||||
/* Move the batch to the end of the validation list */
|
/* Move the batch to the end of the validation list */
|
||||||
struct drm_i915_gem_exec_object2 tmp;
|
struct drm_i915_gem_exec_object2 tmp;
|
||||||
|
struct brw_bo *tmp_bo;
|
||||||
const unsigned index = batch->exec_count - 1;
|
const unsigned index = batch->exec_count - 1;
|
||||||
|
|
||||||
tmp = *entry;
|
tmp = *entry;
|
||||||
*entry = batch->validation_list[index];
|
*entry = batch->validation_list[index];
|
||||||
batch->validation_list[index] = tmp;
|
batch->validation_list[index] = tmp;
|
||||||
|
|
||||||
|
tmp_bo = batch->exec_bos[0];
|
||||||
|
batch->exec_bos[0] = batch->exec_bos[index];
|
||||||
|
batch->exec_bos[index] = tmp_bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = execbuffer(dri_screen->fd, batch, brw->hw_ctx,
|
ret = execbuffer(dri_screen->fd, batch, brw->hw_ctx,
|
||||||
|
Reference in New Issue
Block a user