Mesa (master): r600g/compute: Avoid problems when promoting items mapped for reading

Tom Stellard tstellar at kemper.freedesktop.org
Fri Jun 20 17:49:54 UTC 2014


Module: Mesa
Branch: master
Commit: 0b8c29915ba9451e57b256a3c7e0abb986739937
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0b8c29915ba9451e57b256a3c7e0abb986739937

Author: Bruno Jiménez <brunojimen at gmail.com>
Date:   Wed Jun 18 17:01:56 2014 +0200

r600g/compute: Avoid problems when promoting items mapped for reading

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.

Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

---

 src/gallium/drivers/r600/compute_memory_pool.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 5b1ee14..f232f9f 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -375,10 +375,14 @@ int compute_memory_promote_item(struct compute_memory_pool *pool,
 			dst, 0, item->start_in_dw * 4, 0 ,0,
 			src, 0, &box);
 
-	pool->screen->b.b.resource_destroy(
-			screen, src);
-
-	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(screen, src);
+		item->real_buffer = NULL;
+	}
 
 	return 0;
 }




More information about the mesa-commit mailing list