diff --git a/configure.ac b/configure.ac index 8ddf40b8..9ea1e3c6 100644 --- a/configure.ac +++ b/configure.ac @@ -292,6 +292,15 @@ if test "x$USERPTR" = xyes; then AC_DEFINE(USE_USERPTR,1,[Assume USERPTR support]) fi +AC_ARG_ENABLE(fast-reloc, + AS_HELP_STRING([--enable-fast-reloc], + [Enable use of "fast reloc" (experimental) [default=no]]), + [FASTRELOC="$enableval"], + [FASTRELOC=no]) +if test "x$FASTRELOC" = xyes; then + AC_DEFINE(USE_FASTRELOC,1,[Assume "fast reloc" support]) +fi + AC_ARG_ENABLE(async-swap, AS_HELP_STRING([--enable-async-swap], [Enable use of asynchronous swaps (experimental) [default=no]]), diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 9c016941..131a2098 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -70,10 +70,16 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags); #define DBG_NO_MAP_UPLOAD 0 #define DBG_NO_RELAXED_FENCING 0 #define DBG_NO_SECURE_BATCHES 0 +#define DBG_NO_FAST_RELOC 0 #define DBG_DUMP 0 #define SHOW_BATCH 0 +#ifndef USE_FASTRELOC +#undef DBG_NO_FAST_RELOC +#define DBG_NO_FAST_RELOC 1 +#endif + /* Worst case seems to be 965gm where we cannot write within a cacheline that * is being simultaneously being read by the GPU, or within the sampler * prefetch. In general, the chipsets seem to have a requirement that sampler @@ -96,6 +102,9 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags); #define LOCAL_I915_PARAM_HAS_SEMAPHORES 20 #define LOCAL_I915_PARAM_HAS_SECURE_BATCHES 23 +#define LOCAL_I915_PARAM_HAS_NO_RELOC 24 + +#define LOCAL_I915_EXEC_NO_RELOC (1<<10) #define LOCAL_I915_GEM_USERPTR 0x32 #define LOCAL_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + LOCAL_I915_GEM_USERPTR, struct local_i915_gem_userptr) @@ -651,6 +660,14 @@ static bool test_has_execbuffer2(struct kgem *kgem) errno == EFAULT); } +static bool test_has_no_reloc(struct kgem *kgem) +{ + if (DBG_NO_FAST_RELOC) + return false; + + return gem_param(kgem, LOCAL_I915_PARAM_HAS_NO_RELOC) > 0; +} + static bool test_has_semaphores_enabled(struct kgem *kgem) { FILE *file; @@ -838,6 +855,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen) DBG(("%s: has userptr? %d\n", __FUNCTION__, kgem->has_userptr)); + kgem->has_no_reloc = test_has_no_reloc(kgem); + DBG(("%s: has no-reloc? %d\n", __FUNCTION__, + kgem->has_no_reloc)); + kgem->has_semaphores = false; if (kgem->has_blt && test_has_semaphores_enabled(kgem)) kgem->has_semaphores = true; @@ -2177,8 +2198,10 @@ void kgem_reset(struct kgem *kgem) kgem->nbatch = 0; kgem->surface = kgem->batch_size; kgem->mode = KGEM_NONE; - kgem->batch_flags = 0; kgem->flush = 0; + kgem->batch_flags = 0; + if (kgem->has_no_reloc) + kgem->batch_flags |= LOCAL_I915_EXEC_NO_RELOC; kgem->next_request = __kgem_request_alloc(); diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 7e48db53..8789b55d 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -164,6 +164,7 @@ struct kgem { uint32_t has_secure_batches :1; uint32_t has_cacheing :1; uint32_t has_llc :1; + uint32_t has_no_reloc :1; uint32_t can_blt_cpu :1;