intel: Don't call the SW_FINISH ioctl unless a CPU-mapped write was done.
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>main
parent
77dc16f33d
commit
4cb01eeccf
|
@ -196,6 +196,9 @@ struct _drm_intel_bo_gem {
|
|||
* relocations.
|
||||
*/
|
||||
int reloc_tree_fences;
|
||||
|
||||
/** Flags that we may need to do the SW_FINSIH ioctl on unmap. */
|
||||
bool mapped_cpu_write;
|
||||
};
|
||||
|
||||
static unsigned int
|
||||
|
@ -1051,6 +1054,9 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
|
|||
strerror(errno));
|
||||
}
|
||||
|
||||
if (write_enable)
|
||||
bo_gem->mapped_cpu_write = true;
|
||||
|
||||
pthread_mutex_unlock(&bufmgr_gem->lock);
|
||||
|
||||
return 0;
|
||||
|
@ -1148,15 +1154,18 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
|
|||
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_sw_finish sw_finish;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (bo == NULL)
|
||||
return 0;
|
||||
|
||||
pthread_mutex_lock(&bufmgr_gem->lock);
|
||||
|
||||
/* Cause a flush to happen if the buffer's pinned for scanout, so the
|
||||
* results show up in a timely manner.
|
||||
if (bo_gem->mapped_cpu_write) {
|
||||
/* Cause a flush to happen if the buffer's pinned for
|
||||
* scanout, so the results show up in a timely manner.
|
||||
* Unlike GTT set domains, this only does work if the
|
||||
* buffer should be scanout-related.
|
||||
*/
|
||||
sw_finish.handle = bo_gem->gem_handle;
|
||||
ret = drmIoctl(bufmgr_gem->fd,
|
||||
|
@ -1164,6 +1173,9 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
|
|||
&sw_finish);
|
||||
ret = ret == -1 ? -errno : 0;
|
||||
|
||||
bo_gem->mapped_cpu_write = false;
|
||||
}
|
||||
|
||||
bo->virtual = NULL;
|
||||
pthread_mutex_unlock(&bufmgr_gem->lock);
|
||||
|
||||
|
|
Loading…
Reference in New Issue