[Mesa-dev] [PATCH 4/9] r600g/compute: only move to the pool the buffers marked for promoting

Tom Stellard tom at stellard.net
Mon Jun 16 07:54:20 PDT 2014


On Fri, Jun 13, 2014 at 10:35:33PM +0200, Bruno Jiménez wrote:

Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

> ---
>  src/gallium/drivers/r600/compute_memory_pool.c | 140 +++++++++++++++----------
>  src/gallium/drivers/r600/compute_memory_pool.h |   5 +
>  2 files changed, 87 insertions(+), 58 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
> index 5a5ef12..1da4609 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -229,8 +229,6 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
>  	int64_t allocated = 0;
>  	int64_t unallocated = 0;
>  
> -	int64_t start_in_dw = 0;
> -
>  	int err = 0;
>  
>  	COMPUTE_DBG(pool->screen, "* compute_memory_finalize_pending()\n");
> @@ -247,10 +245,12 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
>  		allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
>  	}
>  
> -	/* Calculate the total unallocated size */
> +	/* Calculate the total unallocated size of the items that
> +	 * will be promoted to the pool */
>  	for (item = pool->unallocated_list; item; item = next) {
>  		next = item->next;
> -		unallocated += align(item->size_in_dw, ITEM_ALIGNMENT);
> +		if (item->status & ITEM_FOR_PROMOTING)
> +			unallocated += align(item->size_in_dw, ITEM_ALIGNMENT);
>  	}
>  
>  	/* If we require more space than the size of the pool, then grow the
> @@ -276,83 +276,107 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
>  			return -1;
>  	}
>  
> -	/* Loop through all the unallocated items, allocate space for them
> -	 * and add them to the item_list. */
> +	/* Loop through all the unallocated items, check if they are marked
> +	 * for promoting, 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. */
> -		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) {
> -				need = pool->size_in_dw / 10;
> -			}
> +		if (item->status & ITEM_FOR_PROMOTING) {
> +			err = compute_memory_promote_item(pool, item, pipe, allocated);
> +			item->status ^= ITEM_FOR_PROMOTING;
>  
> -			need = align(need, ITEM_ALIGNMENT);
> -
> -			err = compute_memory_grow_pool(pool,
> -					pipe,
> -					pool->size_in_dw + need);
> +			allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
>  
>  			if (err == -1)
>  				return -1;
>  		}
> -		COMPUTE_DBG(pool->screen, "  + Found space for Item %p id = %u "
> +	}
> +
> +	return 0;
> +}
> +
> +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;
> +	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) {
> +			need = pool->size_in_dw / 10;
> +		}
> +
> +		need = align(need, ITEM_ALIGNMENT);
> +
> +		err = compute_memory_grow_pool(pool,
> +				pipe,
> +				pool->size_in_dw + need);
> +
> +		if (err == -1)
> +			return -1;
> +	}
> +	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,
>  			item->size_in_dw, item->size_in_dw * 4);
>  
> -		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;
> +	/* 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;
> +
> +	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 {
> +		} 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,
> -				0, item->start_in_dw * 4, 0 ,0,
> -				(struct pipe_resource *)item->real_buffer,
> -				0, &(struct pipe_box) {.width = item->size_in_dw * 4,
> -				.height = 1, .depth = 1});
> +	((struct r600_context *)pipe)->b.b.resource_copy_region(pipe,
> +		(struct pipe_resource *)pool->bo,
> +		0, item->start_in_dw * 4, 0 ,0,
> +		(struct pipe_resource *)item->real_buffer,
> +		0, &(struct pipe_box) {.width = item->size_in_dw * 4,
> +		.height = 1, .depth = 1});
>  
> -		pool->screen->b.b.resource_destroy(
> +	pool->screen->b.b.resource_destroy(
>  			(struct pipe_screen *)pool->screen,
>  			(struct pipe_resource *)item->real_buffer);
> -		item->real_buffer = NULL;
> -
> -		allocated += item->size_in_dw;
> -	}
> -
> -	pool->unallocated_list = NULL;
> +	item->real_buffer = NULL;
>  
>  	return 0;
>  }
>  
> -
>  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 2cb9985..6a45fb2 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.h
> +++ b/src/gallium/drivers/r600/compute_memory_pool.h
> @@ -80,6 +80,11 @@ void compute_memory_shadow(struct compute_memory_pool* pool,
>  
>  int compute_memory_finalize_pending(struct compute_memory_pool* pool,
>  	struct pipe_context * pipe);
> +
> +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_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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list