From 0b8c29915ba9451e57b256a3c7e0abb986739937 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bruno=20Jim=C3=A9nez?= Date: Wed, 18 Jun 2014 17:01:56 +0200 Subject: [PATCH] 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 --- 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 5b1ee148b59..f232f9fbc4f 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; } -- 2.30.2