If we know the bo is idle (that is we have no submitted a command buffer referencing this bo since the last query) we can skip asking the kernel. Note this may report a false negative if the target is being shared between processes (exported via dmabuf or flink). To allow the caller control over using the last known flag, the query is split into two.
v2: Check against external bo before trusting our own tracking. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> Cc: Kenneth Graunke <kenn...@whitecape.org> Cc: Matt Turner <matts...@gmail.com> --- src/mesa/drivers/dri/i965/brw_bufmgr.c | 40 ++++++++++++++++++++------ src/mesa/drivers/dri/i965/brw_bufmgr.h | 11 +++++-- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c index f1675b191c1..d9e8453787c 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c @@ -444,18 +444,40 @@ vma_free(struct brw_bufmgr *bufmgr, } } -int +static int +__brw_bo_busy(struct brw_bo *bo) +{ + struct drm_i915_gem_busy busy = { bo->gem_handle }; + + if (bo->idle && !bo->external) + return 0; + + /* If we hit an error here, it means that bo->gem_handle is invalid. + * Treat it as being idle (busy.busy is left as 0) and move along. + */ + drmIoctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_BUSY, &busy); + + bo->idle = !busy.busy; + return busy.busy; +} + +bool brw_bo_busy(struct brw_bo *bo) { - struct brw_bufmgr *bufmgr = bo->bufmgr; - struct drm_i915_gem_busy busy = { .handle = bo->gem_handle }; + return __brw_bo_busy(bo); +} - int ret = drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_BUSY, &busy); - if (ret == 0) { - bo->idle = !busy.busy; - return busy.busy; - } - return false; +bool +brw_bo_map_busy(struct brw_bo *bo, unsigned flags) +{ + unsigned mask; + + if (flags & MAP_WRITE) + mask = ~0u; + else + mask = 0xffff; + + return __brw_bo_busy(bo) & mask; } int diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h index 32fc7a553c9..e1f46b091ce 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h @@ -323,10 +323,17 @@ int brw_bo_get_tiling(struct brw_bo *bo, uint32_t *tiling_mode, int brw_bo_flink(struct brw_bo *bo, uint32_t *name); /** - * Returns 1 if mapping the buffer for write could cause the process + * Returns false if mapping the buffer is not in active use by the gpu. + * If it returns true, any mapping for for write could cause the process * to block, due to the object being active in the GPU. */ -int brw_bo_busy(struct brw_bo *bo); +bool brw_bo_busy(struct brw_bo *bo); + +/** + * Returns true if mapping the buffer for the set of flags (i.e. MAP_READ or + * MAP_WRITE) will cause the process to block. + */ +bool brw_bo_map_busy(struct brw_bo *bo, unsigned flags); /** * Specify the volatility of the buffer. -- 2.19.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev