[Intel-gfx] [PATCH] enable blt acceleration on gen6

Chris Wilson chris at chris-wilson.co.uk
Wed Oct 27 11:08:22 CEST 2010


On Wed, 27 Oct 2010 14:47:32 +0800, Zou Nan hai <nanhai.zou at intel.com> wrote:
> uxa: enable blt acceleration on gen6 hardware.

That's pretty close to what I had in mind. I thought adding
intel_batch_set_mode(BLT), intel_batch_set_mode(RENDER) etc a bit more
explicit. That gives us a single point at which we can detect a context
switch and perform workarounds, rather than just continuing to add them ad
hoc.

e.g.
static inline void
intel_batch_set_mode(struct intel_screen_private *intel, int mode)
{
  if (mode == intel->batch.mode)
    return;

  intel->batch.context_switch(intel, mode);
  intel->batch.mode = mode;
}

static void
gen6_batch_context_switch(struct intel_screen_private *intel,
                          int mode)
{
  intel_batch_flush(intel);
  intel->batch.ring = mode;
}

static void
gen5_batch_context_switch(struct intel_screen_private *intel,
                          int mode)
{
  if (intel->batch.mode == BLT) {
	OUT_BATCH(3D_NP); /* 2D->3D non-pipeling workaround */
  }
  intel_batch_flush(intel);
}

void intel_batch_submit(struct intel_screen_private *intel)
{
  execbuf.flags |= intel->batch.ring;
  ...
  intel->batch.mode = NONE;
}

etc. [Forgive me the bit of poetic licence in those snippets.] The only
nasty side-effect of that is that you need to perform the
intel_batch_set_mode() in both the prepare and done routines (in case the
batch is emitted before done()).

Btw, why the 32 NOOP workaround? I haven't stumbled across the reason
for that yet.

Your patch works as advertised with just a s/I915_EXEC_BLIT/I915_EXEC_BLT/.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre



More information about the Intel-gfx mailing list