The I915_EXEC_NO_RELOC flag lets us tell the kernel that the offset we provide in the validate list entry is what we've used in all relocations to the bo in question. If the bo hasn't moved, the kernel can skip relocations completely. Signed-off-by: Kristian Høgsberg <krh@xxxxxxxxxxxxx> --- intel/intel_bufmgr_gem.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index 8a51cea..a657a4d 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -131,6 +131,7 @@ typedef struct _drm_intel_bufmgr_gem { unsigned int no_exec : 1; unsigned int has_vebox : 1; unsigned int has_handle_lut : 1; + unsigned int has_no_reloc : 1; bool fenced_relocs; char *aub_filename; @@ -504,7 +505,15 @@ drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence) bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count; bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs; bufmgr_gem->exec2_objects[index].alignment = 0; - bufmgr_gem->exec2_objects[index].offset = 0; + + /* If the kernel supports I915_EXEC_NO_RELOC, it will compare + * offset in struct drm_i915_gem_exec_object2 against the bos + * current offset and if all bos haven't moved it will skip + * relocation processing alltogether. If I915_EXEC_NO_RELOC + * is not supported, the kernel ignores the incoming value of + * offset so we can set it either way. + */ + bufmgr_gem->exec2_objects[index].offset = bo->offset64; bufmgr_gem->exec_bos[index] = bo; bufmgr_gem->exec2_objects[index].flags = 0; bufmgr_gem->exec2_objects[index].rsvd1 = 0; @@ -2471,6 +2480,8 @@ do_exec2(drm_intel_bo *bo, int used, drm_intel_context *ctx, if (bufmgr_gem->has_handle_lut) execbuf.flags |= I915_EXEC_HANDLE_LUT; + if (bufmgr_gem->has_no_reloc) + execbuf.flags |= I915_EXEC_NO_RELOC; ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, @@ -3598,6 +3609,10 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); bufmgr_gem->has_handle_lut = ret == 0; + gp.param = I915_PARAM_HAS_EXEC_NO_RELOC; + ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); + bufmgr_gem->has_no_reloc = ret == 0; + /* Let's go with one relocation per every 2 dwords (but round down a bit * since a power of two will mean an extra page allocation for the reloc * buffer). -- 2.2.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx