On Fri, Nov 1, 2013 at 5:04 PM, Ben Widawsky <benjamin.widawsky@xxxxxxxxx> wrote: > When not blitting to scanout, we can save some power by not tracking > blits, and more importantly, unnecessarily invalidating lines which we > don't care a bout. > > These instructions are explicitly spelled out in the spec, but it is how > I expect it to work. Unfortunately, I do not have power data for this. > > v2: Don't advance the ring twice (Stéphane) > Rename extra_dwords to dwrods (Stéphane) > > Cc: Stéphane Marchesin <marcheu@xxxxxxxxxxxx> > Signed-off-by: Ben Widawsky <ben@xxxxxxxxxxxx> For both: Tested-by: Stéphane Marchesin <marcheu@xxxxxxxxxxxx> Reviewed-by: Stéphane Marchesin <marcheu@xxxxxxxxxxxx> Stéphane > --- > drivers/gpu/drm/i915/intel_ringbuffer.c | 20 +++++++++++++++++--- > 1 file changed, 17 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c > index ddd7681..8c6e9b2 100644 > --- a/drivers/gpu/drm/i915/intel_ringbuffer.c > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c > @@ -296,7 +296,8 @@ static int gen6_ring_fbc_flush(struct intel_ring_buffer *ring) > _MASKED_BIT_ENABLE(GEN6_BLITTER_FBC_NOTIFY)); > intel_ring_advance(ring); > > - ring->fbc_dirty = false; > + /* We'll mark the fbc clean only after the operation has completed so we > + * can track when to disable the bit above */ > return 0; > } > > @@ -642,11 +643,13 @@ gen6_add_request(struct intel_ring_buffer *ring) > struct drm_device *dev = ring->dev; > struct drm_i915_private *dev_priv = dev->dev_private; > struct intel_ring_buffer *useless; > - int i, ret; > + int i, ret, dwords = 4; > > + if (ring->fbc_dirty && ring->id == BCS) > + dwords += 4; > ret = intel_ring_begin(ring, ((I915_NUM_RINGS-1) * > MBOX_UPDATE_DWORDS) + > - 4); > + dwords); > if (ret) > return ret; > #undef MBOX_UPDATE_DWORDS > @@ -661,6 +664,17 @@ gen6_add_request(struct intel_ring_buffer *ring) > intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); > intel_ring_emit(ring, ring->outstanding_lazy_seqno); > intel_ring_emit(ring, MI_USER_INTERRUPT); > + > + if (ring->fbc_dirty && ring->id == BCS) { > + intel_ring_emit(ring, MI_NOOP); > + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); > + intel_ring_emit(ring, GEN6_BLITTER_ECOSKPD); > + intel_ring_emit(ring, > + _MASKED_BIT_DISABLE(GEN6_BLITTER_FBC_NOTIFY)); > + > + ring->fbc_dirty = false; > + } > + > __intel_ring_advance(ring); > > return 0; > -- > 1.8.4.2 > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx