summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.c46
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.h2
2 files changed, 12 insertions, 36 deletions
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 75a8bd30dd7..04aaac92a4a 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -239,6 +239,7 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
int64_t allocated = 0;
int64_t unallocated = 0;
+ int64_t last_pos;
int err = 0;
@@ -276,14 +277,18 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
return -1;
}
+ /* After defragmenting the pool, allocated is equal to the first available
+ * position for new items in the pool */
+ last_pos = allocated;
+
/* Loop through all the unallocated items, check if they are marked
* for promoting, allocate space for them and add them to the item_list. */
LIST_FOR_EACH_ENTRY_SAFE(item, next, pool->unallocated_list, link) {
if (item->status & ITEM_FOR_PROMOTING) {
- err = compute_memory_promote_item(pool, item, pipe, allocated);
- item->status ^= ITEM_FOR_PROMOTING;
+ err = compute_memory_promote_item(pool, item, pipe, last_pos);
+ item->status &= ~ITEM_FOR_PROMOTING;
- allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
+ last_pos += align(item->size_in_dw, ITEM_ALIGNMENT);
if (err == -1)
return -1;
@@ -321,42 +326,14 @@ void compute_memory_defrag(struct compute_memory_pool *pool,
int compute_memory_promote_item(struct compute_memory_pool *pool,
struct compute_memory_item *item, struct pipe_context *pipe,
- int64_t allocated)
+ int64_t start_in_dw)
{
struct pipe_screen *screen = (struct pipe_screen *)pool->screen;
struct r600_context *rctx = (struct r600_context *)pipe;
struct pipe_resource *src = (struct pipe_resource *)item->real_buffer;
- struct pipe_resource *dst = NULL;
+ struct pipe_resource *dst = (struct pipe_resource *)pool->bo;
struct pipe_box box;
- struct list_head *pos;
- int64_t start_in_dw;
- int err = 0;
-
-
- /* Search for free space in the pool for this item. */
- while ((start_in_dw=compute_memory_prealloc_chunk(pool,
- item->size_in_dw)) == -1) {
- int64_t need = item->size_in_dw + 2048 -
- (pool->size_in_dw - allocated);
-
- if (need <= 0) {
- /* There's enough free space, but it's too
- * fragmented. Assume half of the item can fit
- * int the last chunk */
- need = (item->size_in_dw / 2) + ITEM_ALIGNMENT;
- }
-
- need = align(need, ITEM_ALIGNMENT);
-
- err = compute_memory_grow_pool(pool,
- pipe,
- pool->size_in_dw + need);
-
- if (err == -1)
- return -1;
- }
- dst = (struct pipe_resource *)pool->bo;
COMPUTE_DBG(pool->screen, " + Found space for Item %p id = %u "
"start_in_dw = %u (%u bytes) size_in_dw = %u (%u bytes)\n",
item, item->id, start_in_dw, start_in_dw * 4,
@@ -366,8 +343,7 @@ int compute_memory_promote_item(struct compute_memory_pool *pool,
list_del(&item->link);
/* Add it back to the item_list */
- pos = compute_memory_postalloc_chunk(pool, start_in_dw);
- list_add(&item->link, pos);
+ list_addtail(&item->link, pool->item_list);
item->start_in_dw = start_in_dw;
if (src != NULL) {
diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
index acc68ea172f..5a1b33bab28 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.h
+++ b/src/gallium/drivers/r600/compute_memory_pool.h
@@ -95,7 +95,7 @@ void compute_memory_defrag(struct compute_memory_pool *pool,
int compute_memory_promote_item(struct compute_memory_pool *pool,
struct compute_memory_item *item, struct pipe_context *pipe,
- int64_t allocated);
+ int64_t start_in_dw);
void compute_memory_demote_item(struct compute_memory_pool *pool,
struct compute_memory_item *item, struct pipe_context *pipe);