[Mesa-dev] [PATCH] r600g/compute: Try to use a temporary resource when growing the pool

Tom Stellard tom at stellard.net
Thu Jul 10 08:20:57 PDT 2014


On Mon, Jul 07, 2014 at 05:50:05PM +0200, Bruno Jiménez wrote:
> Now, before moving everything to host memory, we try to create a
> new resource to use as a pool. I we succeed we just use this resource
> and delete the previous one. If we fail we fallback to using the
> shadow.
> 
> This should make growing the pool faster, and we can also save
> 64KB of memory that were allocated for the 'shadow', even if they
> weren't used.

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

> ---
>  src/gallium/drivers/r600/compute_memory_pool.c | 61 ++++++++++++++++++--------
>  1 file changed, 43 insertions(+), 18 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
> index fe19d9e..db6d937 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -73,10 +73,6 @@ static void compute_memory_pool_init(struct compute_memory_pool * pool,
>  	COMPUTE_DBG(pool->screen, "* compute_memory_pool_init() initial_size_in_dw = %ld\n",
>  		initial_size_in_dw);
>  
> -	pool->shadow = (uint32_t*)CALLOC(initial_size_in_dw, 4);
> -	if (pool->shadow == NULL)
> -		return;
> -
>  	pool->size_in_dw = initial_size_in_dw;
>  	pool->bo = (struct r600_resource*)r600_compute_buffer_alloc_vram(pool->screen,
>  							pool->size_in_dw * 4);
> @@ -184,27 +180,56 @@ int compute_memory_grow_pool(struct compute_memory_pool* pool,
>  
>  	if (!pool->bo) {
>  		compute_memory_pool_init(pool, MAX2(new_size_in_dw, 1024 * 16));
> -		if (pool->shadow == NULL)
> -			return -1;
>  	} else {
> +		struct r600_resource *temp = NULL;
> +
>  		new_size_in_dw = align(new_size_in_dw, ITEM_ALIGNMENT);
>  
>  		COMPUTE_DBG(pool->screen, "  Aligned size = %d (%d bytes)\n",
>  			new_size_in_dw, new_size_in_dw * 4);
>  
> -		compute_memory_shadow(pool, pipe, 1);
> -		pool->shadow = realloc(pool->shadow, new_size_in_dw*4);
> -		if (pool->shadow == NULL)
> -			return -1;
> +		temp = (struct r600_resource *)r600_compute_buffer_alloc_vram(
> +							pool->screen, new_size_in_dw * 4);
>  
> -		pool->size_in_dw = new_size_in_dw;
> -		pool->screen->b.b.resource_destroy(
> -			(struct pipe_screen *)pool->screen,
> -			(struct pipe_resource *)pool->bo);
> -		pool->bo = (struct r600_resource*)r600_compute_buffer_alloc_vram(
> -							pool->screen,
> -							pool->size_in_dw * 4);
> -		compute_memory_shadow(pool, pipe, 0);
> +		if (temp != NULL) {
> +			struct r600_context *rctx = (struct r600_context *)pipe;
> +			struct pipe_resource *src = (struct pipe_resource *)pool->bo;
> +			struct pipe_resource *dst = (struct pipe_resource *)temp;
> +			struct pipe_box box;
> +
> +			COMPUTE_DBG(pool->screen, "  Growing the pool using a temporary resource\n");
> +
> +			u_box_1d(0, pool->size_in_dw * 4, &box);
> +
> +			rctx->b.b.resource_copy_region(pipe,
> +					dst, 0, 0, 0 ,0,
> +					src, 0, &box);
> +
> +			pool->screen->b.b.resource_destroy(
> +					(struct pipe_screen *)pool->screen,
> +					src);
> +
> +			pool->bo = temp;
> +			pool->size_in_dw = new_size_in_dw;
> +		}
> +		else {
> +			COMPUTE_DBG(pool->screen, "  The creation of the temporary resource failed\n"
> +				"  Falling back to using 'shadow'\n");
> +
> +			compute_memory_shadow(pool, pipe, 1);
> +			pool->shadow = realloc(pool->shadow, new_size_in_dw * 4);
> +			if (pool->shadow == NULL)
> +				return -1;
> +
> +			pool->size_in_dw = new_size_in_dw;
> +			pool->screen->b.b.resource_destroy(
> +					(struct pipe_screen *)pool->screen,
> +					(struct pipe_resource *)pool->bo);
> +			pool->bo = (struct r600_resource*)r600_compute_buffer_alloc_vram(
> +					pool->screen,
> +					pool->size_in_dw * 4);
> +			compute_memory_shadow(pool, pipe, 0);
> +		}
>  	}
>  
>  	return 0;
> -- 
> 2.0.1
> 
> _______________________________________________
> 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