drm/i915/bdw: Introduce one context backing object per engine
authorOscar Mateo <oscar.mateo@intel.com>
Thu, 24 Jul 2014 16:04:13 +0000 (17:04 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 11 Aug 2014 14:04:16 +0000 (16:04 +0200)
A context backing object only makes sense for a given engine (because
it holds state data specific to that engine).

In legacy ringbuffer sumission mode, the only MI_SET_CONTEXT we really
perform is for the render engine, so one backing object is all we nee.

With Execlists, however, we need backing objects for every engine, as
contexts become the only way to submit workloads to the GPU. To tackle
this problem, we multiplex the context struct to contain <no-of-engines>
objects.

Originally, I colored this code by instantiating one new context for
every engine I wanted to use, but this change suggested by Brad Volkin
makes it more elegant.

v2: Leave the old backing object pointer behind. Daniel Vetter suggested
using a union, but it makes more sense to keep rcs_state as a NULL
pointer behind, to make sure no one uses it incorrectly when Execlists
are enabled, similar to what he suggested for ring->buffer (Rusty's API
level 5).

v3: Use the name "state" instead of the too-generic "obj", so that it
mirrors the name choice for the legacy rcs_state.

Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h

index fd2aa15ce02b59ed4398d4d1b9cfc1aebf6b9b80..ad70e8ec18bc1732bb48ad02eaff2f3102ae3d9d 100644 (file)
@@ -626,11 +626,17 @@ struct intel_context {
        struct i915_ctx_hang_stats hang_stats;
        struct i915_address_space *vm;
 
+       /* Legacy ring buffer submission */
        struct {
                struct drm_i915_gem_object *rcs_state;
                bool initialized;
        } legacy_hw_ctx;
 
+       /* Execlists */
+       struct {
+               struct drm_i915_gem_object *state;
+       } engine[I915_NUM_RINGS];
+
        struct list_head link;
 };