--- src/gallium/drivers/r600/compute_memory_pool.c | 158 ++++++++++++------------- 1 file changed, 78 insertions(+), 80 deletions(-)
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c index 624b50d..26b9f98 100644 --- a/src/gallium/drivers/r600/compute_memory_pool.c +++ b/src/gallium/drivers/r600/compute_memory_pool.c @@ -43,6 +43,73 @@ #include <inttypes.h> #define ITEM_ALIGNMENT 1024 + +static inline void list_add_item_front(struct compute_memory_item **list, + struct compute_memory_item *item) +{ + if (*list != NULL) { + item->next = *list; + (*list)->prev = item; + } + else { + item->next = NULL; + } + + *list = item; + item->prev = NULL; +} + +static inline void list_add_item_tail(struct compute_memory_item **list, + struct compute_memory_item *item) +{ + struct compute_memory_item *last_item = NULL; + + if (*list != NULL) { + for (last_item = *list; last_item->next != NULL; last_item = last_item->next); + + last_item->next = item; + item->prev = last_item; + } + else { + *list = item; + item->prev = NULL; + } + + item->next = NULL; +} + +static inline void list_add_item_after(struct compute_memory_item **list, + struct compute_memory_item *item, struct compute_memory_item *pos) +{ + if (pos == NULL) { + list_add_item_front(list, item); + } + else { + if (pos->next != NULL) { + pos->next->prev = item; + } + + item->prev = pos; + item->next = pos->next; + pos->next = item; + } +} + +static inline void list_remove_item(struct compute_memory_item **list, + struct compute_memory_item *item) +{ + if (item->prev == NULL) { + *list = item->next; + } + else { + item->prev->next = item->next; + } + + if (item->next != NULL) { + item->next->prev = item->prev; + } +} + /** * Creates a new pool */ @@ -299,6 +366,7 @@ int compute_memory_promote_item(struct compute_memory_pool *pool, struct compute_memory_item *item, struct pipe_context *pipe, int64_t allocated) { + struct compute_memory_item *pos; int64_t start_in_dw; int err = 0; @@ -327,40 +395,12 @@ int compute_memory_promote_item(struct compute_memory_pool *pool, item->size_in_dw, item->size_in_dw * 4); /* Remove the item from the unallocated list */ - if (item->prev == NULL) - pool->unallocated_list = item->next; - else - item->prev->next = item->next; - - if (item->next != NULL) - item->next->prev = item->prev; + list_remove_item(&pool->unallocated_list, item); + /* Add it back to the item_list */ + pos = compute_memory_postalloc_chunk(pool, start_in_dw); + list_add_item_after(&pool->item_list, item, pos); item->start_in_dw = start_in_dw; - item->next = NULL; - item->prev = NULL; - - if (pool->item_list) { - struct compute_memory_item *pos; - - pos = compute_memory_postalloc_chunk(pool, start_in_dw); - if (pos) { - item->prev = pos; - item->next = pos->next; - pos->next = item; - if (item->next) { - item->next->prev = item; - } - } else { - /* Add item to the front of the list */ - item->next = pool->item_list; - item->prev = pool->item_list->prev; - pool->item_list->prev = item; - pool->item_list = item; - } - } - else { - pool->item_list = item; - } ((struct r600_context *)pipe)->b.b.resource_copy_region(pipe, (struct pipe_resource *)pool->bo, @@ -387,26 +427,11 @@ void compute_memory_demote_item(struct compute_memory_pool *pool, struct compute_memory_item *item, struct pipe_context *pipe) { /* First, we remove the item from the item_list */ - if (item->prev == NULL) - pool->item_list = item->next; - else - item->prev->next = item->next; - - if (item->next != NULL) - item->next->prev = item->prev; - + list_remove_item(&pool->item_list, item); /* Now we add it to the beginning of the unallocated list * NOTE: we could also add it to the end, but this is easier */ - item->next = NULL; - item->prev = NULL; - if (pool->unallocated_list) { - item->next = pool->unallocated_list; - item->next->prev = item; - pool->unallocated_list = item; - } - else - pool->unallocated_list = item; + list_add_item_front(&pool->unallocated_list, item); /* We check if the intermediate buffer exists, and if it * doesn't, we create it again */ @@ -438,16 +463,7 @@ void compute_memory_free(struct compute_memory_pool* pool, int64_t id) next = item->next; if (item->id == id) { - if (item->prev) { - item->prev->next = item->next; - } - else { - pool->item_list = item->next; - } - - if (item->next) { - item->next->prev = item->prev; - } + list_remove_item(&pool->item_list, item); if (item->real_buffer) { pool->screen->b.b.resource_destroy( @@ -465,16 +481,7 @@ void compute_memory_free(struct compute_memory_pool* pool, int64_t id) next = item->next; if (item->id == id) { - if (item->prev) { - item->prev->next = item->next; - } - else { - pool->unallocated_list = item->next; - } - - if (item->next) { - item->next->prev = item->prev; - } + list_remove_item(&pool->unallocated_list, item); if (item->real_buffer) { pool->screen->b.b.resource_destroy( @@ -501,7 +508,7 @@ struct compute_memory_item* compute_memory_alloc( struct compute_memory_pool* pool, int64_t size_in_dw) { - struct compute_memory_item *new_item = NULL, *last_item = NULL; + struct compute_memory_item *new_item = NULL; COMPUTE_DBG(pool->screen, "* compute_memory_alloc() size_in_dw = %ld (%ld bytes)\n", size_in_dw, 4 * size_in_dw); @@ -518,16 +525,7 @@ struct compute_memory_item* compute_memory_alloc( new_item->real_buffer = (struct r600_resource*)r600_compute_buffer_alloc_vram( pool->screen, size_in_dw * 4); - if (pool->unallocated_list) { - for (last_item = pool->unallocated_list; last_item->next; - last_item = last_item->next); - - last_item->next = new_item; - new_item->prev = last_item; - } - else { - pool->unallocated_list = new_item; - } + list_add_item_tail(&pool->unallocated_list, new_item); COMPUTE_DBG(pool->screen, " + Adding item %p id = %u size = %u (%u bytes)\n", new_item, new_item->id, new_item->size_in_dw, -- 2.0.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev