drm/i915: Only emit flushes on active rings.
This avoids the excess flush and requests on idle rings (and spamming the debug log ;-) Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
e044218a8e
commit
88f356b725
|
@ -285,6 +285,9 @@ typedef struct drm_i915_private {
|
||||||
unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
|
unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
|
||||||
int vblank_pipe;
|
int vblank_pipe;
|
||||||
int num_pipe;
|
int num_pipe;
|
||||||
|
u32 flush_rings;
|
||||||
|
#define FLUSH_RENDER_RING 0x1
|
||||||
|
#define FLUSH_BSD_RING 0x2
|
||||||
|
|
||||||
/* For hangcheck timer */
|
/* For hangcheck timer */
|
||||||
#define DRM_I915_HANGCHECK_PERIOD 75 /* in jiffies */
|
#define DRM_I915_HANGCHECK_PERIOD 75 /* in jiffies */
|
||||||
|
|
|
@ -3117,6 +3117,7 @@ static void
|
||||||
i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
|
i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = obj->dev;
|
struct drm_device *dev = obj->dev;
|
||||||
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
|
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
|
||||||
uint32_t invalidate_domains = 0;
|
uint32_t invalidate_domains = 0;
|
||||||
uint32_t flush_domains = 0;
|
uint32_t flush_domains = 0;
|
||||||
|
@ -3179,6 +3180,13 @@ i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
|
||||||
obj->pending_write_domain = obj->write_domain;
|
obj->pending_write_domain = obj->write_domain;
|
||||||
obj->read_domains = obj->pending_read_domains;
|
obj->read_domains = obj->pending_read_domains;
|
||||||
|
|
||||||
|
if (flush_domains & I915_GEM_GPU_DOMAINS) {
|
||||||
|
if (obj_priv->ring == &dev_priv->render_ring)
|
||||||
|
dev_priv->flush_rings |= FLUSH_RENDER_RING;
|
||||||
|
else if (obj_priv->ring == &dev_priv->bsd_ring)
|
||||||
|
dev_priv->flush_rings |= FLUSH_BSD_RING;
|
||||||
|
}
|
||||||
|
|
||||||
dev->invalidate_domains |= invalidate_domains;
|
dev->invalidate_domains |= invalidate_domains;
|
||||||
dev->flush_domains |= flush_domains;
|
dev->flush_domains |= flush_domains;
|
||||||
#if WATCH_BUF
|
#if WATCH_BUF
|
||||||
|
@ -3718,7 +3726,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
ring = &dev_priv->render_ring;
|
ring = &dev_priv->render_ring;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (args->buffer_count < 1) {
|
if (args->buffer_count < 1) {
|
||||||
DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
|
DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -3892,6 +3899,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
*/
|
*/
|
||||||
dev->invalidate_domains = 0;
|
dev->invalidate_domains = 0;
|
||||||
dev->flush_domains = 0;
|
dev->flush_domains = 0;
|
||||||
|
dev_priv->flush_rings = 0;
|
||||||
|
|
||||||
for (i = 0; i < args->buffer_count; i++) {
|
for (i = 0; i < args->buffer_count; i++) {
|
||||||
struct drm_gem_object *obj = object_list[i];
|
struct drm_gem_object *obj = object_list[i];
|
||||||
|
@ -3912,17 +3920,15 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
i915_gem_flush(dev,
|
i915_gem_flush(dev,
|
||||||
dev->invalidate_domains,
|
dev->invalidate_domains,
|
||||||
dev->flush_domains);
|
dev->flush_domains);
|
||||||
if (dev->flush_domains & I915_GEM_GPU_DOMAINS) {
|
if (dev_priv->flush_rings & FLUSH_RENDER_RING)
|
||||||
(void)i915_add_request(dev, file_priv,
|
(void)i915_add_request(dev, file_priv,
|
||||||
dev->flush_domains,
|
dev->flush_domains,
|
||||||
&dev_priv->render_ring);
|
&dev_priv->render_ring);
|
||||||
|
if (dev_priv->flush_rings & FLUSH_BSD_RING)
|
||||||
if (HAS_BSD(dev))
|
|
||||||
(void)i915_add_request(dev, file_priv,
|
(void)i915_add_request(dev, file_priv,
|
||||||
dev->flush_domains,
|
dev->flush_domains,
|
||||||
&dev_priv->bsd_ring);
|
&dev_priv->bsd_ring);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < args->buffer_count; i++) {
|
for (i = 0; i < args->buffer_count; i++) {
|
||||||
struct drm_gem_object *obj = object_list[i];
|
struct drm_gem_object *obj = object_list[i];
|
||||||
|
|
Loading…
Reference in a new issue