From: Bruno Jiménez Date: Wed, 18 Jun 2014 15:01:53 +0000 (+0200) Subject: r600g/compute: Add statuses to the compute_memory_items X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e3dfe3f7b2323428d68851341f541944a89d1783;p=mesa.git r600g/compute: Add statuses to the compute_memory_items These statuses will help track whether the items are mapped or if they should be promoted to or demoted from the pool v2: Use the new is_item_in_pool util function, as suggested by Tom Stellard Reviewed-by: Tom Stellard --- diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h index d8201c4659f..cd93a199bbb 100644 --- a/src/gallium/drivers/r600/compute_memory_pool.h +++ b/src/gallium/drivers/r600/compute_memory_pool.h @@ -27,13 +27,18 @@ #include +#define ITEM_MAPPED_FOR_READING (1<<0) +#define ITEM_MAPPED_FOR_WRITING (1<<1) +#define ITEM_FOR_PROMOTING (1<<2) +#define ITEM_FOR_DEMOTING (1<<3) + struct compute_memory_pool; struct compute_memory_item { int64_t id; ///ID of the memory chunk - int untouched; ///True if the memory contains only junk, no need to save it for defrag + uint32_t status; ///Will track the status of the item int64_t start_in_dw; ///Start pointer in dwords relative in the pool bo int64_t size_in_dw; ///Size of the chunk in dwords diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index c152e54146a..8657071e4c6 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -659,6 +659,15 @@ static void evergreen_set_global_binding( return; } + /* We mark these items for promotion to the pool if they + * aren't already there */ + for (int i = 0; i < n; i++) { + struct compute_memory_item *item = buffers[i]->chunk; + + if (!is_item_in_pool(item)) + buffers[i]->chunk->status |= ITEM_FOR_PROMOTING; + } + compute_memory_finalize_pending(pool, ctx_); for (int i = 0; i < n; i++) @@ -969,6 +978,9 @@ void *r600_compute_global_transfer_map( offset += (buffer->chunk->start_in_dw * 4); } + if (usage & PIPE_TRANSFER_READ) + buffer->chunk->status |= ITEM_MAPPED_FOR_READING; + COMPUTE_DBG(rctx->screen, "* r600_compute_global_transfer_map()\n" "level = %u, usage = %u, box(x = %u, y = %u, z = %u " "width = %u, height = %u, depth = %u)\n", level, usage,