On Fri, Dec 12, 2014 at 04:13:03PM +0000, Dave Gordon wrote:
>  static inline void intel_ring_advance(struct intel_engine_cs *ring)
>  {
>       struct intel_ringbuffer *ringbuf = ring->buffer;
> -     ringbuf->tail &= ringbuf->size - 1;
> +
> +     __intel_ringbuffer_check(ringbuf);
> +
> +     /*
> +      * Tail == effecive_size is legitimate (buffer exactly full).
> +      * Tail > effective_size is not, and should give a warning,
> +      * but we'll reset tail in both cases to prevent further chaos
> +      */
> +     if (ringbuf->tail >= ringbuf->effective_size)
> +             ringbuf->tail -= ringbuf->effective_size;

Urm. No. If you never write into the reserved pair of cachelines at the
end of the ringbuffer but the hw reads garbage from it, you lose.
tail &= size - 1; is a nice description of how the hw works that is
suitable for inlining, with all the magic in begin().

The goal is to remove the duplicated logic from intel_lrc.c, use
requests completely, and remove the dri1 hangover. To repeat what I said
last time:
http://cgit.freedesktop.org/~ickle/linux-2.6/tree/drivers/gpu/drm/i915/intel_ringbuffer.c?h=requests#n2447
is where I want us to go, a single piece of logic for ring management.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to