diff options
-rw-r--r-- | src/gallium/drivers/r600/compute_memory_pool.c | 31 | ||||
-rw-r--r-- | src/gallium/drivers/r600/evergreen_compute.c | 17 |
2 files changed, 28 insertions, 20 deletions
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c index 9cb16f8c29e..fe19d9ef81c 100644 --- a/src/gallium/drivers/r600/compute_memory_pool.c +++ b/src/gallium/drivers/r600/compute_memory_pool.c @@ -353,19 +353,21 @@ int compute_memory_promote_item(struct compute_memory_pool *pool, list_add(&item->link, pos); item->start_in_dw = start_in_dw; - u_box_1d(0, item->size_in_dw * 4, &box); - - rctx->b.b.resource_copy_region(pipe, - dst, 0, item->start_in_dw * 4, 0 ,0, - src, 0, &box); - - /* 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; + if (src != NULL) { + u_box_1d(0, item->size_in_dw * 4, &box); + + rctx->b.b.resource_copy_region(pipe, + dst, 0, item->start_in_dw * 4, 0 ,0, + src, 0, &box); + + /* 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; @@ -475,8 +477,7 @@ struct compute_memory_item* compute_memory_alloc( new_item->start_in_dw = -1; /* mark pending */ new_item->id = pool->next_id++; new_item->pool = pool; - new_item->real_buffer = (struct r600_resource*)r600_compute_buffer_alloc_vram( - pool->screen, size_in_dw * 4); + new_item->real_buffer = NULL; list_addtail(&new_item->link, pool->unallocated_list); diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index 5c115dcb282..12e9c85586d 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -970,14 +970,21 @@ void *r600_compute_global_transfer_map( struct r600_resource_global* buffer = (struct r600_resource_global*)resource; - struct pipe_resource *dst; + struct compute_memory_item *item = buffer->chunk; + struct pipe_resource *dst = NULL; unsigned offset = box->x; - if (is_item_in_pool(buffer->chunk)) { - compute_memory_demote_item(pool, buffer->chunk, ctx_); + if (is_item_in_pool(item)) { + compute_memory_demote_item(pool, item, ctx_); + } + else { + if (item->real_buffer == NULL) { + item->real_buffer = (struct r600_resource*) + r600_compute_buffer_alloc_vram(pool->screen, item->size_in_dw * 4); + } } - dst = (struct pipe_resource*)buffer->chunk->real_buffer; + dst = (struct pipe_resource*)item->real_buffer; if (usage & PIPE_TRANSFER_READ) buffer->chunk->status |= ITEM_MAPPED_FOR_READING; @@ -988,7 +995,7 @@ void *r600_compute_global_transfer_map( box->x, box->y, box->z, box->width, box->height, box->depth); COMPUTE_DBG(rctx->screen, "Buffer id = %u offset = " - "%u (box.x)\n", buffer->chunk->id, box->x); + "%u (box.x)\n", item->id, box->x); assert(resource->target == PIPE_BUFFER); |