drm/i915: Don't forget to apply SNB PIPE_CONTROL GTT workaround.
If a buffer that was the target of a PIPE_CONTROL from userland was a reused one that hadn't been evicted which had not previously had this workaround applied, then the early return for a correct presumed_offset in this function meant we would not bind it into the GTT and the write would land somewhere else. Fixes reproducible failures with GL_EXT_timer_query usage in apitrace, and I also expect it to fix the intermittent OQ issues on snb that danvet's been working on. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48019 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=52932 Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Carl Worth <cworth@cworth.org> Tested-by: Carl Worth <cworth@cworth.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
6af2d180f8
commit
e844b990b1
|
@ -291,6 +291,16 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
||||||
target_i915_obj = to_intel_bo(target_obj);
|
target_i915_obj = to_intel_bo(target_obj);
|
||||||
target_offset = target_i915_obj->gtt_offset;
|
target_offset = target_i915_obj->gtt_offset;
|
||||||
|
|
||||||
|
/* Sandybridge PPGTT errata: We need a global gtt mapping for MI and
|
||||||
|
* pipe_control writes because the gpu doesn't properly redirect them
|
||||||
|
* through the ppgtt for non_secure batchbuffers. */
|
||||||
|
if (unlikely(IS_GEN6(dev) &&
|
||||||
|
reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
|
||||||
|
!target_i915_obj->has_global_gtt_mapping)) {
|
||||||
|
i915_gem_gtt_bind_object(target_i915_obj,
|
||||||
|
target_i915_obj->cache_level);
|
||||||
|
}
|
||||||
|
|
||||||
/* The target buffer should have appeared before us in the
|
/* The target buffer should have appeared before us in the
|
||||||
* exec_object list, so it should have a GTT space bound by now.
|
* exec_object list, so it should have a GTT space bound by now.
|
||||||
*/
|
*/
|
||||||
|
@ -399,16 +409,6 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
||||||
io_mapping_unmap_atomic(reloc_page);
|
io_mapping_unmap_atomic(reloc_page);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sandybridge PPGTT errata: We need a global gtt mapping for MI and
|
|
||||||
* pipe_control writes because the gpu doesn't properly redirect them
|
|
||||||
* through the ppgtt for non_secure batchbuffers. */
|
|
||||||
if (unlikely(IS_GEN6(dev) &&
|
|
||||||
reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
|
|
||||||
!target_i915_obj->has_global_gtt_mapping)) {
|
|
||||||
i915_gem_gtt_bind_object(target_i915_obj,
|
|
||||||
target_i915_obj->cache_level);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* and update the user's relocation entry */
|
/* and update the user's relocation entry */
|
||||||
reloc->presumed_offset = target_offset;
|
reloc->presumed_offset = target_offset;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue