diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-19 07:31:36 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-21 06:19:53 -0400 |
commit | 77f01230223a08792f5320ebba27af9cbb81b0cf (patch) | |
tree | 26781f9316514cabec7b8cd449827dc04cb349b1 /drivers | |
parent | 9375e446e7f43be9a7c21e246cee35ea912532ec (diff) |
drm/i915: Clear GPU read domains on reset
Clear the GPU read domain for the inactive objects on a reset so that
they are correctly invalidated on reuse.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 13 |
3 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index cb1ddc6af6a6..38e889bfd99c 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -391,6 +391,11 @@ int i965_reset(struct drm_device *dev, u8 flags) | |||
391 | */ | 391 | */ |
392 | i915_gem_reset_flushing_list(dev); | 392 | i915_gem_reset_flushing_list(dev); |
393 | 393 | ||
394 | /* Move everything out of the GPU domains to ensure we do any | ||
395 | * necessary invalidation upon reuse. | ||
396 | */ | ||
397 | i915_gem_reset_inactive_gpu_domains(dev); | ||
398 | |||
394 | /* | 399 | /* |
395 | * Set the domains we want to reset (GRDOM/bits 2 and 3) as | 400 | * Set the domains we want to reset (GRDOM/bits 2 and 3) as |
396 | * well as the reset bit (GR/bit 0). Setting the GR bit | 401 | * well as the reset bit (GR/bit 0). Setting the GR bit |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 50fcb91218e8..ae05008a5900 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -998,6 +998,7 @@ int i915_gem_object_put_fence_reg(struct drm_gem_object *obj, | |||
998 | bool interruptible); | 998 | bool interruptible); |
999 | void i915_gem_retire_requests(struct drm_device *dev); | 999 | void i915_gem_retire_requests(struct drm_device *dev); |
1000 | void i915_gem_reset_flushing_list(struct drm_device *dev); | 1000 | void i915_gem_reset_flushing_list(struct drm_device *dev); |
1001 | void i915_gem_reset_inactive_gpu_domains(struct drm_device *dev); | ||
1001 | void i915_gem_clflush_object(struct drm_gem_object *obj); | 1002 | void i915_gem_clflush_object(struct drm_gem_object *obj); |
1002 | int i915_gem_object_set_domain(struct drm_gem_object *obj, | 1003 | int i915_gem_object_set_domain(struct drm_gem_object *obj, |
1003 | uint32_t read_domains, | 1004 | uint32_t read_domains, |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4e978e4044a3..325f52bc1401 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1699,6 +1699,19 @@ void i915_gem_reset_flushing_list(struct drm_device *dev) | |||
1699 | } | 1699 | } |
1700 | } | 1700 | } |
1701 | 1701 | ||
1702 | void i915_gem_reset_inactive_gpu_domains(struct drm_device *dev) | ||
1703 | { | ||
1704 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1705 | struct drm_i915_gem_object *obj_priv; | ||
1706 | |||
1707 | list_for_each_entry(obj_priv, | ||
1708 | &dev_priv->mm.inactive_list, | ||
1709 | list) | ||
1710 | { | ||
1711 | obj_priv->base.read_domains &= ~I915_GEM_GPU_DOMAINS; | ||
1712 | } | ||
1713 | } | ||
1714 | |||
1702 | /** | 1715 | /** |
1703 | * This function clears the request list as sequence numbers are passed. | 1716 | * This function clears the request list as sequence numbers are passed. |
1704 | */ | 1717 | */ |