On Fri, Jun 13, 2014 at 10:35:32PM +0200, Bruno Jiménez wrote:
> Now we will have a list with the items that are in the pool
> (item_list) and the items that are outside it (unallocated_list)

Reviewed-by: Tom Stellard <thomas.stell...@amd.com>

> ---
>  src/gallium/drivers/r600/compute_memory_pool.c | 99 
> +++++++++++++-------------
>  src/gallium/drivers/r600/compute_memory_pool.h |  1 +
>  2 files changed, 49 insertions(+), 51 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c 
> b/src/gallium/drivers/r600/compute_memory_pool.c
> index 94ddcde..5a5ef12 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -108,13 +108,11 @@ int64_t compute_memory_prealloc_chunk(
>               size_in_dw);
>  
>       for (item = pool->item_list; item; item = item->next) {
> -             if (item->start_in_dw > -1) {
> -                     if (last_end + size_in_dw <= item->start_in_dw) {
> -                             return last_end;
> -                     }
> -
> -                     last_end = item->start_in_dw + align(item->size_in_dw, 
> ITEM_ALIGNMENT);
> +             if (last_end + size_in_dw <= item->start_in_dw) {
> +                     return last_end;
>               }
> +
> +             last_end = item->start_in_dw + align(item->size_in_dw, 
> ITEM_ALIGNMENT);
>       }
>  
>       if (pool->size_in_dw - last_end < size_in_dw) {
> @@ -226,7 +224,6 @@ void compute_memory_shadow(struct compute_memory_pool* 
> pool,
>  int compute_memory_finalize_pending(struct compute_memory_pool* pool,
>       struct pipe_context * pipe)
>  {
> -     struct compute_memory_item *pending_list = NULL, *end_p = NULL;
>       struct compute_memory_item *item, *next;
>  
>       int64_t allocated = 0;
> @@ -244,45 +241,16 @@ int compute_memory_finalize_pending(struct 
> compute_memory_pool* pool,
>                       item->size_in_dw, item->size_in_dw * 4);
>       }
>  
> -     /* Search through the list of memory items in the pool */
> +     /* Calculate the total allocated size */
>       for (item = pool->item_list; item; item = next) {
>               next = item->next;
> +             allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
> +     }
>  
> -             /* Check if the item is pending. */
> -             if (item->start_in_dw == -1) {
> -                     /* It is pending, so add it to the pending_list... */
> -                     if (end_p) {
> -                             end_p->next = item;
> -                     }
> -                     else {
> -                             pending_list = item;
> -                     }
> -
> -                     /* ... and then remove it from the item list. */
> -                     if (item->prev) {
> -                             item->prev->next = next;
> -                     }
> -                     else {
> -                             pool->item_list = next;
> -                     }
> -
> -                     if (next) {
> -                             next->prev = item->prev;
> -                     }
> -
> -                     /* This sequence makes the item be at the end of the 
> list */
> -                     item->prev = end_p;
> -                     item->next = NULL;
> -                     end_p = item;
> -
> -                     /* Update the amount of space we will need to allocate. 
> */
> -                     unallocated += item->size_in_dw+1024;
> -             }
> -             else {
> -                     /* The item is not pending, so update the amount of 
> space
> -                      * that has already been allocated. */
> -                     allocated += item->size_in_dw;
> -             }
> +     /* Calculate the total unallocated size */
> +     for (item = pool->unallocated_list; item; item = next) {
> +             next = item->next;
> +             unallocated += align(item->size_in_dw, ITEM_ALIGNMENT);
>       }
>  
>       /* If we require more space than the size of the pool, then grow the
> @@ -302,15 +270,15 @@ int compute_memory_finalize_pending(struct 
> compute_memory_pool* pool,
>        * In this case, there are 300 units of free space in the pool, but
>        * they aren't contiguous, so it will be impossible to allocate Item D.
>        */
> -     if (pool->size_in_dw < allocated+unallocated) {
> -             err = compute_memory_grow_pool(pool, pipe, 
> allocated+unallocated);
> +     if (pool->size_in_dw < allocated + unallocated) {
> +             err = compute_memory_grow_pool(pool, pipe, allocated + 
> unallocated);
>               if (err == -1)
>                       return -1;
>       }
>  
> -     /* Loop through all the pending items, allocate space for them and
> -      * add them back to the item_list. */
> -     for (item = pending_list; item; item = next) {
> +     /* Loop through all the unallocated items, allocate space for them
> +      * and add them to the item_list. */
> +     for (item = pool->unallocated_list; item; item = next) {
>               next = item->next;
>  
>               /* Search for free space in the pool for this item. */
> @@ -379,6 +347,8 @@ int compute_memory_finalize_pending(struct 
> compute_memory_pool* pool,
>               allocated += item->size_in_dw;
>       }
>  
> +     pool->unallocated_list = NULL;
> +
>       return 0;
>  }
>  
> @@ -416,6 +386,33 @@ void compute_memory_free(struct compute_memory_pool* 
> pool, int64_t id)
>               }
>       }
>  
> +     for (item = pool->unallocated_list; item; item = next) {
> +             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;
> +                     }
> +
> +                     if (item->real_buffer) {
> +                             pool->screen->b.b.resource_destroy(
> +                                             (struct pipe_screen 
> *)pool->screen,
> +                                             (struct pipe_resource 
> *)item->real_buffer);
> +                     }
> +
> +                     free(item);
> +
> +                     return;
> +             }
> +     }
> +
>       fprintf(stderr, "Internal error, invalid id %"PRIi64" "
>               "for compute_memory_free\n", id);
>  
> @@ -446,15 +443,15 @@ 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->item_list) {
> -             for (last_item = pool->item_list; last_item->next;
> +     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->item_list = new_item;
> +             pool->unallocated_list = new_item;
>       }
>  
>       COMPUTE_DBG(pool->screen, "  + Adding item %p id = %u size = %u (%u 
> bytes)\n",
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.h 
> b/src/gallium/drivers/r600/compute_memory_pool.h
> index 166093d..2cb9985 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.h
> +++ b/src/gallium/drivers/r600/compute_memory_pool.h
> @@ -58,6 +58,7 @@ struct compute_memory_pool
>  
>       struct r600_resource *bo; ///The pool buffer object resource
>       struct compute_memory_item* item_list; ///Allocated memory chunks in 
> the buffer,they must be ordered by "start_in_dw"
> +     struct compute_memory_item* unallocated_list; ///Unallocated memory 
> chunks
>       struct r600_screen *screen;
>  
>       uint32_t *shadow; ///host copy of the pool, used for defragmentation
> -- 
> 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