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;
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);
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;
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);