diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 1ff092c..e6f5176 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -3236,9 +3236,11 @@ kgem_batch_write(struct kgem *kgem, struct kgem_bo *bo, uint32_t size) { + unsigned domain; char *ptr; int ret; + assert(bo->rq == NULL); ASSERT_IDLE(kgem, bo->handle); #if DBG_NO_EXEC @@ -3255,12 +3257,29 @@ retry: ptr = bo->map__cpu; if (ptr == NULL) ptr = __kgem_bo_map__cpu(kgem, bo); + + domain = I915_GEM_DOMAIN_CPU; } else if (kgem->has_wc_mmap) { ptr = bo->map__wc; if (ptr == NULL) ptr = __kgem_bo_map__wc(kgem, bo); + + domain = I915_GEM_DOMAIN_GTT; } + if (ptr) { + struct drm_i915_gem_set_domain set_domain; + + VG_CLEAR(set_domain); + set_domain.handle = bo->handle; + set_domain.read_domains = domain; + set_domain.write_domain = domain; + + if (do_ioctl(kgem->fd, + DRM_IOCTL_I915_GEM_SET_DOMAIN, + &set_domain)) + return -errno; + memcpy(ptr, kgem->batch, sizeof(uint32_t)*kgem->nbatch); if (kgem->surface != kgem->batch_size) { ret = PAGE_ALIGN(sizeof(uint32_t) * kgem->batch_size);