On Fri, Jun 13, 2014 at 10:35:37PM +0200, Bruno Jiménez wrote:
> ---
>  src/gallium/drivers/r600/compute_memory_pool.c | 158 
> ++++++++++++-------------
>  1 file changed, 78 insertions(+), 80 deletions(-)
> 

There are double linked list helper functions in gallium util, which we
should use rather than writing our own.  See auxiliary/util/u_double_list.h

I would recommend leaving these wrappers, but replacing the implementation
with the gallium helpers.  Then when you are done, you can remove any wrappers
which map 1 to 1 to a gallium helper.

-Tom

> 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
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to