[Mesa-dev] [PATCH 1/2] r600g/compute: Add a member to the items to track how many maps it has

Bruno Jiménez brunojimen at gmail.com
Thu Aug 7 03:14:23 PDT 2014


This will be necessary to know how many mappings for read it has, as
the spec allows to have as many as desired.
---
 src/gallium/drivers/r600/compute_memory_pool.c | 5 +++--
 src/gallium/drivers/r600/compute_memory_pool.h | 1 +
 src/gallium/drivers/r600/evergreen_compute.c   | 3 +--
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 0ee8ceb..497ff90 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -403,11 +403,12 @@ int compute_memory_promote_item(struct compute_memory_pool *pool,
 				dst, 0, item->start_in_dw * 4, 0 ,0,
 				src, 0, &box);
 
-		/* We check if the item is mapped for reading.
+		/* We check if the item is mapped. At this point, only
+		 * buffers mapped for reading should still be mapped.
 		 * In this case, we need to keep the temporary buffer 'alive'
 		 * because it is possible to keep a map active for reading
 		 * while a kernel (that reads from it) executes */
-		if (!(item->status & ITEM_MAPPED_FOR_READING)) {
+		if (item->map_count == 0) {
 			pool->screen->b.b.resource_destroy(screen, src);
 			item->real_buffer = NULL;
 		}
diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
index 161ddd5..8fcd75b 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.h
+++ b/src/gallium/drivers/r600/compute_memory_pool.h
@@ -41,6 +41,7 @@ struct compute_memory_item
 	int64_t id;		/**< ID of the memory chunk */
 
 	uint32_t status;	/**< Will track the status of the item */
+	uint32_t map_count;	/**< Will track the number of maps done to the item */
 
 	/** Start pointer in dwords relative in the pool bo. If an item
 	 * is unallocated, then this value must be -1 to indicate this. */
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index 1970414..f50f94a 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -986,8 +986,7 @@ void *r600_compute_global_transfer_map(
 
 	dst = (struct pipe_resource*)item->real_buffer;
 
-	if (usage & PIPE_TRANSFER_READ)
-		buffer->chunk->status |= ITEM_MAPPED_FOR_READING;
+	item->map_count++;
 
 	COMPUTE_DBG(rctx->screen, "* r600_compute_global_transfer_map()\n"
 			"level = %u, usage = %u, box(x = %u, y = %u, z = %u "
-- 
2.0.4



More information about the mesa-dev mailing list