[Intel-gfx] [PATCH 2/4] drm/i915: OR in the COMMAND read domain for the batch buffer.

Chris Wilson chris at chris-wilson.co.uk
Thu May 21 12:08:29 CEST 2009


The batch buffer may be shared with another read buffer, so we should not
ignore any previously set domains, but just or in the command domain (and
check that the buffer is not writable).
---
 drivers/gpu/drm/i915/i915_gem.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 0c5d8dd..2b4dd5a 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3323,11 +3323,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
 			goto err;
 	}
 
-	/* Set the pending read domains for the batch buffer to COMMAND */
-	batch_obj = object_list[args->buffer_count-1];
-	batch_obj->pending_read_domains = I915_GEM_DOMAIN_COMMAND;
-	batch_obj->pending_write_domain = 0;
-
 	/* Sanity check the batch buffer, prior to moving objects */
 	exec_offset = exec_list[args->buffer_count - 1].offset;
 	ret = i915_gem_check_execbuffer (args, exec_offset);
@@ -3352,6 +3347,15 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
 		i915_gem_object_set_to_gpu_domain(obj);
 	}
 
+	/* Set the pending read domains for the batch buffer to COMMAND */
+	batch_obj = object_list[args->buffer_count-1];
+	if (batch_obj->pending_write_domain) {
+		DRM_ERROR("Attempting to use self-modifying batch buffer\n");
+		ret = -EINVAL;
+		goto err;
+	}
+	batch_obj->pending_read_domains |= I915_GEM_DOMAIN_COMMAND;
+
 	i915_verify_inactive(dev, __FILE__, __LINE__);
 
 	if (dev->invalidate_domains | dev->flush_domains) {
-- 
1.6.3.1




More information about the Intel-gfx mailing list