[PATCH 073/131] drm/i915: Suppress switch_mm emission between the same aliasing_ppgtt
Chris Wilson
chris at chris-wilson.co.uk
Sat Aug 6 07:36:40 UTC 2016
When switching between contexts using the aliasing_ppgtt, the VM is
shared. We don't need to reload the PD registers unless they are dirty.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_gem_context.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index b4f2aed69871..ecef433fe396 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -768,10 +768,10 @@ static inline bool skip_rcs_switch(struct i915_hw_ppgtt *ppgtt,
}
static bool
-needs_pd_load_pre(struct i915_hw_ppgtt *ppgtt,
- struct intel_engine_cs *engine,
- struct i915_gem_context *to)
+needs_pd_load_pre(struct i915_hw_ppgtt *ppgtt, struct intel_engine_cs *engine)
{
+ struct i915_hw_ppgtt *last_ppgtt;
+
if (!ppgtt)
return false;
@@ -780,7 +780,9 @@ needs_pd_load_pre(struct i915_hw_ppgtt *ppgtt,
return true;
/* Same context without new entries, skip */
- if (engine->last_context == to &&
+ last_ppgtt =
+ engine->last_context->ppgtt ?: engine->i915->mm.aliasing_ppgtt;
+ if (last_ppgtt == ppgtt &&
!(intel_engine_flag(engine) & ppgtt->pd_dirty_rings))
return false;
@@ -855,7 +857,7 @@ static int do_rcs_switch(struct drm_i915_gem_request *req)
*/
flush_cpu_writes(to->engine[RCS].state->obj);
- if (needs_pd_load_pre(ppgtt, engine, to)) {
+ if (needs_pd_load_pre(ppgtt, engine)) {
/* Older GENs and non render rings still want the load first,
* "PP_DCLV followed by PP_DIR_BASE register through Load
* Register Immediate commands in Ring Buffer before submitting
@@ -976,7 +978,7 @@ int i915_switch_context(struct drm_i915_gem_request *req)
struct i915_hw_ppgtt *ppgtt =
to->ppgtt ?: req->i915->mm.aliasing_ppgtt;
- if (needs_pd_load_pre(ppgtt, engine, to)) {
+ if (needs_pd_load_pre(ppgtt, engine)) {
int ret;
trace_switch_mm(engine, to);
--
2.8.1
More information about the Intel-gfx-trybot
mailing list