On Fri, Jun 13, 2014 at 10:35:35PM +0200, Bruno Jiménez wrote:
> This function will be used when we want to map an item
> that it's already in the pool.
> ---
>  src/gallium/drivers/r600/compute_memory_pool.c | 45 
> ++++++++++++++++++++++++++
>  src/gallium/drivers/r600/compute_memory_pool.h |  3 ++
>  2 files changed, 48 insertions(+)
> 
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c 
> b/src/gallium/drivers/r600/compute_memory_pool.c
> index e1f9c88..624b50d 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -383,6 +383,51 @@ int compute_memory_promote_item(struct 
> compute_memory_pool *pool,
>       return 0;
>  }
>  
> +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;
> +
> +
> +     /* 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;
> +
> +     /* We check if the intermediate buffer exists, and if it
> +      * doesn't, we create it again */
> +     if (item->real_buffer == NULL) {
> +             item->real_buffer = (struct 
> r600_resource*)r600_compute_buffer_alloc_vram(
> +                             pool->screen, item->size_in_dw * 4);
> +     }
> +
> +     /* We transfer the memory from the item in the pool to the
> +      * temporary buffer */
> +     ((struct r600_context *)pipe)->b.b.resource_copy_region(pipe,
> +             (struct pipe_resource *)item->real_buffer,
> +             0, 0, 0, 0,
> +             (struct pipe_resource *)pool->bo,
> +             0, &(struct pipe_box) { .x = item->start_in_dw * 4,
> +             .width = item->size_in_dw * 4, .height = 1, .depth = 1});

Could you use temporary variables, so we don't need so many casts.

> +
> +     /* Remember to mark the buffer as 'pending' by setting start_in_dw to 
> -1 */
> +     item->start_in_dw = -1;
> +}
> +
>  void compute_memory_free(struct compute_memory_pool* pool, int64_t id)
>  {
>       struct compute_memory_item *item, *next;
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.h 
> b/src/gallium/drivers/r600/compute_memory_pool.h
> index 6a45fb2..1eb60da 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.h
> +++ b/src/gallium/drivers/r600/compute_memory_pool.h
> @@ -85,6 +85,9 @@ int compute_memory_promote_item(struct compute_memory_pool 
> *pool,
>               struct compute_memory_item *item, struct pipe_context *pipe,
>               int64_t allocated);
>  
> +void compute_memory_demote_item(struct compute_memory_pool *pool,
> +     struct compute_memory_item *item, struct pipe_context *pipe);
> +
>  void compute_memory_free(struct compute_memory_pool* pool, int64_t id);
>  struct compute_memory_item* compute_memory_alloc(struct compute_memory_pool* 
> pool, int64_t size_in_dw); ///Creates pending allocations
>  
> -- 
> 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