Daniel originally shot this patch down as being a layering violation. In fact, over time I've come to agree with him on this. However, it is handy for debug information, and after the below commit, I need some way to be able to not lazily bind objects to the gtt for contexts. commit 0ebb98299357e1dbeeea470eec29241263c8f244 Author: Daniel Vetter <daniel.vetter at ffwll.ch> Date: Wed Feb 15 23:50:24 2012 +0100 drm/i915: enable lazy global-gtt binding Signed-off-by: Ben Widawsky <ben at bwidawsk.net> --- drivers/gpu/drm/i915/i915_drv.h | 5 +++++ drivers/gpu/drm/i915/i915_gem.c | 1 + drivers/gpu/drm/i915/i915_gem_context.c | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index f543679..9b309aa 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -993,6 +993,11 @@ struct drm_i915_gem_object { * reaches 0, dev_priv->pending_flip_queue will be woken up. */ atomic_t pending_flip; + + /** + * >= 0 if this object is the object for a context. + */ + int context_id; }; #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 28f00dc..2142e9c 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -3439,6 +3439,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, obj->madv = I915_MADV_WILLNEED; /* Avoid an unnecessary call to unbind on the first bind. */ obj->map_and_fenceable = true; + obj->context_id = -1; return obj; } diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 2aca002..bf57123 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -162,7 +162,7 @@ create_hw_context(struct drm_device *dev, /* Default context will never have a file_priv */ if (file_priv == NULL) - return 0; + goto out; (*ctx_out)->file_priv = file_priv; @@ -183,6 +183,8 @@ again: else if (ret) goto err_out; +out: + (*ctx_out)->obj->context_id = (*ctx_out)->id; return 0; err_out: @@ -214,6 +216,8 @@ static int create_default_context(struct drm_i915_private *dev_priv) * default context. */ ctx = dev_priv->ring[RCS].default_context; + ctx->id = DEFAULT_CONTEXT_ID; + ctx->obj->context_id = DEFAULT_CONTEXT_ID; ret = i915_gem_object_pin(ctx->obj, CONTEXT_ALIGN, false); if (ret) { do_destroy(ctx); -- 1.7.10.2