[Mesa-dev] [PATCH 1/5] r600g: Add some comments and debug printfs to compute code

Tom Stellard tom at stellard.net
Mon Sep 17 14:08:56 PDT 2012


From: Tom Stellard <thomas.stellard at amd.com>

---
 src/gallium/drivers/r600/compute_memory_pool.c | 41 ++++++++++++++++++++++++--
 src/gallium/drivers/r600/evergreen_compute.c   | 15 ++++++++--
 2 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 002bdbe..1223f64 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -257,14 +257,16 @@ void compute_memory_finalize_pending(struct compute_memory_pool* pool,
 	COMPUTE_DBG("* compute_memory_finalize_pending()\n");
 
 	for (item = pool->item_list; item; item = item->next) {
-		COMPUTE_DBG("list: %i %p\n", item->start_in_dw, item->next);
+		COMPUTE_DBG("  + list: %i %p\n", item->start_in_dw, item->next);
 	}
 
+	/* Search through the list of memory items in the pool */
 	for (item = pool->item_list; item; item = next) {
 		next = item->next;
 
-
+		/* Check if the item is pending. */
 		if (item->start_in_dw == -1) {
+			/* It is pending, so add it to the pending_list... */
 			if (end_p) {
 				end_p->next = item;
 			}
@@ -272,6 +274,7 @@ void compute_memory_finalize_pending(struct compute_memory_pool* pool,
 				pending_list = item;
 			}
 
+			/* ... and then remove it from the item list. */
 			if (item->prev) {
 				item->prev->next = next;
 			}
@@ -283,26 +286,50 @@ void compute_memory_finalize_pending(struct compute_memory_pool* pool,
 				next->prev = item->prev;
 			}
 
+			/* This sequence makes the item be at the end of the list */
 			item->prev = end_p;
 			item->next = NULL;
 			end_p = item;
 
+			/* Update the amount of space we will need to allocate. */
 			unallocated += item->size_in_dw+1024;
 		}
 		else {
+			/* The item is not pendng, so update the amount of space
+			 * that has already been allocated. */
 			allocated += item->size_in_dw;
 		}
 	}
 
+	/* If we require more space than the size of the pool, then grow the
+	 * pool.
+	 *
+	 * XXX: I'm pretty sure this won't work.  Imagine this scenario:
+	 *
+	 * Offset Item Size
+	 *   0    A    50
+	 * 200    B    50
+	 * 400    C    50
+	 *
+	 * Total size = 450
+	 * Allocated size = 150
+	 * Pending Item D Size = 200
+	 * 
+	 * In this case, there are 300 units of free space in the pool, but
+	 * they aren't contiguous, so it will be impossible to allocate Item D.
+	 */
 	if (pool->size_in_dw < allocated+unallocated) {
 		compute_memory_grow_pool(pool, pipe, allocated+unallocated);
 	}
 
+	/* Loop through all the pending items, allocate space for them and
+	 * add them back to the item_list. */
 	for (item = pending_list; item; item = next) {
 		next = item->next;
 
 		int64_t start_in_dw;
 
+		/* Search for free space in the pool for this item. */
 		while ((start_in_dw=compute_memory_prealloc_chunk(pool,
 						item->size_in_dw)) == -1) {
 			int64_t need = item->size_in_dw+2048 -
@@ -323,6 +350,10 @@ void compute_memory_finalize_pending(struct compute_memory_pool* pool,
 						pool->size_in_dw + need);
 			}
 		}
+		COMPUTE_DBG("  + Found space for Item %p id = %u "
+			"start_in_dw = %u (%u bytes) size_in_dw = %u (%u bytes)\n",
+			item, item->id, start_in_dw, start_in_dw * 4,
+			item->size_in_dw, item->size_in_dw * 4);
 
 		item->start_in_dw = start_in_dw;
 		item->next = NULL;
@@ -391,7 +422,8 @@ struct compute_memory_item* compute_memory_alloc(
 {
 	struct compute_memory_item *new_item;
 
-	COMPUTE_DBG("* compute_memory_alloc() size_in_dw = %ld\n", size_in_dw);
+	COMPUTE_DBG("* compute_memory_alloc() size_in_dw = %ld (%ld bytes)\n",
+			size_in_dw, 4 * size_in_dw);
 
 	new_item = (struct compute_memory_item *)
 				CALLOC(sizeof(struct compute_memory_item), 1);
@@ -413,6 +445,9 @@ struct compute_memory_item* compute_memory_alloc(
 		pool->item_list = new_item;
 	}
 
+	COMPUTE_DBG("  + Adding item %p id = %u size = %u (%u bytes)\n",
+			new_item, new_item->id, new_item->size_in_dw,
+			new_item->size_in_dw * 4);
 	return new_item;
 }
 
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index 122de16..2749b05 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -453,7 +453,7 @@ static void evergreen_launch_grid(
 {
 	struct r600_context *ctx = (struct r600_context *)ctx_;
 
-	COMPUTE_DBG("PC: %i\n", pc);
+	COMPUTE_DBG("*** evergreen_launch_grid: pc = %u\n", pc);
 
 	evergreen_compute_upload_input(ctx_, block_layout, grid_layout, input);
 	compute_emit_cs(ctx, block_layout, grid_layout);
@@ -815,12 +815,15 @@ void* r600_compute_global_transfer_map(
 	uint32_t* map;
 	///TODO: do it better, mapping is not possible if the pool is too big
 
+	COMPUTE_DBG("* r600_compute_global_transfer_map()\n");
+
 	if (!(map = ctx->ws->buffer_map(buffer->chunk->pool->bo->cs_buf,
 						ctx->cs, transfer->usage))) {
 		return NULL;
 	}
 
-	COMPUTE_DBG("buffer start: %lli\n", buffer->chunk->start_in_dw);
+	COMPUTE_DBG("Buffer: %p + %u (buffer offset in global memory) "
+		"+ %u (box.x)\n", map, buffer->chunk->start_in_dw, transfer->box.x);
 	return ((char*)(map + buffer->chunk->start_in_dw)) + transfer->box.x;
 }
 
@@ -835,6 +838,8 @@ void r600_compute_global_transfer_unmap(
 	struct r600_resource_global* buffer =
 		(struct r600_resource_global*)transfer->resource;
 
+	COMPUTE_DBG("* r600_compute_global_transfer_unmap()\n");
+
 	ctx->ws->buffer_unmap(buffer->chunk->pool->bo->cs_buf);
 }
 
@@ -854,6 +859,12 @@ struct pipe_transfer * r600_compute_global_get_transfer(
 	struct r600_context *rctx = (struct r600_context*)ctx_;
 	struct pipe_transfer *transfer = util_slab_alloc(&rctx->pool_transfers);
 
+	COMPUTE_DBG("* r600_compute_global_get_transfer()\n"
+			"level = %u, usage = %u, box(x = %u, y = %u, z = %u "
+			"width = %u, height = %u, depth = %u)\n", level, usage,
+			box->x, box->y, box->z, box->width, box->height,
+			box->depth);
+
 	transfer->resource = resource;
 	transfer->level = level;
 	transfer->usage = usage;
-- 
1.7.11.4



More information about the mesa-dev mailing list