drm/i915: Only change the context object's domain when binding
We know that the only access to the context object is via the GPU, and the only time when it can be out of the GPU domain is when it is swapped out and unbound. Therefore we only need to clflush the object when binding, thus avoiding any potential stall on touching the domain on an active context. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1471254551-25805-16-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
parent
bf3783e52a
commit
7abc98fadf
|
@ -772,6 +772,13 @@ static int do_rcs_switch(struct drm_i915_gem_request *req)
|
||||||
if (skip_rcs_switch(ppgtt, engine, to))
|
if (skip_rcs_switch(ppgtt, engine, to))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* Clear this page out of any CPU caches for coherent swap-in/out. */
|
||||||
|
if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
|
||||||
|
ret = i915_gem_object_set_to_gtt_domain(vma->obj, false);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Trying to pin first makes error handling easier. */
|
/* Trying to pin first makes error handling easier. */
|
||||||
ret = i915_vma_pin(vma, 0, to->ggtt_alignment, PIN_GLOBAL);
|
ret = i915_vma_pin(vma, 0, to->ggtt_alignment, PIN_GLOBAL);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -786,18 +793,6 @@ static int do_rcs_switch(struct drm_i915_gem_request *req)
|
||||||
*/
|
*/
|
||||||
from = engine->last_context;
|
from = engine->last_context;
|
||||||
|
|
||||||
/*
|
|
||||||
* Clear this page out of any CPU caches for coherent swap-in/out. Note
|
|
||||||
* that thanks to write = false in this call and us not setting any gpu
|
|
||||||
* write domains when putting a context object onto the active list
|
|
||||||
* (when switching away from it), this won't block.
|
|
||||||
*
|
|
||||||
* XXX: We need a real interface to do this instead of trickery.
|
|
||||||
*/
|
|
||||||
ret = i915_gem_object_set_to_gtt_domain(vma->obj, false);
|
|
||||||
if (ret)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
if (needs_pd_load_pre(ppgtt, engine, to)) {
|
if (needs_pd_load_pre(ppgtt, engine, to)) {
|
||||||
/* Older GENs and non render rings still want the load first,
|
/* Older GENs and non render rings still want the load first,
|
||||||
* "PP_DCLV followed by PP_DIR_BASE register through Load
|
* "PP_DCLV followed by PP_DIR_BASE register through Load
|
||||||
|
|
|
@ -2092,6 +2092,10 @@ static int intel_ring_context_pin(struct i915_gem_context *ctx,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (ce->state) {
|
if (ce->state) {
|
||||||
|
ret = i915_gem_object_set_to_gtt_domain(ce->state->obj, false);
|
||||||
|
if (ret)
|
||||||
|
goto error;
|
||||||
|
|
||||||
ret = i915_vma_pin(ce->state, 0, ctx->ggtt_alignment,
|
ret = i915_vma_pin(ce->state, 0, ctx->ggtt_alignment,
|
||||||
PIN_GLOBAL | PIN_HIGH);
|
PIN_GLOBAL | PIN_HIGH);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
Loading…
Reference in New Issue