diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 6a35067c..2e21bc11 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -1944,6 +1944,19 @@ static uint64_t get_gtt_size(int fd) return aperture.aper_size; } +static int get_gtt_type(int fd) +{ + struct drm_i915_getparam p; + int val = 0; + + memset(&p, 0, sizeof(p)); + p.param = I915_PARAM_HAS_ALIASING_PPGTT; + p.value = &val; + + drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &p); + return val; +} + void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen) { size_t totalram; @@ -2108,6 +2121,8 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen) !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_caching), kgem->has_llc, kgem->has_caching, kgem->has_userptr)); + kgem->has_full_ppgtt = get_gtt_type(fd) > 1; + gtt_size = get_gtt_size(fd); kgem->aperture_total = gtt_size; kgem->aperture_high = gtt_size * 3/4; diff --git a/src/sna/kgem.h b/src/sna/kgem.h index b7871590..6a087a57 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -191,6 +191,7 @@ struct kgem { uint32_t has_pinned_batches :1; uint32_t has_caching :1; uint32_t has_coherent_mmap_gtt :1; + uint32_t has_full_ppgtt :1; uint32_t has_llc :1; uint32_t has_wt :1; uint32_t has_no_reloc :1; diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 4f8895f1..d810b262 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -459,7 +459,18 @@ static bool enable_tear_free(struct sna *sna) if (sna->flags & SNA_LINEAR_FB) return false; - /* Under certain conditions, we should enable TearFree by default, + /* + * On recent HW, where the display surfaces are in a seperate GTT + * to userspace, there is much less contention on global resources + * and also we can assume there is much more memory bandwidth + * available (i.e. gen8+). This HW should rarely be under such + * constaints as to need to disable TearFree, so enable by default. + */ + if (sna->kgem.has_full_ppgtt) + return true; + + /* + * Under certain conditions, we should enable TearFree by default, * for example when the hardware requires pageflipping to run within * its power/performance budget. */