Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306991
b: refs/heads/master
c: 8489731
h: refs/heads/master
i:
  306989: a27f071
  306987: 97deb6d
  306983: c020181
  306975: c3ac899
v: v3
  • Loading branch information
Daniel Vetter committed Mar 27, 2012
1 parent 8394c6d commit d34d12e
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6d5cd9cb1e32e4f4e4468704430b26bcb0bfb129
refs/heads/master: 8489731c9bd22c27ab17a2190cd7444604abf95f
26 changes: 20 additions & 6 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,25 @@ i915_gem_shmem_pread(struct drm_device *dev,
int shmem_page_offset, page_length, ret = 0;
int obj_do_bit17_swizzling, page_do_bit17_swizzling;
int hit_slowpath = 0;
int needs_clflush = 0;

user_data = (char __user *) (uintptr_t) args->data_ptr;
remain = args->size;

obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);

if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)) {
/* If we're not in the cpu read domain, set ourself into the gtt
* read domain and manually flush cachelines (if required). This
* optimizes for the case when the gpu will dirty the data
* anyway again before the next pread happens. */
if (obj->cache_level == I915_CACHE_NONE)
needs_clflush = 1;
ret = i915_gem_object_set_to_gtt_domain(obj, false);
if (ret)
return ret;
}

offset = args->offset;

while (remain > 0) {
Expand Down Expand Up @@ -337,6 +350,9 @@ i915_gem_shmem_pread(struct drm_device *dev,

if (!page_do_bit17_swizzling) {
vaddr = kmap_atomic(page);
if (needs_clflush)
drm_clflush_virt_range(vaddr + shmem_page_offset,
page_length);
ret = __copy_to_user_inatomic(user_data,
vaddr + shmem_page_offset,
page_length);
Expand All @@ -350,6 +366,10 @@ i915_gem_shmem_pread(struct drm_device *dev,
mutex_unlock(&dev->struct_mutex);

vaddr = kmap(page);
if (needs_clflush)
drm_clflush_virt_range(vaddr + shmem_page_offset,
page_length);

if (page_do_bit17_swizzling)
ret = __copy_to_user_swizzled(user_data,
vaddr, shmem_page_offset,
Expand Down Expand Up @@ -430,12 +450,6 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,

trace_i915_gem_object_pread(obj, args->offset, args->size);

ret = i915_gem_object_set_cpu_read_domain_range(obj,
args->offset,
args->size);
if (ret)
goto out;

ret = i915_gem_shmem_pread(dev, obj, args, file);

out:
Expand Down

0 comments on commit d34d12e

Please sign in to comment.