drm/i915: Move ringbuffer accounting to begin/advance.
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 4 Aug 2010 14:18:13 +0000 (15:18 +0100)
committerEric Anholt <eric@anholt.net>
Mon, 9 Aug 2010 18:24:31 +0000 (11:24 -0700)
As we check that the ringbuffer will not wrap upon emission, we do not
need to check that incrementing the tail wrapped every time. However, we
do upon advancing just in case the tail is now pointing at the very end
of the ring.

Likewise we can account for the space used during emission in begin()
and avoid decrementing it for every emit.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_ringbuffer.c

index df8302a11eb5b811bfc5fc7434a63f1ffa65f2ba..7ab72af045ec70ca4baaf09b1eb9032836b12a1a 100644 (file)
@@ -731,6 +731,8 @@ void intel_ring_begin(struct drm_device *dev,
                intel_wrap_ring_buffer(dev, ring);
        if (unlikely(ring->space < n))
                intel_wait_ring_buffer(dev, ring, n);
+
+       ring->space -= n;
 }
 
 void intel_ring_emit(struct drm_device *dev,
@@ -739,13 +741,12 @@ void intel_ring_emit(struct drm_device *dev,
        unsigned int *virt = ring->virtual_start + ring->tail;
        *virt = data;
        ring->tail += 4;
-       ring->tail &= ring->size - 1;
-       ring->space -= 4;
 }
 
 void intel_ring_advance(struct drm_device *dev,
                struct intel_ring_buffer *ring)
 {
+       ring->tail &= ring->size - 1;
        ring->advance_ring(dev, ring);
 }