[Mesa-dev] [PATCH 03/11] r600g/compute: Add statuses to the compute_memory_items

Bruno Jiménez brunojimen at gmail.com
Wed Jun 18 08:01:53 PDT 2014


These statuses will help track whether the items are mapped
or if they should be promoted to or demoted from the pool

v2: Use the new is_item_in_pool util function,
    as suggested by Tom Stellard
---
 src/gallium/drivers/r600/compute_memory_pool.h |  7 ++++++-
 src/gallium/drivers/r600/evergreen_compute.c   | 12 ++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
index d8201c4..cd93a19 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.h
+++ b/src/gallium/drivers/r600/compute_memory_pool.h
@@ -27,13 +27,18 @@
 
 #include <stdlib.h>
 
+#define ITEM_MAPPED_FOR_READING (1<<0)
+#define ITEM_MAPPED_FOR_WRITING (1<<1)
+#define ITEM_FOR_PROMOTING      (1<<2)
+#define ITEM_FOR_DEMOTING       (1<<3)
+
 struct compute_memory_pool;
 
 struct compute_memory_item
 {
 	int64_t id; ///ID of the memory chunk
 
-	int untouched; ///True if the memory contains only junk, no need to save it for defrag
+	uint32_t status; ///Will track the status of the item
 
 	int64_t start_in_dw; ///Start pointer in dwords relative in the pool bo
 	int64_t size_in_dw; ///Size of the chunk in dwords
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index c152e54..8657071 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -659,6 +659,15 @@ static void evergreen_set_global_binding(
 		return;
 	}
 
+	/* We mark these items for promotion to the pool if they
+	 * aren't already there */
+	for (int i = 0; i < n; i++) {
+		struct compute_memory_item *item = buffers[i]->chunk;
+
+		if (!is_item_in_pool(item))
+			buffers[i]->chunk->status |= ITEM_FOR_PROMOTING;
+	}
+
 	compute_memory_finalize_pending(pool, ctx_);
 
 	for (int i = 0; i < n; i++)
@@ -969,6 +978,9 @@ void *r600_compute_global_transfer_map(
 		offset += (buffer->chunk->start_in_dw * 4);
 	}
 
+	if (usage & PIPE_TRANSFER_READ)
+		buffer->chunk->status |= ITEM_MAPPED_FOR_READING;
+
 	COMPUTE_DBG(rctx->screen, "* r600_compute_global_transfer_map()\n"
 			"level = %u, usage = %u, box(x = %u, y = %u, z = %u "
 			"width = %u, height = %u, depth = %u)\n", level, usage,
-- 
2.0.0



More information about the mesa-dev mailing list