r600g/compute: Avoid problems when promoting items mapped for reading
authorBruno Jiménez <brunojimen@gmail.com>
Wed, 18 Jun 2014 15:01:56 +0000 (17:01 +0200)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 20 Jun 2014 17:44:00 +0000 (13:44 -0400)
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@amd.com>
src/gallium/drivers/r600/compute_memory_pool.c

index 5b1ee148b59b2bf2a2a58d9cd1278ced3555b1ec..f232f9fbc4fcf2ca286364f21c29f235a4a78ee5 100644 (file)
@@ -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;
 }