On Thu, Aug 15, 2013 at 10:39:31PM +0200, Vedran Rodic wrote: > > We do have the set_caching ioctl. It's enough to flip the PTEs to UC and > > let MOCS manage things. I actually did a few experiments on my IVB. I > > made all Mesa's buffers UC via PTEs by patching libdrm to change the > > cache mode of each bo after allocation. Then I fiddled with the MOCS > > LLC bits in various ways. It definitely has an effect, sometimes making > > things slower, sometimes faster. xonotic again seemed to benefit. IIRC > > leaving everything LLC uncached was actually the fastest (w/ high quality > > at least) so we may be thrashing the LLC a bit there. But eg. reaction > > quake regressed quite a lot if most things were left as UC. > > Can you share the libdrm patch?
Sorry, forgot to reply. Here's the patch if you're still interested. >From 47f51b19137603dccaa4fcb2a703d56335c292fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrj...@linux.intel.com> Date: Wed, 14 Aug 2013 15:12:29 +0300 Subject: [PATCH] make bos uncached in PTEs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com> --- intel/intel_bufmgr_gem.c | 60 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index f98f7a7..32ff260 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -243,6 +243,10 @@ drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode, uint32_t * swizzle_mode); static int +drm_intel_gem_bo_set_caching_internal(drm_intel_bo *bo, + uint32_t cache_mode); + +static int drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo, uint32_t tiling_mode, uint32_t stride); @@ -695,6 +699,7 @@ retry: drm_intel_gem_bo_free(&bo_gem->bo); goto retry; } + } } pthread_mutex_unlock(&bufmgr_gem->lock); @@ -761,9 +766,16 @@ drm_intel_gem_bo_alloc_for_render(drm_intel_bufmgr *bufmgr, unsigned long size, unsigned int alignment) { - return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, - BO_ALLOC_FOR_RENDER, - I915_TILING_NONE, 0); + drm_intel_bo *bo; + + bo = drm_intel_gem_bo_alloc_internal(bufmgr, name, size, + BO_ALLOC_FOR_RENDER, + I915_TILING_NONE, 0); + + if (bo) + drm_intel_gem_bo_set_caching_internal(bo, I915_CACHEING_NONE); + + return bo; } static drm_intel_bo * @@ -772,8 +784,15 @@ drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr, unsigned long size, unsigned int alignment) { - return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0, - I915_TILING_NONE, 0); + drm_intel_bo *bo; + + bo = drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0, + I915_TILING_NONE, 0); + + if (bo) + drm_intel_gem_bo_set_caching_internal(bo, I915_CACHEING_CACHED); + + return bo; } static drm_intel_bo * @@ -784,6 +803,7 @@ drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name, drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; unsigned long size, stride; uint32_t tiling; + drm_intel_bo *bo; do { unsigned long aligned_y, height_alignment; @@ -824,8 +844,13 @@ drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name, if (tiling == I915_TILING_NONE) stride = 0; - return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags, - tiling, stride); + bo = drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags, + tiling, stride); + + if (bo) + drm_intel_gem_bo_set_caching_internal(bo, I915_CACHEING_NONE); + + return bo; } /** @@ -2363,6 +2388,27 @@ drm_intel_gem_bo_unpin(drm_intel_bo *bo) } static int +drm_intel_gem_bo_set_caching_internal(drm_intel_bo *bo, + uint32_t cache_mode) +{ + drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; + drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; + struct drm_i915_gem_cacheing set_caching; + int ret; + + memset(&set_caching, 0, sizeof(set_caching)); + + set_caching.handle = bo_gem->gem_handle; + set_caching.cacheing = cache_mode; + + ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_SET_CACHEING, &set_caching); + if (ret == -1) + return -errno; + + return 0; +} + +static int drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo, uint32_t tiling_mode, uint32_t stride) -- 1.8.1.5 -- Ville Syrjälä Intel OTC _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev