[Mesa-dev] [PATCH 5/9] r600g/compute: avoid problems when promoting items mapped for reading

Bruno Jiménez brunojimen at gmail.com
Fri Jun 13 13:35:34 PDT 2014


Acording to the OpenCL spec, it is possible to have a buffer mapped
for reading and at read from it using commands or buffers.

With this we can keep the mapping (that exists against the
temporary item) and read with a kernel (from the item we have
just added to the pool) without problems.
---
 src/gallium/drivers/r600/compute_memory_pool.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 1da4609..e1f9c88 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -369,10 +369,16 @@ int compute_memory_promote_item(struct compute_memory_pool *pool,
 		0, &(struct pipe_box) {.width = item->size_in_dw * 4,
 		.height = 1, .depth = 1});
 
-	pool->screen->b.b.resource_destroy(
-			(struct pipe_screen *)pool->screen,
-			(struct pipe_resource *)item->real_buffer);
-	item->real_buffer = NULL;
+	/* We check if the item is mapped for reading.
+	 * 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)) {
+		pool->screen->b.b.resource_destroy(
+				(struct pipe_screen *)pool->screen,
+				(struct pipe_resource *)item->real_buffer);
+		item->real_buffer = NULL;
+	}
 
 	return 0;
 }
-- 
2.0.0



More information about the mesa-dev mailing list