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.stell...@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@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