Re: [Intel-gfx] [PATCH] drm/i915: Only emit flushes on active rings.

2010-08-06 Thread Eric Anholt
On Wed,  4 Aug 2010 13:55:32 +0100, Chris Wilson ch...@chris-wilson.co.uk 
wrote:
 This avoids the excess flush and requests on idle rings (and spamming
 the debug log ;-)

Applied to for-linus.


pgpX8IaVxLdZK.pgp
Description: PGP signature
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915: Only emit flushes on active rings.

2010-08-04 Thread Chris Wilson
This avoids the excess flush and requests on idle rings (and spamming
the debug log ;-)

Signed-off-by: Chris Wilson ch...@chris-wilson.co.uk
---
 drivers/gpu/drm/i915/i915_drv.h |3 +++
 drivers/gpu/drm/i915/i915_gem.c |   26 --
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 61a8c90..844d10e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -286,6 +286,9 @@ typedef struct drm_i915_private {
unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
int vblank_pipe;
int num_pipe;
+   u32 flush_rings;
+#define FLUSH_RENDER_RING  0x1
+#define FLUSH_BSD_RING 0x2
 
/* For hangcheck timer */
 #define DRM_I915_HANGCHECK_PERIOD 75 /* in jiffies */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index b2ff908..36d7e93 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2936,6 +2936,7 @@ static void
 i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
 {
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);
uint32_tinvalidate_domains = 0;
uint32_tflush_domains = 0;
@@ -2998,6 +2999,13 @@ i915_gem_object_set_to_gpu_domain(struct drm_gem_object 
*obj)
obj-pending_write_domain = obj-write_domain;
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-flush_domains |= flush_domains;
 #if WATCH_BUF
@@ -3536,7 +3544,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
ring = dev_priv-render_ring;
}
 
-
if (args-buffer_count  1) {
DRM_ERROR(execbuf with %d buffers\n, args-buffer_count);
return -EINVAL;
@@ -3710,6 +3717,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 */
dev-invalidate_domains = 0;
dev-flush_domains = 0;
+   dev_priv-flush_rings = 0;
 
for (i = 0; i  args-buffer_count; i++) {
struct drm_gem_object *obj = object_list[i];
@@ -3730,16 +3738,14 @@ i915_gem_do_execbuffer(struct drm_device *dev, void 
*data,
i915_gem_flush(dev,
   dev-invalidate_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,
-   dev-flush_domains,
-   dev_priv-render_ring);
-
-   if (HAS_BSD(dev))
-   (void)i915_add_request(dev, file_priv,
-   dev-flush_domains,
-   dev_priv-bsd_ring);
-   }
+  dev-flush_domains,
+  dev_priv-render_ring);
+   if (dev_priv-flush_rings  FLUSH_BSD_RING)
+   (void)i915_add_request(dev, file_priv,
+  dev-flush_domains,
+  dev_priv-bsd_ring);
}
 
for (i = 0; i  args-buffer_count; i++) {
-- 
1.7.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx