libdrm just doesn't know enough to do this precisely. Therefore allow this to be disabled and put the burden on the client where enough information is available.
Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch> --- intel/intel_bufmgr.h | 1 + intel/intel_bufmgr_gem.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletions(-) diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h index 0984ab0..4e3dd20 100644 --- a/intel/intel_bufmgr.h +++ b/intel/intel_bufmgr.h @@ -135,6 +135,7 @@ drm_intel_bo *drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr, unsigned int handle); void drm_intel_bufmgr_gem_enable_reuse(drm_intel_bufmgr *bufmgr); void drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr); +int drm_intel_bufmgr_gem_disable_fence_accounting(drm_intel_bufmgr *bufmgr); int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo); int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo); void drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable); diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index a2cf6e6..b7aa2bd 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -101,6 +101,7 @@ typedef struct _drm_intel_bufmgr_gem { int gen; char bo_reuse; char fenced_relocs; + char no_fence_accounting; } drm_intel_bufmgr_gem; #define DRM_INTEL_RELOC_FENCE (1<<0) @@ -1737,6 +1738,28 @@ drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr) } /** + * Disable the fence checking in drm_intel_gem_bo_get_aperture_space + * + * The gem buffer manager doesn't know which tiled buffers need fence registers + * and which do not. The checking done in get_aperture_space is therefore + * necessarily much too pessimistic. Enabling this option allows the client to + * check fence register usage on its own. + * + * Returns 0 if unfenced relocations are not available, i.e. the user has to + * reserve a fence for every relocation of a tiled buffer. Returns 1 if unfenced + * relocations are available. + */ +int drm_intel_bufmgr_gem_disable_fence_accounting(drm_intel_bufmgr *bufmgr) +{ + drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; + + if (bufmgr_gem->fenced_relocs) + bufmgr_gem->no_fence_accounting = 1; + + return bufmgr_gem->fenced_relocs; +} + +/** * Return the additional aperture space required by the tree of buffer objects * rooted at bo. */ @@ -1884,7 +1907,7 @@ drm_intel_gem_check_aperture_space(drm_intel_bo **bo_array, int count) int total_fences; /* Check for fence reg constraints if necessary */ - if (bufmgr_gem->available_fences) { + if (bufmgr_gem->available_fences && !bufmgr_gem->no_fence_accounting) { total_fences = drm_intel_gem_total_fences(bo_array, count); if (total_fences > bufmgr_gem->available_fences) return -ENOSPC; -- 1.7.0.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx