Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • coypoop/xf86-video-intel
  • adamjrichter/xf86-video-intel
  • banzr/xf86-video-intel
  • E5ten/xf86-video-intel
  • ross/xf86-video-intel
  • thomas.preston/xf86-video-intel
  • hanno/xf86-video-intel
  • Ma/xf86-video-intel
  • airlied/xf86-video-intel
  • develomentional/xf86-video-intel
10 results
Show changes
Commits on Source (2)
......@@ -2957,45 +2957,10 @@ prefer_blt_copy(struct sna *sna,
struct kgem_bo *dst_bo,
unsigned flags)
{
if (sna->kgem.mode == KGEM_BLT)
return true;
if (sna->info->gen == 075) /* avoid clear-residuals context overhead */
return true;
assert((flags & COPY_SYNC) == 0);
if (untiled_tlb_miss(src_bo) ||
untiled_tlb_miss(dst_bo))
return true;
if (flags & COPY_DRI && !sna->kgem.has_semaphores)
return false;
if (force_blt_ring(sna, dst_bo, src_bo))
return true;
if ((flags & COPY_SMALL ||
(sna->render_state.gt < 3 && src_bo == dst_bo)) &&
can_switch_to_blt(sna, dst_bo, flags))
return true;
if (kgem_bo_is_render(dst_bo) ||
kgem_bo_is_render(src_bo))
return false;
if (flags & COPY_LAST &&
sna->render_state.gt < 3 &&
can_switch_to_blt(sna, dst_bo, flags))
return true;
if (prefer_render_ring(sna, dst_bo))
return false;
if (!prefer_blt_ring(sna, dst_bo, flags))
if (sna->kgem.ring != KGEM_BLT)
return false;
return prefer_blt_bo(sna, src_bo, dst_bo);
return true; /* avoid clear-residuals context overhead */
}
static bool
......
......@@ -520,7 +520,7 @@ static bool gem_set_caching(int fd, uint32_t handle, int caching)
return do_ioctl(fd, LOCAL_IOCTL_I915_GEM_SET_CACHING, &arg) == 0;
}
static uint32_t gem_userptr(int fd, void *ptr, int size, int read_only)
static uint32_t gem_userptr(int fd, void *ptr, size_t size, int read_only)
{
struct local_i915_gem_userptr arg;
......@@ -7031,6 +7031,30 @@ uint32_t kgem_bo_flink(struct kgem *kgem, struct kgem_bo *bo)
return flink.name;
}
static bool probe(struct kgem *kgem, uint32_t handle)
{
struct drm_i915_gem_set_domain arg = {
.handle = handle,
.read_domains = I915_GEM_DOMAIN_CPU,
};
return do_ioctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &arg) == 0;
}
static uint32_t probe_userptr(struct kgem *kgem,
void *ptr, size_t size, int read_only)
{
uint32_t handle;
handle = gem_userptr(kgem->fd, ptr, size, read_only);
if (handle && !probe(kgem, handle)) {
gem_close(kgem->fd, handle);
handle = 0;
}
return handle;
}
struct kgem_bo *kgem_create_map(struct kgem *kgem,
void *ptr, uint32_t size,
bool read_only)
......@@ -7053,30 +7077,16 @@ struct kgem_bo *kgem_create_map(struct kgem *kgem,
last_page &= ~(uintptr_t)(PAGE_SIZE-1);
assert(last_page > first_page);
handle = gem_userptr(kgem->fd,
(void *)first_page, last_page-first_page,
read_only);
handle = probe_userptr(kgem,
(void *)first_page, last_page-first_page,
read_only);
if (handle == 0 && read_only && kgem->has_wc_mmap)
handle = probe_userptr(kgem,
(void *)first_page, last_page-first_page,
false);
if (handle == 0) {
if (read_only && kgem->has_wc_mmap) {
struct drm_i915_gem_set_domain set_domain;
handle = gem_userptr(kgem->fd,
(void *)first_page, last_page-first_page,
false);
VG_CLEAR(set_domain);
set_domain.handle = handle;
set_domain.read_domains = I915_GEM_DOMAIN_GTT;
set_domain.write_domain = 0;
if (do_ioctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain)) {
gem_close(kgem->fd, handle);
handle = 0;
}
}
if (handle == 0) {
DBG(("%s: import failed, errno=%d\n", __FUNCTION__, errno));
return NULL;
}
DBG(("%s: import failed, errno=%d\n", __FUNCTION__, errno));
return NULL;
}
bo = __kgem_bo_alloc(handle, (last_page - first_page) / PAGE_SIZE);
......